【发布时间】:2018-11-12 20:53:20
【问题描述】:
我需要在程序崩溃的地方(SIGSEGV)旁边打印内存,但事实是,当我尝试打印此内存时,我又会被称为 SIGSEGV。
void handler_SIGSEGV(int signal, siginfo_t *data, void *extra_data) {
for (size_t* mem = (size_t*) (data->si_addr - 5); mem < (size_t*) (data->si_addr + 5); mem++){
printf("%zx\n", *mem); // call new SIGSEGV
}
exit(1);
}
据我在处理程序内部的理解,我可以使用volatile sig_atomic_t 变量来指示信号已经被触发。
volatile sig_atomic_t isRecall = 0;
void handler_SIGSEGV(int signal, siginfo_t *data, void *extra_data) {
if (isRecall == 1){
//second call
}
printf("Call - %d\n", isRecall);
isRecall = 1;
....
但是当再次调用 SIGSEGV 信号时,我的函数 handler_SIGSEGV 由于某种原因没有被调用。
为什么会这样?以及如何实现这样的内存输出?
【问题讨论】:
标签: c linux signals handler segmentation-fault