【发布时间】:2011-08-15 19:11:41
【问题描述】:
我已阅读 (see here) 在 Linux 下的故障信号处理程序期间(例如,在处理 SIGSEGV 时)使用 backtrace() 打印堆栈跟踪的“常见做法”是:
1 从未记录的sigcontext 结构中获取指令指针(EIP 或RIP)。
2 将堆栈跟踪中的第二帧替换为指令指针,因为第一帧是信号处理程序,并且第二帧应该在sigaction 代码中的libc 内,它已经覆盖了原来的发生故障的帧。
3 从新替换的第二帧开始打印回溯。
在我的测试中(在x86_64 2.6 内核上),在我看来,实际上发生故障的原始帧存在于第三帧中backtrace() 给出的堆栈跟踪中 - 第一个是信号处理程序,第二个在libc 信号处理代码中。
内核信号处理的这种变化是否记录在您可以参考的地方?
在我看来,结果是您可以避免替换指令指针中的任何帧,而只需从第 3 帧开始打印来自 backtrace() 的堆栈跟踪,但我想确认这是已知行为并且是正确的方法。
【问题讨论】:
标签: c linux stack-trace