我已阅读(参见此处)在Linux下的故障信号处理程序(例如处理时)使用backtrace()打印堆栈跟踪的"常见做法" SIGSEGV是:
1 从未记录的结构中获取指令指针(EIP或RIP)sigcontext.
2用指令指针替换堆栈轨迹中的第2帧,因为第一帧是信号处理程序,第2帧应该libc在sigaction代码中,它覆盖了发生故障的原始帧.
3从新更换的第2帧开始打印回溯.
在我的测试中(在x86_642.6内核上),实际上发生故障的原始帧存在于backtrace()第3帧中给出的堆栈跟踪中 - 第一个是信号处理程序,第二个是libc信号处理代码.
内核信号处理的这种变化是否记录在某个地方,您可以参考我?
在我看来,结果是你可以避免从指令指针替换任何帧,并从第backtrace()3帧开始打印堆栈跟踪,但我想确认这是已知的行为和正确的方法.