gpt4 book ai didi

linux - 获取子进程的段错误回溯

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:02 26 4
gpt4 key购买 nike

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

最佳答案

They are different programs,B is not a fork of A. A launches B

“启动”,我想你的意思是 Afork而 child 确实execvpB

I cannot modify source code of B program.

这意味着您拥有 B 的来源,但不能修改它,但可以-g重新编译它, -O0和其他类似 -fno-omit-frame-pointer 的东西获取调试符号并更有可能获得更准确的堆栈回溯。

但是,另一种解释方式是您只有 B作为二进制可执行文件,没有它的源代码。

我还推断您 A 的来源[并且可以做任何必要的事情来使事情正常进行]。

Question: can I get backtrace of segmentation fault of B from A?

是的。有几种不同的方法。

A可以使用ptrace调用时 B就像gdbstrace会做。当B段错误,A可以获得控制权并返回堆栈并将其打印出来。

但是,这引出了一个问题:您的主要目标是 [只是] 调试 B ?拥有 A 可能更容易做一个fork/execgdb B而不仅仅是 B ,所以 gdb可以做“繁重的工作”,因为堆栈回溯很简单 gdb命令。更简单的方法是允许 B通过在 shell 命令中启用限制并使用 gdb 检查核心文件来转储核心之后。

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

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

现在,当B段错误,您特殊共享库中的信号处理程序可以通过 __builtin_return_address 返回堆栈等。阿尔。并将结果反馈给A (通过管道或 socket )

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

关于linux - 获取子进程的段错误回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36969106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com