在Ubuntu上调试ARMv7的core文件

1 在Ubuntu上调试ARMv7的core文件

1.1 预备

  1. uname -a: 获得目前嵌入式系统

     Linux (none) 3.8.11-xilinx #40 SMP PREEMPT Thu Jan 12 17:02:11 CST 2023 armv7l GNU/Linux
    
  2. 安装armv7的交叉编译工具链:

    sudo apt-get udpate
    sudo apt-get install gcc-arm-linux-gnueabihf gdb-multiarch
    
    • gcc-arm-linux-gnueabihf: 用于在Ubuntu上编译适用于ARMv7架构的程序,是一种交叉编译器;
    • gdb-multiarch: 支持多种架构的GDB版本,可以用来调试ARMv7程序;

    安装gcc-arm-linux-gnueabihf之后,相关的文件在如下目录(记为D)中:

    • /usr/local/ti-sdk-am335x-evm/linux-devkit/sysroots/i686-arago-linux/usr/bin/

    将ARMv7下的可执行文件和core dump文件拷贝到D文件夹下

    D文件夹下没有arm-linux-gnueabihf-gdb文件,可以使用gdb-multiarch替代.

    为方便gdb调试时使用set solib-search-path设置库文件,可以将可执行文件所需要引用的库文件也一同放在D目录下,不过建议还是统一放到一个固定的地方,方便调试,如:创建如下~/crash/项目名/bug编号/目录,之后在该目录下存放以下文件:

    • 可执行文件: 最好是debug版本,执行该文件产生了如下的core dump文件;
    • core: 即core dump文件
    • library: 该可执行文件依赖的库文件

    而将对应的ARMv7的系统库文件可以放在/opt/下,如:

    • /opt/arm_lib: 该文件夹下存放ARMv7系统/lib下的系统库文件和C运行库;
    • /opt/arm_usr_lib: 该文件夹下存放ARMv7系统/usr/lib下的用户级运行库;

    以上这3个文件夹,当使用gdb-multiarch调试时,需要使用set solib-search-path来设置,以上3个文件夹,使用:隔开;

  3. 获取ARMv7上的系统库文件

    分别为ARM系统下的/lib/usr/lib这两个文件夹的内容

  • /lib: 包含基本系统程序使用的共享库文件,例如: C库, 内核模块等

  • /usr/lib: 包含用户级应用程序使用的库文件

    并将该库存放到当前ubuntu下的/opt/下,如/opt/arm_lib/opt/arm_usr_lib

  1. 将Arm下运行的可执行文件所依赖的库,存放到指定位置,如/opt/arcs/librarys/

    gdb-multiarch调试时,需要使用set solib-search-path来设置所引用库的全部文件;

1.2 直接在非ARM的主机上调试ARM下生成的core文件

  1. sudo gdb-mulitarch ./ARCS ./core
  2. set solib-search-path /opt/arm_lib/:/opt/arm_usr_libs/:Libraries/:Libraries/log4cpp/:Libraries/sqlite/: 设置so的库文件搜索路径, 注意这里的Libraries/:Libraries/log4cpp/:Libraries/sqlite/这三个文件夹是当前可执行文件所需要使用的库文件,且都存放在/usr/local/ti-sdk-am335x-evm/linux-devkit/sysroots/i686-arago-linux/usr/bin/
  3. (gdb) set sysroot /opt/arm_lib: 设置root目录,并回车之后,就会开始加载有符号文件的动态库;之后,就可以运行bt查看崩溃堆栈信息;
  4. bt: 查看堆栈信息
  5. i sharedlibrary: 查看哪些动态库有符号文件;
  6. f num: 切换堆栈层;
  7. l: 查看相关代码;

1.3 注意事项

  1. 产生core文件的可执行文件,最好使用debug版本,这样可以更好的进行排查问题;
  2. 最好将可执行文件,core文件,当前可执行文件所依赖的本地库文件放到同一个文件夹下,方便gdb-mutliarch进行set solib-search-path设置;
  3. 若执行以上的2.操作之后,没有分析堆栈信息,可以使用set sysroot /opt/arm_lib来强制分析;
posted @ 2024-07-10 17:40  绍荣  阅读(5)  评论(0编辑  收藏  举报