1、addr2line工具使用(arm-linux-addr2line)
addr2line -e test 00400000
2、core文件调试方法:
(1)ulimit -c 查看是否开启了core文件功能(0表示未开启, ulimit -c unlimited开启, ulimit -c 0关闭)
(2)挂载或插入TF卡(生成的core文件一般比较大,可生成到nfs挂载目录,可使用haneWIN nfs服务器)
mount -t nfs 电脑ip:/c/public /mnt/nfs -o nolock,proto=tcp,nfsvers=3
(3)echo "/mnt/nfs/core-%e-%t" > /proc/sys/kernel/core_pattern //改变core文件名称和生成路径
(4)启动应用程序./test,等待崩溃生成core文件core-xxx
(5)./arm-linux-gdb test core-xxx //用gdb调试分析生成的core文件(或先gdb加载应用程序test,然后使用core-file core-xxx)
(6)在gdb下使用bt命令可查看程序崩溃时的堆栈信息(需要应用程序编译时加上-g选项,且未strip过,strip会去掉应用程序的调试信息)
(7)若还是无法显示地址信息,可能是崩溃在动态库中,此时需要设置动态库路径,在gdb下输入
set sysroot /data1/work/gdb/gdb_test //设置库搜索路径(将动态库和no-strip版应用程序test放到此文件目录下),再使用bt命令
(8)info threads -- 查看崩溃时刻的所有线程信息
(9)t ID -- 进入某线程查看堆栈信息(ID为上一步info threads中显示的ID,如t 1)
(10)f n -- 进入栈帧
注:gdb动态库搜索路径设置方法
1. set sysroot 与 set solib-absolute-prefix 是同一条命令,实际上,set sysroot是set solib-absolute-prefix 的别名。
2. set solib-search-path设置动态库的搜索路径,该命令可设置多个搜索路径,路径之间使用“:”隔开(在linux中为冒号,DOS和Win32中为分号)。
3. set solib-absolute-prefix 与 set solib-search-path 的区别:
总体上来说solib-absolute-prefix设置库的绝对路径前缀,只对绝对路径有效;而solib-search-path设置库的搜索路径,对绝对路径和相对路径均起作用。(编译器自动链接的so库多采用绝对路径)。
4. (gdb) info sharedlibrary #查看一下是不是所有的库都加载上了
5. (gdb) disassemble #反汇编调试
6. readelf -S test |grep debug 查看可执行文件/动态库的调试信息
7. file test.so 查看文件是否strip过