我有一个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,child或ask.
要遵循父级(这是默认值),请使用:
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分离.
除了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);| 归档时间: |
|
| 查看次数: |
6698 次 |
| 最近记录: |