QtCreator远程调试及qBreakpad Dump分析
1、QtCreator远程连接Linux开发板调试
GCC: arm-poky-linux-gnueabi-g++ (GCC) 5.3.0
开发板:arm-poky-linux-gnueabi-gcc
ubuntu: /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++
GDB:GNU gdb (GDB) 7.10.1
开发板:gdbserver --version
目录:/usr/arm-poky-linux-gnueabi/bin
ubuntu: /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gdb
- 通过Tools->Options->Device,在QtCreator中新增remote device
- 选择新增Debugger
配置的GDB工具路径:
/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gdb
-
QtVersion和Compliers配置与原Cross2.0配置相同
-
新增编译Kit: SSH-Cross2.0
Device选择之前新增的RemoteDevice, Complier选择Cross2.0, Debugger选择之前新增的
- 为项目配置SSH-Cross2.0 ,Build部分与之前的Cross2.0配置相同
-
在项目.pro文件下新增配置:
target.path += /opt/Raise3D
INSTALLS += target
配置代表程序远程推送的目录,可以看到pro中配置的目录就是RemoteDirectory,程序编译后会推送到此目录运行。
- 配置自定义步骤
-
QtCreator是通过SFTP上传文件的,有些系统可能不支持,可以换用scp上传。亲测我们的主机可以支持SFTP上传,反而scp上传需要配置密码,比较麻烦。
-
关于一些报错可以参考:(54条消息) 飞凌Imx6ull开发板Qt远程调试_imx6ull qt_Just810的博客-CSDN博客
- Run:
Debug:
待补充
2、使用qBreakpad生成并分析Dump文件
请至钉钉文档查看附件《breakpad-2021.08.09.zip》
不同的平台都可以使用dump分析程序异常问题,在Qt上可以使用qBreakpad生成dump文件,qBreakpad是基于breakpad开发的,breakpad是Google的开源项目。
编译qBreadkpad需要依赖breakpad和lss
编译Tips:
-
最好选择上述版本,三个库版本不一致可能会编译失败
-
最好在Linux下直接下载或解压,在windows打开后会导致脚本文件格式不一致问题
-
编译breadpad最好升级系统GCC到7.0+版本,实测5.5.0编译失败,如果失败了可直接使用云盘中已经编译好的
编译步骤:
-
创建qBreadk目录,将三个库放在同一目录下,重命名为breadkpad / lss /qBreakpad
-
拷贝breadkpad和lss到 qBreakpad->third_party目录下
-
QtCreator打开qBreadkpad项目,其下面有三个子项目
-
配置qBreadkpad编译套件,使用Cross2.0,因为最后需要加到MXCUI中,需要与开发板环境一致。最后一一编译三个子项目,如有出错,请检查编译环境和breadpad版本。
编译结果
- 最后在qBreakpad->handler->singleton目录下会生成.a文件和头文件
- 在mxc-public-common中加入
-
配置.pro文件
LIBS += -L$$PWD/…/…/mxc-public-com/qBreakpad/ -lqBreakpad
INCLUDEPATH += “…/…/mxc-public-com/qBreakpad/include”
代码中配置qBreakpad
#define QBEAKPAD_DUMP_DIR (applicationPath+"/qBeakpadDump")
#include <QBreakpadHandler.h>
#include <QBreakpadHttpUploader.h>
int main(int argc, char *argv[])
{
QBreakpadInstance.setDumpPath(QBEAKPAD_DUMP_DIR); //设置dump生成的路径
}
程序异常后可以在此目录查看到dmp日志
编译breakpad
分析dump文件需要用到breakpad提供的工具 ,我们打开之前的breadpad库,执行
cd breakpad
./configure 或者 bash ./configure
sudo make -j12
breadkpad可能会因系统环境造成编译失败,可以直接使用编译好的程序。
编译完成之后,执行:
sudo make install
会将生成的程序安装在系统目录,主要是:
-
在breakpad/src/tools/linux/dump_syms目录下,生成了dump_syms
-
在breakpad/src/processor目录下,生成了minidump_stackwalk
使用dump_syms和minidump_stackwalk定位bug
直接解析dmp文件只能看到函数的地址信息,看不到函数名,这样可读性很差,配合sym文件来解析dmp可以定位到函数名及其行号。
1、dump_syms提取程序的符号信息
我们以MXCUI程序为例,生成的可执行程序在pack-bin4411/MXCUI, 首先需要为MXCUI程序生成函数信息文件
,dump_syms不仅可以为程序生成函数信息,还可以为动态库生成。
cd xxx/mxc-mxcui/pack-bin4411
dump_syms MXCUI > MXCUI.sym
在mxc-mxcui目录下新建symbols目录,再新建MXCUI目录,层级结构为:
-
第一级目录,固定为symbols
-
第二级目录,为即将放入的符号文件名称,如MXCUI.sym,则目录名为MXCUI;
-
第三级目录,在sym文件中第一行内容,有一串16进制编号,将其作为目录名。
最终的层级结构如下:
生成函数信息:
./dump_syms libbreakpad-core.so > libbreakpad-core.so.sym
2、minidump_stackwalk生成函数栈和crash信息
将开发板的dump文件上传到本地,执行:
minidump_stackwalk 2210e229-20a6-4edd-2a041caa-0fb09c7c.dmp ./symbols > mxcui_error.log
具体格式为:
-
minidump_stackwalk xxx.dump路径 /xxx/xx/symbools路径 > xxx_error.log
-
mxcui_error.log生成在当前所处目录
3、log分析
-
log中显示crash最近的函数,一般就是程序崩溃的地方
-
log无法显示函数名和代码行数,可能原因:
-
sym文件路径不正确
-
breakpad和程序调用的版本不匹配
-
建议使用Debug模式编译程序
-
编辑器开启了神秘优化
-