Linux捕获程序崩溃异常 |
您所在的位置:网站首页 › linux安装oracle11g需要注意什么 › Linux捕获程序崩溃异常 |
在进行Linux平台的qt程序开发时,出现程序崩溃退出的情况,而且没有什么信息(ˉ▽ˉ;)…。 bing了一下发现一个可以定位崩溃位置的工具qbreakpad,这里记录一下qbreakpad的安装过程。 qbreakpad的安装过程 ¶源码准备 ¶下载Breakpad源码下载地址 建议选择tags=v2021.08.09 ¶下载LSS源码下载地址 需要注意,如果您的gcc版本高于9.0,在构建breakpad时可能会报错: linux\_syscall\_support.h: error: listing the stack pointer register 'rsp' in a clobber list is deprecated 解决:更换修正版lss 下载地址 ¶下载qBreakpad源码下载地址 ¶编译qBreakpad下载qBreakpad源码,在qBreakpad/third_party目录下,把下载好的LSS源码和Breakpad源码放入其中;修改文件夹名为lss和breakpad; 用qtcreator打开qBreakpad.pro,直接构建; 构建成功后,会在qBreakpad/handler 目录下生成libqBreakpad.a文件,保存目录下的头文件QBreakpadHandler.h、QBreakpadHttpUploader.h、singletone/call_once.h、singletone/singleton.h。 ¶调用qBreakpad在自己的qt工程(qbreakpadTest)下新建qBreakpad目录,将libqBreakpad.a拷贝至,qBreakpad\lib\目录下; 将调用库所需的头文件QBreakpadHandler.h、QBreakpadHttpUploader.h、call_once.h、singleton.h共4个文件拷贝至qBreakpad\include下。 在qbreakTest.pro下增加以下内容: 1234567891011121314151617181920############ for qBreakpad ############# qBreakpad中需要使用到network模块QT += network# 启用多线程、异常、RTTI、STL支持CONFIG += thread exceptions rtti stl# without c++11 & AppKit library compiler can't solve address for symbolsCONFIG += c++11macx: LIBS += -framework AppKit# 配置头文件搜索路径和链接库路径unix:!macx: LIBS += -L$$PWD/qBreakpad/lib/ -lqBreakpadINCLUDEPATH += $$PWD/qBreakpad/includeDEPENDPATH += $$PWD/qBreakpad/includeunix:!macx: PRE_TARGETDEPS += $$PWD/qBreakpad/lib/libqBreakpad.a############ for qBreakpad ############在main.cpp中添加 QBreakpadInstance.setDumpPath("crashes"); // 设置生成dump文件路径 崩溃示例: 12345void qBreakpadTest::on_pushButton_clicked(){ QLabel * label = nullptr; label->setText("crash");}编译,运行程序,生成的dump文件存放在Debug/crashes目录下。 ¶编译breakpadBreakpad提供了两个工具dump_syms和minidump_stackwalk,用于分析dump,定位bug。 下载Breakpad源码,将LSS(linux-syscall-support)源码拷贝至breakpad\src\third_party目录下,并重命名为lss; 12345cd breakpadchmod 755 configure./configuresudo makesudo make install编译完成后,在breakpad/src/tools/linux/dump_syms目录下,生成了dump_syms; 在breakpad/src/processor目录下,生成了minidump_stackwalk。 ¶使用dump_syms和minidump_stackwalk定位bug ¶1、生成符号文件使用dump_syms读取带调试信息的程序文件,并生成符号文件qBreakpadTest.sym。 1dump_syms ./qBreakpadTest > qBreakpadTest.sym ¶2、将符号文件移动到特定路径在自己的qt工程(qBreakpadTest)所在目录下,创建目录结构: 第一级目录,固定为symbols; 第二级目录,为即将放入的符号文件名称,如qBreakpadTest.sym,则目录名为qBreakpadTest; 第三级目录,在sym文件中第一行内容,有一串16进制编号,将其作为目录名。建立好以上路径后,将qBreakpadTest.sym移动到此路径下。 ¶3、生成崩溃处调用堆栈信息将crashes目录拷贝到和symbols目录一个级别目录下; 然后执行如下命令,生成调用堆栈信息: 1minidump_stackwalk ./crashes/7211c8b8-126d-4de2-7f8f00a4-db86eecc.dmp ./symbols > error.log第一个参数,是dump文件名; 第二个参数,固定为./symbols,应该是指定符号文件位于当前symbols目录下默认路径位置; 第三个参数,将命令执行结果,写入到error.log文件中。 查看生成的堆栈调用信息文件error.log,找到“crashed”字样,与它最近的一行,就是发生崩溃时,程序的调用堆栈。 ¶4、dump文件上报将生成的dump文件上传到指定的服务器。 先通过setDumpPath设置dump文件生成目录;以便在发生崩溃时,自动在该目录下生成dump文件。 再通过setUploadUrl设置上报地址,以便后续将dump文件,上传到该地址。 最后,通过sendDumps将dump文件发送至服务器。该函数会自动遍历,前面设置的dump生成目录,将每一个dump文件进行发送。上报演示程序,位于qBreakpad\demo\reporter下。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |