1.使用gdb调试,前一般需要打开coredump文件,并且编译加上-g。打开coredump的方法:配置生成core文件: ulimit -c unlimited
2.gdb运行,如果目标机上有,就在目标机上运行,目标机上没有,就将core文件拷贝下来,使用使用编译工具链的gdb运行
/opt/swi/y17-ext/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gdb AvnService core-AvnService-1526383829
3.设置查找的库路径,
set solib-search-path /opt/flaircomm/sysroots/armv7a-vfp-neon-oe-linux-gnueabi
set solib-search-path ./lib/
4.设置查找的库绝对路径的前缀(set sysroot 与 set solib-absolute-prefix 是同一条命令)
(gdb) set sysroot /
5.查看Crash的堆栈信息使用bt或backtrace
(gdb) bt
/opt/swi/y17-ext/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-objdump -ds AvnService>elf 反汇编
6.使用disassemble/disass命令反汇编一个函数或者一段内存地址
disass func_name
disassemble 0×0 0×10
7. 查找出现Crash的最后一个函数f 0
f 0
8.查看哪些库未加载
i sharelibrary
9.将gdb推到板子里面,可以gdb AvnService 来运行,然后再按r或者run来运行
gdb AvnService
r
10.常用的gdb调试命令:
run 运行程序,可简写为r
next 单步跟踪,函数调用当作一条简单语句执行,可简写为n
step 单步跟踪,函数调进入被调用函数体内,可简写为s
finish 退出函数
until 在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体,可简写为u。
continue 继续运行程序,可简写为c
stepi或si, nexti或ni 单步跟踪一条机器指令,一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。
info program 来查看程序的是否在运行,进程号,被暂停的原因。
11.可以执行gdb attach pid即可调试正在运行的程序
12. 查看运行时数据
print 打印变量、字符串、表达式等的值,可简写为p
p count 打印count的值
p cou1+cou2+cou3 打印表达式值
print接受一个表达式,GDB会根据当前的程序运行的数据来计算这个表达式,表达式可以是当前程序运行中的const常量、变量、函数等内容。但是GDB不能使用程序中定义的宏。
13.那么如何使用 core 文件查看程序的错误信息呢?
编译: gcc -Wall -Werror -o test -g test.c
14.多线程调试,查看线程的堆栈信息:
(1).方法一:
gdb --batch -ex "thread apply all bt" -p <被分析的进程的pid> 将这条命令的打印dump出来
--batch: 执行批处理,不进入交互模式
--ex: 执行gdb 命令
"thread apply all bt full": 打印所有线程堆栈
(2).方法二:
gdb -q --batch --ex "set height 0" -ex "thread apply all bt full" [可执行文件] [core文件]
解释:
-q: 不打印gdb的版权消息
--batch: 执行批处理,不进入交互模式
--ex: 执行gdb 命令
"set height 0": 不对输出进行分页
"thread apply all bt full": 打印所有线程堆栈