在Ubuntu上调试ARMv7的core文件
1 在Ubuntu上调试ARMv7的core文件
1.1 预备
-
uname -a
: 获得目前嵌入式系统Linux (none) 3.8.11-xilinx #40 SMP PREEMPT Thu Jan 12 17:02:11 CST 2023 armv7l GNU/Linux
-
安装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个文件夹,使用:
隔开; -
获取ARMv7上的系统库文件
分别为ARM系统下的
/lib
和/usr/lib
这两个文件夹的内容
-
/lib
: 包含基本系统程序使用的共享库文件,例如: C库, 内核模块等 -
/usr/lib
: 包含用户级应用程序使用的库文件并将该库存放到当前ubuntu下的
/opt/下
,如/opt/arm_lib
和/opt/arm_usr_lib
-
将Arm下运行的可执行文件所依赖的库,存放到指定位置,如
/opt/arcs/librarys/
当
gdb-multiarch
调试时,需要使用set solib-search-path
来设置所引用库的全部文件;
1.2 直接在非ARM的主机上调试ARM下生成的core文件
sudo gdb-mulitarch ./ARCS ./core
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/
下(gdb) set sysroot /opt/arm_lib
: 设置root目录,并回车之后,就会开始加载有符号文件的动态库;之后,就可以运行bt查看崩溃堆栈信息;bt
: 查看堆栈信息i sharedlibrary
: 查看哪些动态库有符号文件;f num
: 切换堆栈层;l
: 查看相关代码;
1.3 注意事项
- 产生core文件的可执行文件,最好使用debug版本,这样可以更好的进行排查问题;
- 最好将可执行文件,core文件,当前可执行文件所依赖的本地库文件放到同一个文件夹下,方便
gdb-mutliarch
进行set solib-search-path
设置; - 若执行以上的
2.
操作之后,没有分析堆栈信息,可以使用set sysroot /opt/arm_lib
来强制分析;