可以使用 libSegFault.so 获取 SIGABRT 的回溯吗? [英] Can one use libSegFault.so to get backtraces for SIGABRT?
问题描述
魔法咒语
LD_PRELOAD=/lib/libSegFault.so someapp
使用 libSegFault.so 运行 someapp
,提供关于 SIGSEGV 的回溯信息,如 很多 不同 地方.
runs someapp
with libSegFault.so providing backtrace information on a SIGSEGV as described in many different places.
除了使用类似 signal(7)
的方法来导致 SIGABRT
调用 SIGSEGV
处理程序之外,还有什么方法可以获取 libSegFault为 assert(3)
失败提供回溯信息?
Other than using signal(7)
-like approaches to cause SIGABRT
to invoke the SIGSEGV
handler, is there some way to get libSegFault to provide backtrace information for assert(3)
failures?
推荐答案
env SEGFAULT_SIGNALS="abrt segv" LD_PRELOAD=/lib/libSegFault.so someapp
请注意,预加载库的实际路径可能不同.在我的机器上,我会使用
Note that the actual path to the preload library may differ. On my machine, I'd use
env SEGFAULT_SIGNALS="abrt segv" LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so some-64bit-app
或
env SEGFAULT_SIGNALS="abrt segv" LD_PRELOAD=/lib/i386-linux-gnu/libSegFault.so some-32bit-app
取决于我运行的应用程序是 64 位还是 32 位编译的.(可以使用file
来检查.)
depending whether the application I was running was compiled 64-bit or 32-bit. (You can use file
to check.)
来源 告诉我们有三个环境变量定义了 libSegFault.so
的行为方式:
The source tells us there are three environment variables that define how libSegFault.so
behaves:
SEGFAULT_SIGNALS
:导致堆栈跟踪的信号列表.默认值为SIGSEGV
.已定义但为空的SEGFAULT_SIGNALS
意味着没有信号会导致堆栈跟踪.系统上支持的值为segv
、ill
、abrt
、fpe
、bus
具有 SIGBUS 信号的系统,具有 SIGSTKFLT 信号的系统上的stkflt
以及所有这些的all
.
SEGFAULT_SIGNALS
: The list of signals that cause a stack trace. The default isSIGSEGV
. A defined but emptySEGFAULT_SIGNALS
means no signals cause a stack trace. The supported values aresegv
,ill
,abrt
,fpe
,bus
on systems that have the SIGBUS signal,stkflt
on systems that have the SIGSTKFLT signal, andall
for all of these.
SEGFAULT_USE_ALTSTACK
:如果在环境中定义,libSegFault.so
使用替代堆栈作为堆栈跟踪信号.如果您正在调试堆栈损坏,这可能会派上用场.
SEGFAULT_USE_ALTSTACK
: If defined in the environment, libSegFault.so
uses an altenate stack for the stack trace signals.
This may come in handy if you are debugging stack corruption.
SEGFAULT_OUTPUT_NAME
:如果在环境中定义,堆栈跟踪将写入此文件而不是标准错误.
SEGFAULT_OUTPUT_NAME
: If defined in the environment, the stack trace is written to this file instead of standard error.
说实话,我最初是通过使用 strings/lib/libSegFault.so | 检查库来发现这些的.sed -e '/[^0-9A-Z_]/d'
.所有标准库(libSegFault.so
已成为 GNU C 库的一部分)都可以通过环境变量进行调整,因此使用类似该命令的命令来转储任何看起来像环境变量名称的字符串是一种快速的方法找到要搜索的东西.在 "SEGFAULT_SIGNALS" "SEGFAULT_OUTPUT_NAME"
上进行网络搜索会产生许多有用的链接;看到它现在是 GNU C 库的一部分,我去了 source git 存档,找到了库的实际源文件,并发布了我的答案.
To be honest, I found these initially by examining the library with strings /lib/libSegFault.so | sed -e '/[^0-9A-Z_]/ d'
. All standard libraries (libSegFault.so
having become a part of GNU C library) are tunable via environment variables, so using something like that command to dump any strings that look like environment variable names is a quick way to find stuff to search for. Doing a web search on "SEGFAULT_SIGNALS" "SEGFAULT_OUTPUT_NAME"
produces a number of useful links; seeing that it was part of the GNU C library nowadays, I went to the source git archives, found the actual source file for the library, and posted my answer.
这篇关于可以使用 libSegFault.so 获取 SIGABRT 的回溯吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!