我想知道是否有一种方法可以在不依赖 FreeBSD 或 Linux 中的核心转储的情况下获取崩溃进程的回溯。
通常,为了获得正在运行的进程的回溯,我们在 FreeBSD 上运行 bstack PID_OF_PROCESS
,在 Linux 上运行 pstack PID_OF_PROCESS
。
但是一旦进程崩溃,我们需要依赖核心文件来获取回溯,如果我们想执行 bstack 或 pstack,我们也没有 PID。
有没有像内核 API 之类的方法来获取崩溃进程的回溯,而无需在核心文件上执行 gdb?
如果我需要提供有关查询的额外信息,请告诉我。
最佳答案
您可以在 gdb 下运行您的应用程序并制作一些宏,例如:循环中的“where”和“step”命令。在 SIGSEGV 之后,这个宏/脚本将停止,然后您应该能够看到程序的回溯。当然,捕捉有问题的情况可能需要很多时间。
您还可以修改内核以显示用户空间应用程序的整个回溯,但这需要一些内核 API 知识。
也许 valgrind 也可以用于此类调查?
也阅读 man gcc 关于 -fstack-protector 的内容。
顺便问一下 - 你为什么不想使用核心转储文件?
关于linux - 不依赖于特定于操作系统的核心转储的崩溃进程的回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52829240/