首页 > 解决方案 > 是否可以在 SIGSEGV 处理程序中暂停 C 程序以进行进一步调查?

问题描述

我目前正在准备我的应用程序以进行更多真实世界的测试,以捕捉所有超级罕见且难以重现的边缘情况。我已经安装了 SIGSEGV 处理程序,该处理程序将回溯打印到日志文件,但是它没有提供我想要获取的所有数据。

我希望我的程序在程序崩溃时停止执行(类似于发送 -STOP 信号),这样我就可以在 QtCreator 还活着的时候将它与 gdb 连接到它,并检查崩溃期间所有活动线程中的当前变量,跨越整个堆栈跟踪。

void MessFS_sigsegvHandler(int sig) {
  void *array[20];
  size_t size;

  size = backtrace(array, 20);
  MessLog_log(MESS_LOG_ERROR,MESS_LOG_ERROR, "[Core] Critical error: unexpected signal (%d):\n", sig);
  backtrace_symbols_fd(array, size, 1);
  exit(1);               // i would like to pause here instead of terminate
}

可能吗?如果是 - 是否可以将调试器附加到此类暂停的进程?

标签: cdebuggingexceptiongdbsignals

解决方案


我希望我的程序停止执行

您可以调用sleep()足够多的秒数来休眠。sleep()可以安全地用于信号处理程序。根据man signal-safety,它应该是 POSIX.1 的异步信号安全的。


推荐阅读