可以使用libSegFault.so来获取SIGABRT的回溯吗?

Rhy*_*ich 27 glibc stack-trace backtrace segmentation-fault sigabrt

神奇的咒语

LD_PRELOAD=/lib/libSegFault.so someapp
Run Code Online (Sandbox Code Playgroud)

someapp与libSegFault.so一起运行,提供有关SIGSEGV的回溯信息,如许多 不同的 地方所述.

除了使用类似signal(7)方法来SIGABRT调用SIGSEGV处理程序之外,还有一些方法可以让libSegFault为assert(3)失败提供回溯信息吗?

Nom*_*mal 34

env SEGFAULT_SIGNALS="abrt segv" LD_PRELOAD=/lib/libSegFault.so someapp
Run Code Online (Sandbox Code Playgroud)

请注意,预加载库的实际路径可能不同.在我的机器上,我会用

env SEGFAULT_SIGNALS="abrt segv" LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so some-64bit-app
Run Code Online (Sandbox Code Playgroud)

要么

env SEGFAULT_SIGNALS="abrt segv" LD_PRELOAD=/lib/i386-linux-gnu/libSegFault.so some-32bit-app
Run Code Online (Sandbox Code Playgroud)

取决于我运行的应用程序是编译为64位还是32位.(你可以file用来检查.)


告诉我们有定义如何三个环境变量libSegFault.so的行为:

  • SEGFAULT_SIGNALS:导致堆栈跟踪的信号列表.默认是SIGSEGV.定义但空的SEGFAULT_SIGNALS意味着没有信号导致堆栈跟踪.支持的值是segv,ill,abrt,fpe,bus上有SIGBUS信号系统,stkflt对有SIGSTKFLT信号系统,以及all所有的这些.

  • SEGFAULT_USE_ALTSTACK:如果在环境中定义,则libSegFault.so使用altenate堆栈作为堆栈跟踪信号.如果您正在调试堆栈损坏,这可能会派上用场.

  • SEGFAULT_OUTPUT_NAME:如果在环境中定义,则堆栈跟踪将写入此文件而不是标准错误.

说实话,我最初是通过检查图书馆找到的strings /lib/libSegFault.so | sed -e '/[^0-9A-Z_]/ d'.所有标准库(libSegFault.so已经成为GNU C库的一部分)都可以通过环境变量进行调整,因此使用类似命令来转储任何看起来像环境变量名的字符串是查找要搜索的内容的快速方法.进行网络搜索"SEGFAULT_SIGNALS" "SEGFAULT_OUTPUT_NAME"会产生许多有用的链接; 看到它现在是GNU C库的一部分,我去了 git档案,找到了库的实际源文件,并发布了我的答案.