【发布时间】: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