gpt4 book ai didi

c++ - 从段错误中恢复的最佳实践

转载 作者:可可西里 更新时间:2023-11-01 15:32:05 26 4
gpt4 key购买 nike

我正在研究用 C++ 编写的多线程进程,并且正在考虑使用 google-coredumper 修改 SIGSEGV 处理在发生段错误时使进程保持事件状态。

但是,这种 go​​ogle-coredumper 的使用似乎已经成熟,有机会陷入核心转储的无限循环,除非我以某种方式重新初始化线程和可能导致核心转储的对象。

在尝试通过核心转储使进程保持事件状态时,我应该牢记哪些最佳实践?我还应该注意哪些其他“陷阱”?

谢谢!

最佳答案

实际上在 C 中是可能的。您可以通过相当复杂的方式实现它:

1) 覆盖信号处理程序

2) 使用setjump()longjmp() 设置要跳回的地方,并实际跳回那里。

看看我写的这段代码(灵感来自 Peter Van Der Linden 的“Expert C Programming: Deep C Secrets”):

#include <signal.h>
#include <stdio.h>
#include <setjmp.h>

//Declaring global jmp_buf variable to be used by both main and signal handler
jmp_buf buf;


void magic_handler(int s)
{

switch(s)
{

case SIGSEGV:
printf("\nSegmentation fault signal caught! Attempting recovery..");
longjmp(buf, 1);
break;
}

printf("\nAfter switch. Won't be reached");

}



int main(void)
{

int *p = NULL;

signal(SIGSEGV, magic_handler);

if(!setjmp(buf))
{

//Trying to dereference a null pointer will cause a segmentation fault,
//which is handled by our magic_handler now.
*p=0xdead;

}
else
{
printf("\nSuccessfully recovered! Welcome back in main!!\n\n");
}



return 0;
}

关于c++ - 从段错误中恢复的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8401689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com