gdb fork () exec для Linux - PullRequest
       2

gdb fork () exec для Linux

1 голос
/ 15 марта 2012

Я нашел похожий вопрос на этом сайте, но решение не работает для меня.В моем main () у меня есть

if (fork () == 0) execl (программа b, args);

Я устанавливаю пару точек останова в каждом начале.Затем я использую «set follow-fork-mode» и запускаю.

После fork gdb подключается к дочернему процессу, показывая «Присоединение после fork к дочернему процессу 29730».Но у меня больше не будет возможности устанавливать точки останова в программе b, хотя у меня 15 секунд сна в программе b.Выполняется до конца или перерыва.

Как установить точку останова в программе b?

Спасибо!

1 Ответ

3 голосов
/ 15 марта 2012

Но у меня больше не будет возможности устанавливать точки останова в программе b

Хитрость заключается в том, чтобы установить точку останова в дочернем элементе как задержанную точку останова.Когда дочерний элемент execl() d, GDB установит в нем точку останова.Пример:

// a.c
#include <unistd.h>

int main()
{
  if (0 == fork()) execl("./b.out", "b.out", (char*)0);
  return 0;
}


// b.c
int foo() { return 0; }

int main() { return foo(); }


gcc -g a.c; gcc -g b.c -o b.out


gdb -nx -q ./a.out
Reading symbols from /tmp/a.out...done.
(gdb) b foo
Function "foo" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (foo) pending.

Точка останова находится на рассмотрении, поскольку foo() в a.out (* b.out) foo().

(gdb) set follow-fork-mode child
(gdb) run
Starting program: /tmp/a.out 
[New process 18759]
process 18759 is executing new program: /tmp/b.out
[Switching to process 18759]

Breakpoint 1, foo () at b.c:1
1   int foo() { return 0; }
(gdb) bt
#0  foo () at b.c:1
#1  0x00000000004004dd in main () at b.c:3
(gdb) quit
нет.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...