【问题标题】:Is it possible to pause C program inside SIGSEGV handler for further investigation?是否可以在 SIGSEGV 处理程序中暂停 C 程序以进行进一步调查?
【发布时间】:2021-01-19 21:59:43
【问题描述】:

我目前正在准备我的应用程序以进行更多真实世界的测试,以捕捉所有超级罕见且难以重现的边缘情况。我已经安装了 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
}

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

【问题讨论】:

  • 听起来您正在寻找核心转储 - 将进程的整个内存转储到可以使用 gdb 探索的文件中。网上有很多关于在 segfault 上启用核心转储的信息(不确定是否有处理程序会干扰)
  • 这是个好主意。我将它与pause() 结合起来,所以现在我正在调用pause(),另外在此之前我正准备在应用程序将被SIGABRT 杀死时生成coredump。它实际上是 FUSE 文件系统,所以我更喜欢暂停,以便能够观察使用文件系统的其他应用程序,这可能会导致失败(当 fs 暂停时,它们只会挂起,而如果它崩溃,它们将在收到 ENOTCONN 后继续运行
  • 您可能还想查看传递给 sigaction() 样式处理程序的第三个参数(sa_handler 类型),其中包含被中断进程的寄存器状态的副本。请参见“man sigaction”、“man setcontext”和 。使用 3 个参数声明您的 signal() 注册处理程序通常也提供访问权限。

标签: c debugging exception gdb signals


【解决方案1】:

我希望我的程序停止执行

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多