Linux的systemd-coredump服务在程序崩溃时,会将内存中的数据保存到文件中,这些文件用调试工具来定位到程序崩溃的位置,默认路径为/var/lib/systemd/coredump/。
1、开启 coredump 功能
输入如下命令查看systemd-coredump服务是否开启
显示0,则表示系统默认的core文件大小为0不显示,这时需要ulimit命令修改大小 ,终端输入ulimit -c unlimited设置文件不做限制,注意不要在另起终端,因为ulimit命令设置后只对一个终端有效,另起终端需要重新设置。这个只是临时办法,也可以永久修改,更改
/etc/security/limits.conf 文件中的内容。
去掉 soft core 0 一行前面的注释 ,同时,将 0 改为 unlimited 或 某个数值(如 204800)。如下所示:
验证是否开启:终端输入 ulimit -c 命令。如下所示:
可以看出,coredump服务已经开启
2、用gdb定位崩溃位置
qt程序添加如下异常代码
void MainWindow::on_pushButton_2_clicked()
{
int *i = NULL;
*i = 10;
}
在pro里添加这两句话,表示在release程序里加入调试信息。
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
编译运行,并且触发崩溃,进入/var/lib/systemd/coredump/目录,可以看到出现了一个core文件,如果没有那就是在程序运行目录下胡core文件,如下图所示
打开终端输入 gdb ./exefile core,然后输入r 运行程序,然后重现崩溃的操作,然后输入bt, 就可以看到导致问题出现的原因了
异常信号标识如下图: