Linux下用gdb定位Qt程序异常崩溃位置(systemd-coredump)

文章介绍了如何在Linux中启用systemd-coredump服务,以便在程序崩溃时保存内存数据到core文件中。通过修改ulimit设置允许生成core文件,并在/etc/security/limits.conf中做永久修改。使用gdb结合core文件可以定位程序崩溃的具体位置,特别是在Qt程序中,通过添加调试信息,能更有效地进行故障排查。
摘要由CSDN通过智能技术生成

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, 就可以看到导致问题出现的原因了

 

异常信号标识如下图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值