gdb调试学习总结《一》

一.gdb调试搭建:

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地址是否正确或与局域网有冲突。

三.gdb使用:

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定位非常准确,不要怀疑,没有理论根据的个人推断经常误导思路。

四. gdb详细应用:


https://www.cnblogs.com/wuyuegb2312/archive/2013/03/29/2987025.html

1. 断点调试

设置断点:   break 行号 if 条件   		//break 10 if i==3
禁止或使能: disable/enable 断点编号		//disable 1 3 4
清楚断点:   delete  断点号  			//delete 清楚所有断点
查看断点:   info  break/watchpoints
设置观察点:	watch  变量   				//设置一个观察点,当变量被读出或写入时程序被暂停

2. 数据显示

* 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会显出函数的参数地址。

3. 调试运行命令

* until(u) + 行数   //运行到函数某一行
  step(s)           //进入式单步执行
  next(n)           //非进入式单步执行
  return + 返回值  //return 5 改变程序流程,直接结束当前函数,并将指定值返回
  continue(c)      //执行到下一个断点或程序结束

反汇编:


五. gdb使用学习扩展

常用命令可查看《GDB不完全手册》或相关资料。
或者help命令的帮助,不懂就要多多使用

发布了41 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/wade_510/article/details/98044931