linux - 不依赖于特定于操作系统的核心转储的崩溃进程的回溯

标签 linux linux-kernel core freebsd backtrace

我想知道是否有一种方法可以在不依赖 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/

相关文章:

linux - gcc 4.8.2 没有可识别的调试信息

c - Linux内核定时器函数传递自定义指针数据

linux - 从文件系统中查找路由器固件的 linux 内核版本

asynchronous - 使用 OCaml Async 并发写入

java - 文件核心为 131.63 MB;这超出了 GitHub 的文件大小限制 100.00 MB

c++ - 写一个日志收集器/阅读器,有什么好的设计吗?

android - 在 Nexus S 中插入可加载内核模块会重新启动它

Linux 命令行错误信息 : Temporary failure in name resolution

c - 错误: implicit declaration of function 'rdtscl' [-Werror=implicit-function-declaration] (but no error when running on older kernel version)

c++ - linux:有没有办法找出哪个进程生成了核心文件?