相关疑难解决方法(0)

故障期间的backtrace()函数(SIGSEGV)信号处理程序

我已阅读(参见此处)在Linux下的故障信号处理程序(例如处理时)使用backtrace()打印堆栈跟踪的"常见做法" SIGSEGV是:

1 从未记录的结构中获取指令指针(EIPRIP)sigcontext.

2用指令指针替换堆栈轨迹中的第2帧,因为第一帧是信号处理程序,第2帧应该libcsigaction代码中,它覆盖了发生故障的原始帧.

3从新更换的第2帧开始打印回溯.

在我的测试中(在x86_642.6内核上),实际上发生故障的原始帧存在于backtrace()第3帧中给出的堆栈跟踪中 - 第一个是信号处理程序,第二个是libc信号处理代码.

内核信号处理的这种变化是否记录在某个地方,您可以参考我?

在我看来,结果是你可以避免从指令指针替换任何帧,并从第backtrace()3帧开始打印堆栈跟踪,但我想确认这是已知的行为和正确的方法.

c linux stack-trace

2
推荐指数
1
解决办法
4272
查看次数

标签 统计

c ×1

linux ×1

stack-trace ×1