удаленная отладка GDB нескольких процессов - PullRequest
2 голосов
/ 01 октября 2011

Я не могу отладить дочерний процесс сеанса удаленной отладки. Я нашел похожий вопрос Как отладить точку входа процесса fork-exec в GDB?

Я следую той же процедуре, хотя и для удаленной цели. Поддерживается ли дочерний режим follow-frok для удаленных целей?

Ниже приведен пример кода ..

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <sys/types.h>
      4 #include <unistd.h>
      5
      6 int spawn (void)
      7 {
      8         pid_t child_pid;
      9         /* Duplicate this process. */
     10         child_pid = fork ();
     11         if (child_pid != 0)
     12                 /* This is the parent process. */
     13                 return child_pid;
     14         else {
     15                 /* Now execute PROGRAM, searching for it in the path. */
     16                 while(1)
     17                 {
     18                         static int i = 0;
     19                         if(i==0)         /* break here for child */
     20                         {
     21                                 printf("I am child\n");
     22                         }
     23                         else if(i==3)
     24                         {
     25                                 return 1;
     26                         }
     27                         else
     28                         {
     29                                 i = 0/0;
     30                         }
     31                         i++;
     32                 }
     33         }
     34         return 0;
     35 }
     36 int main ()
     37 {
     38         /* Spawn a child process running the .ls. command. Ignore the
     39            returned child process ID. */
     40         printf("Hello World..!!\n");
     41         spawn ();
     42         printf ("Bbye World..!!\n");
     43         return 0;
     44 }

Запустив его с помощью GDB, я могу установить точку останова в child ... все хорошо здесь. !!

sh-3.2# gdb fork
(gdb) set follow-fork-mode child
(gdb) set detach-on-fork off
(gdb) b 19
Breakpoint 1 at 0x80483d0: file fork-exec.c, line 19.
(gdb) c
The program is not being run.
(gdb) start
Breakpoint 2 at 0x8048437: file fork-exec.c, line 40.
Starting program: fork
main () at fork-exec.c:40
40              printf("Hello World..!!\n");
(gdb) c
Continuing.
Hello World..!!
[Switching to process 10649]

Breakpoint 1, spawn () at fork-exec.c:19
19                              if(i==0)         /* break here for child */
(gdb)

Однако, если я пытаюсь поймать ребенка через gdbserver, точка останова теряется ..

sh-3.2# gdbserver :1234 fork &
[5] 10686
sh-3.2# Process fork created; pid = 10689
Listening on port 1234

Запустить как целевой пульт

sh-3.2# gdb fork
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
Remote debugging from host 127.0.0.1
[New Thread 10689]
0x00bd2810 in _start () from /lib/ld-linux.so.2
(gdb) break 19
Breakpoint 1 at 0x80483d0: file fork-exec.c, line 19.
(gdb) c
Continuing.
Hello World..!!
Bbye World..!!

Child exited with retcode = 0

Program exited normally.

Child exited with status 0
GDBserver exiting

Какова процедура отладки дочернего процесса во встроенном мире. Я знаю, что могу сделать присоединение к процессу, но я хочу отлаживать с самого начала дочернего процесса ..

Ответы [ 2 ]

1 голос
/ 01 октября 2011

Это называется следом-форк.Нет, он не поддерживается в gdbserver.

0 голосов
/ 14 января 2014

В качестве (грязного!) Обходного пути вы можете просто добавить sleep() вызов сразу после fork() с задержкой, достаточной для того, чтобы вы могли получить дочерний PID, присоединить его к другому экземпляру gdbserver и подключиться к нему. с GDB.

...