获取子进程的

时间:2016-05-01 16:37:14

标签: linux segmentation-fault backtrace

我有两个程序:AB。它们是不同的程序,B不是A的分支。 A启动B。问题:我可以从B获取A的分段错误的回溯吗?我无法修改B程序的源代码。

1 个答案:

答案 0 :(得分:1)

  

它们是不同的程序,B不是A的分支.A启动B

通过“发布”,我认为你的意思是A执行fork而孩子执行execvp B

  

我无法修改B程序的源代码。

这意味着您拥有 B的来源,但不能修改它,但可以使用{重新编译它{1}},-g以及-O0之类的其他内容可以获得调试符号,更有可能获得更准确的堆栈追溯。

然而,解释这一点的另一种方法是你只有-fno-omit-frame-pointer作为二进制可执行文件并且有源代码。

我还推断你拥有<{1}}的来源[并且可以做任何必要的事情来使事情有效]。

  

问题:我可以从A中获得B的分段故障的回溯吗?

是。有几种不同的方式。

B在调用A时可以使用A,就像ptraceB一样。当gdb段错误时,strace可以控制并返回堆栈并将其打印出来。

但是,这引出了一个问题:你的主要目标是[仅]调试B吗?让A B A代替fork/exec而不仅仅是gdb B可能更容易,因此B可以作为堆栈执行“繁重的工作” traceback是一个简单的gdb命令。更简单的方法是允许gdb通过在shell命令中启用限制并在之后使用B检查核心文件来转储核心。

另一种可能的选择。使用gdb查看B中的符号以及readelf所需的共享库列表。然后,您可以决定ldd是否有任何“挂钩”点。也就是说,它想要从共享库调用的任何符号,例如B

您可以在其中创建一个包含open的特殊共享库,然后通过设置环境变量openB上“强制”它。然后,当LD_PRELOAD调用B时,您的共享库会获得控制权。然后,您可以为open安装信号处理程序,然后使用SIGSEGV获取“真实”的地址,并完成dlsym调用。

现在,当open段错误时,特殊共享库中的信号处理程序可以通过B et返回堆栈。人。并将结果传回__builtin_return_address(通过管道或套接字)

另一种方法是破解A可执行文件并添加一个与B

通信的方式的钩子