2015-11-19 2 views
1

Привет Я работаю над некоторыми упражнениями из Advanced Programming Unix System. Меня интересует, как работают и execlp Функциональные работы. Из текста автор указывает, что fork создает новый процесс. Он вызывается один раз - родителем, но возвращается дважды - в родительском и дочернем.Отладка неполноценного процесса

Так вилка возвращает неотрицательное PID к родителю и от 0 до ребенка. Я хотел бы пройти эту последовательность вызовов с помощью GDB, однако мои точки прерывания заставляют ребенка не запускать или прерывать системные вызовы, которые заставляют родителя прекращать работу.

1 - если я установил точку останова - else if (pid == 0) -> процесс не запускается.

2 - если я установил точку останова - execlp (buf, buf, (char *) 0);

Я, получаю следующее сообщение об ошибке:

waitpid ошибка: Прерванный системный вызов [Низший 1 (процесс 461) завершался с кодом 01]

Какие у меня есть варианты, чтобы установить в GDB для отладки родительского и дочернего? Где установить точки останова?

int main(int argc, char *argv[]) 
{ 
    char buf[MAXLINE]; 
    pid_t pid; 
    int status; 

    printf("%% "); 

    while(fgets(buf, MAXLINE, stdin) != NULL) 
    { 
     if(buf[strlen(buf) - 1] == '\n') 
      buf[strlen(buf) - 1] = 0; 
     if((pid = fork()) < 0) 
     { 
      err_sys("fork error"); 
     } 
     else if(pid == 0) 
     { 
      execlp(buf, buf, (char *)0); 
      err_ret("could'nt execute: %s", buf); 
      exit(127); 
     } 
     if((pid = waitpid(pid, &status, 0)) < 0) 
      err_sys("waitpid error"); 
     printf("%% "); 
    } 
    exit(0); 
} 

ответ

0

Вы можете найти помощь в документации GdB: https://sourceware.org/gdb/onlinedocs/gdb/Forks.html

Я думаю, что вы можете установить set detach-on-fork off проследить процесс ребенка, а также.

вы можете затем поставить точку останова на fork ГЭЭ и окончания вызова

здесь мой выход:

$ gdb ./a.out 
GNU gdb (GDB) 7.6-6.mga4 (Mageia release 4) 
Copyright (C) 2013 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-mageia-linux-gnu". 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>... 
Reading symbols from /tmp/a.out...done. 
(gdb) set detach-on-fork off 
(gdb) b fork 
Breakpoint 1 at 0x400710 
(gdb) r 
Starting program: /tmp/a.out 
% dddd 

Breakpoint 1, 0x00007ffff7ae0e04 in fork() from /lib64/libc.so.6 
Missing separate debuginfos, use: debuginfo-install glibc-2.18-9.11.mga4.x86_64 
(gdb) bt 
#0 0x00007ffff7ae0e04 in fork() from /lib64/libc.so.6 
#1 0x0000000000400880 in main (argc=1, argv=0x7fffffffdc38) at delme.c:19 
(gdb) info inferior 
    Num Description  Executable   
* 1 process 8272  /tmp/a.out   
(gdb) n 
Single stepping until exit from function fork, 
which has no line number information. 
[New process 8287] 
main (argc=1, argv=0x7fffffffdc38) at delme.c:23 
23    else if(pid == 0) 
Missing separate debuginfos, use: debuginfo-install glibc-2.18-9.11.mga4.x86_64 
(gdb) info inferior 
    Num Description  Executable   
    2 process 8287  /tmp/a.out   
* 1 process 8272  /tmp/a.out   
(gdb) p pid 
$1 = 8287 
(gdb) inferior 2 
[Switching to inferior 2 [process 8287] (/tmp/a.out)] 
[Switching to thread 2 (process 8287)] 
#0 0x00007ffff7ae0eac in fork() from /lib64/libc.so.6 
(gdb) n 
Single stepping until exit from function fork, 
which has no line number information. 
main (argc=1, argv=0x7fffffffdc38) at delme.c:23 
23    else if(pid == 0) 
(gdb) p pid 
$2 = 0 
+0

Благодаря OznOg ... ваше предложение отлично работает на моем Linux VM, однако он не работает, когда Я в среде OS X. Из документации я вижу следующее: «В большинстве систем gdb не имеет специальной поддержки для отладки программ, которые создают дополнительные процессы с использованием функции fork. Когда программа forks, gdb будет продолжать отлаживать родительский процесс, а дочерний процесс будет работать беспрепятственно Если вы установили точку останова в любом коде, который затем выполняет дочерний элемент, дочерний элемент получит сигнал SIGTRAP, который (если он не поймает сигнал) приведет к его завершению ». – dcrearer

+0

Добро пожаловать, грустно видеть, что он не работает на osX. – OznOg

Смежные вопросы