如何在C++上从分段故障中恢复



我有一些生产关键代码必须继续运行。

把代码想象成

while (true){
init();
do_important_things();  //segfault here
clean();
}

我不能相信代码是没有错误的,我需要能够记录问题以便稍后进行调查。

这一次,我知道代码中的某个地方出现了分段错误,我需要至少能够记录下来,然后重新开始。

阅读这里有几个解决方案,但每一个都是一场火焰战,声称解决方案实际上弊大于利,没有真正的解释。我也找到了这个答案,我考虑使用它,但我不确定它是否适合我的用例。

那么,在C++上从分段故障中恢复的最佳方法是什么呢?

我建议您创建一个非常安全的非常小的程序来监控有缺陷的程序。如果有缺陷的程序以您不喜欢的方式退出,请重新启动该程序。

Posix示例:

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <cstdio>
#include <iostream>
int main(int argc, char* argv[]) {
if(argc < 2) {
std::cerr << "USAGE: " << argv[0] << " program_to_monitor <arguments...>n";
return 1;
}
while(true) {
pid_t child = fork();          // create a child process
if(child == -1) {
std::perror("fork");
return 1;
}
if(child == 0) {
execvp(argv[1], argv + 1); // start the buggy program
perror(argv[1]);           // starting failed
std::exit(0);              // exit with 0 to not trigger a retry
}
// Wait for the buggy program to terminate and check the status
// to see if it should be restarted.
if(int wstatus; waitpid(child, &wstatus, 0) != -1) {
if(WIFEXITED(wstatus)) {
if(WEXITSTATUS(wstatus) == 0) return 0; // normal exit, terminate
std::cerr << argv[0] << ": " << argv[1] << " exited with "
<< WEXITSTATUS(wstatus) << 'n';
}
if(WIFSIGNALED(wstatus)) {
std::cerr << argv[0] << ": " << argv[1]
<< " terminated by signal " << WTERMSIG(wstatus);
if(WCOREDUMP(wstatus)) std::cout << " (core dumped)";
std::cout << 'n';
}
std::cout << argv[0] << ": Restarting " << argv[1] << 'n';
} else {
std::perror("wait");
break;
}
}
}

相关内容

  • 没有找到相关文章

最新更新