如何在GDB中调试fork-exec进程的入口点?

15 c linux gdb

我有一个C linux应用程序(A),它启动时产生另一个进程(P).当我想像往常一样调试PI start A并且我用ddd/gdb连接到P.

当我想调试P的入口点(主要的开始)时出现问题.如果我将调试器连接到P时遵循通常的方法已经很晚了.我发现的解决方案是在P的主要开头插入一个睡眠,所以我有时间与gdb连接,但这不是一个非常优雅的解决方案.

我也尝试过使用asm("int $3")它似乎不起作用.

你知道我怎么能解决这个问题吗?(最好不要改变A或P的代码)

Nat*_*man 19

您应该使用此选项:

set follow-fork-mode mode

模式是一个parent,childask.

要遵循父级(这是默认值),请使用:

set follow-fork-mode parent
Run Code Online (Sandbox Code Playgroud)

跟随孩子:

set follow-fork-mode child
Run Code Online (Sandbox Code Playgroud)

让调试器每次都问你:

set follow-fork-mode ask
Run Code Online (Sandbox Code Playgroud)

所以基本上你开始将gdb连接到A,然后设置gdb跟随子,然后当A生成P时,gdb将连接到P并从A分离.


uvs*_*tid 6

除了Nathan Fellman的答案之外,抓点也很方便,ig:

catch exec
Run Code Online (Sandbox Code Playgroud)

Catchpoint用作断点.每次检测到对exec()系统调用的调用时,GDB都会停止.这允许您break main在继续之前在任何新加载的可执行文件中设置任何断点(ig ).另一个catchpoint catch fork类似于fork()系统调用检测.

特别方便:

  • 当必须遵循父母和孩子时(set detach-on-fork off);
  • 当父进程分叉经常加载各种可执行文件时.