239为服务器IP,201为开发板IP。
从机网络配置:
ifconfig eth0 down;
ifconfig eth0 hw ether 00:0A:35:00:01:44;
ifconfig eth0 up;
ifconfig eth0 10.13.244.201;
mount -t nfs -o nolock 10.13.244.239:/nfs /mnt/app > /dev/null
gdb手动启动调试:
slave# gdbserver 10.13.244.239:1212 main.app
host# arm-xilinx-linux-gnueabi-gdb main.app;
host# target remote 10.13.244.201:1212;
gdb调试需要五个文件:.gdbinit(脚本,放到编译目录)、gdb.sh(脚本,放到编译目录)、arm-gdb(系统安装)、startdug(脚本,放到nfs目录)、gdbserver(工具,放到nfs目录)
.gdbinit内容:
target remote 10.13.244.201:1223
gdb.sh内容:
#! /bin/sh
cmake -DCMAKE_BUILD_TYPE=Debug …
make -j8
cp main /nfs/fuwei.li/01Project/main.app
arm-xilinx-linux-gnueabi-gdb main.app
startdug内容:
#! /bin/sh
./gdbserver 10.13.244.239:1223 main.app
请在主机编译目录运行./gdb.sh,目标板运行./startdug。
如果连接异常,请检查IP和mac地址是否正确或与局域网有冲突。
1.layout分割窗口(边查看代码边测试)
1.break 设置断点:【文件:行号;文件:函数名;当前停留的地方前面或后面的几行处设置断点;条件满足则设为断点】
【tbreak 设置临时断点】【watch 条件满足设置观察点】
【clear 清除函数或文件行断点】【delete 删除断点号】
2.continue 继续执行:【执行到下一个断点或观察点;执行并忽略当前断点n次】
【run 重头开始执行程序】
【quit 退出gdb】【kill 停止程序执行】
【finish 退出函数】
3.list 列出源代码
【info breakpoints/break/watchponits/threads/files/set 列出断点/观察点/当前线程】
4.where 当前所处的位置【线程中调用层次到当前函数】
5.backtrace bt显示当前堆栈【backtrace full 打印所有局部变量的值】
【frame number 选择指定的栈帧】【info program 查看程序的是否在运行,进程号,被暂停的原因】
6.print或Output 打印表达式的值【打印格式可以选择】
【Diplay 暂停/步进时自动显示表达式的值;undisplay 】
7.step s执行下一行,会进入函数内
【next n执行下一行,不进入函数内】
【until 继续运行到指定行号或函数或地址等】
gdb的作用:
A1. 线程死锁调试:info thread-》thread id -》where -》frame [num] -》p mutex1。
A2. 异常现象时,设定断点打印掉用栈,分析异常进入原因。
A3. 死机确定 bt 。
死循环定位:
步1、查看cpu的占用情况:运行程序 -> **top** 命令 -> **1**键(显示所有cpu) ->
**h**键(显示线程名称) ,看**哪个模块占用了cpu的100%**。
步2、**gdb**调试启动并复现之后结束执行**ctrl + c** -> 查看线程(info thread) ->
在所有线程上执行bt命令(**thread apply all bt**) -> 结合现象重点关注某线程 ->
切换线程(**thread id**) -> 走读该线程中**断点位置代码print**调试。
多次证明:gdb定位非常准确,不要怀疑,没有理论根据的个人推断经常误导思路。
https://www.cnblogs.com/wuyuegb2312/archive/2013/03/29/2987025.html
设置断点: break 行号 if 条件 //break 10 if i==3
禁止或使能: disable/enable 断点编号 //disable 1 3 4
清楚断点: delete 断点号 //delete 清楚所有断点
查看断点: info break/watchpoints
设置观察点: watch 变量 //设置一个观察点,当变量被读出或写入时程序被暂停
* set 变量 = 变量值 //set i = 3 改变程序中某个变量的值
* display 表达式 //display a 每当程序运行到断点处都会显示表达式的值
关键字:info delete disable/enable 同断点调试中使用
打印数组的方法:
*print array[N]@M //显示array数组,从下标N开始的M个元素
*set print array-indexes [on/off] // 打印数组元素的下标。
*set print array [on/off] //打印每个数组元素显示占一行,否则以逗号分隔。
*set print pretty [on/off] //显示结构体时会比较漂亮。
set logging [on/off] //调试信息将输出到指定文件[set logging file <文件名>]
set print elements [20] //打印最大个数。
set print union [on/off] //打印联合体.
set print null-stop [on/off] //当显示字符串时,遇到结束符则停止显示。
set print address [on/off] //打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。
* until(u) + 行数 //运行到函数某一行
step(s) //进入式单步执行
next(n) //非进入式单步执行
return + 返回值 //return 5 改变程序流程,直接结束当前函数,并将指定值返回
continue(c) //执行到下一个断点或程序结束
反汇编:
常用命令可查看《GDB不完全手册》或相关资料。
或者help命令的帮助,不懂就要多多使用