2012-03-15 2 views
1

Я нашел подобный вопрос на этом сайте, но решение не работает для меня. В моей основной(), у меня естьgdb fork() exec на Linux

if (fork() == 0) execl (program b, args);

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

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

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

Спасибо!

+0

Поскольку программа b является режимом выпуска, не может отлаживаться? – PasteBT

+0

Я отлаживал их все вместе. – SSD

ответ

3

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

Хитрость заключается в том, чтобы установить контрольную точку в ребенке как отсроченная точка останова. Когда ребенку будет 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. 

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

(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 
+0

Кажется, что это работает. Я добавил функцию donothing() в программу b, имя является эксклюзивным. Тогда – SSD

+0

Кажется, что это работает. Я добавил функцию donothing() в программу b, имя является эксклюзивным. Установив точку останова в donothing, gdb покажет информацию о контрольной точке в ожидании. Но gdb не остановился в этот момент. Я предполагаю, что, возможно, программы являются оболочкой кода ATL COM, или наша система сборки имеет ошибки. Мы используем Nant mono release/debug build. – SSD

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