QtCreator远程调试及qBreakpad Dump分析

Posted by 卢小胖 on 2022-03-10
Estimated Reading Time 5 Minutes
Words 1.3k In Total
Viewed Times

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

  1. 通过Tools->Options->Device,在QtCreator中新增remote device

image

  1. 选择新增Debugger

image

配置的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

  1. QtVersion和Compliers配置与原Cross2.0配置相同

  2. 新增编译Kit: SSH-Cross2.0

image

Device选择之前新增的RemoteDevice, Complier选择Cross2.0, Debugger选择之前新增的

  1. 为项目配置SSH-Cross2.0 ,Build部分与之前的Cross2.0配置相同

image

  1. 在项目.pro文件下新增配置:

    target.path += /opt/Raise3D
    INSTALLS += target

配置代表程序远程推送的目录,可以看到pro中配置的目录就是RemoteDirectory,程序编译后会推送到此目录运行。

image

  1. 配置自定义步骤

image

  1. Run:

image

image

Debug:

待补充

2、使用qBreakpad生成并分析Dump文件

相关文件:

请至钉钉文档查看附件《breakpad-2021.08.09.zip》

请至钉钉文档查看附件《lss.tar.gz》

请至钉钉文档查看附件《breakpad.tar.gz》

不同的平台都可以使用dump分析程序异常问题,在Qt上可以使用qBreakpad生成dump文件,qBreakpad是基于breakpad开发的,breakpad是Google的开源项目。

编译qBreadkpad需要依赖breakpad和lss

image

image

image

编译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版本。

image

编译结果

  • 最后在qBreakpad->handler->singleton目录下会生成.a文件和头文件

image

  • 在mxc-public-common中加入

image

  • 配置.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进制编号,将其作为目录名。

image

最终的层级结构如下:

image

生成函数信息:

./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模式编译程序

    • 编辑器开启了神秘优化

image