可以使用 libSegFault.so 获取 SIGABRT 的回溯吗? [英] Can one use libSegFault.so to get backtraces for SIGABRT?

查看:38
本文介绍了可以使用 libSegFault.so 获取 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 意味着没有信号会导致堆栈跟踪.系统上支持的值为 segvillabrtfpebus具有 SIGBUS 信号的系统,具有 SIGSTKFLT 信号的系统上的 stkflt 以及所有这些的 all.

  • SEGFAULT_SIGNALS: The list of signals that cause a stack trace. The default is SIGSEGV. A defined but empty SEGFAULT_SIGNALS means no signals cause a stack trace. The supported values are segv, ill, abrt, fpe, bus on systems that have the SIGBUS signal, stkflt on systems that have the SIGSTKFLT signal, and all 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆