【gdb】GDB调试方法

版权声明:本文为博主原创文章,未经博主允许不得转载。若允许转载,请注明来源https://blog.csdn.net/SoaringLee_fighting,否则保留追究法律责任的权利! https://blog.csdn.net/SoaringLee_fighting/article/details/82251334

Date: 2018.8.31


1、参考

https://blog.csdn.net/listener51/article/details/81950131
https://www.cnblogs.com/qigaohua/p/6077790.html
https://blog.csdn.net/yangzhongxuan/article/details/6901477
https://blog.csdn.net/linuxheik/article/details/17380767
http://blog.chinaunix.net/uid-20593827-id-1918499.html

2、GDB调试基本命令
(gdb) start  // 运行程序
(gdb) continue // 从断点位置继续运行
(gdb) r(un)   // 运行准备调试的程序,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和shell通配符(*、?、[、])在内。
(gdb) n(ext) // 单步运行,逐过程调试,C Style
(gdb) s(tep) // 单步运行,逐语句调试,C Style
(gdb) n(ext)i // 单步运行,逐过程调试, asm Style
(gdb) s(tep)i // 单步运行,逐语句调试, asm Style
finish		  // 如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish
until		 // 结束当前循环
whatis		 // 显示变量或函数类型
quit		 // 退出gdb
set args [arguments] //传递命令行参数
3、布局和显示数据
display /i $pc	//命令可以在调试时显示每条汇编命令。
info win		//显示窗口的大小
layout next		//切换到下一个布局模式
layout prev		//切换到上一个布局模式
layout src		//只显示源代码,退出方法为Ctrl+X+A
layout asm		//只显示汇编代码
layout split	//显示源代码和汇编代码
layout regs		//增加寄存器内容显示
focus cmd/src/asm/regs/next/prev	//切换当前窗口
refresh			//刷新所有窗口
tui reg next	//显示下一组寄存器
tui reg system	//显示系统寄存器
update			//更新源代码窗口和当前执行点
print bb		//打印变量
print $bb		 //打印寄存器
list(l)			//查看当前代码附近的代码行
4、查询运行信息
where/bt		//当前运行的堆栈列表
bt /backtrace/info stack	//显示当前调用堆栈
bt full  //查看完整的调用堆栈信息,包括每个栈帧中所有变量和参数的信息。
up/down			//改变堆栈显示的深度
set args 		//指定运行时的参数
show args		//查看设置好的参数
info program	//查看程序的是否在运行,进程号,被暂停的原因。
5、设置断点和清除断点
break  <function>				//在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。
break							//在指定行号停住。
break +offset / break -offset	//在当前行号的前面或后面的offset行停住。offiset为自然数。
break filename:linenum			//在源文件filename的linenum行处停住。
break filename:function		//在源文件filename的function函数的入口处停住。
break *address					//在程序运行的内存地址处停住。
break							//break命令没有参数时,表示在下一条指令处停住。
breakif < condition >	…可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环体中,可以设置break if i==100,表示当i为100时停住程序。
info break [n]					//显示当前gdb的断点信息
delete	[n]						//清除指定断点
disable breakpoint [n]			//禁止指定断点
enable breakpoint [n]			//允许指定断点

https://stackoverflow.com/questions/5429137/how-to-print-register-values-in-gdb

以十进制的方式查看寄存器的值:

 p/d $pc

参考网址:https://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_54.html

6、示例
gdb ./demo
(gdb) set args -i input.svac2
(gdb) start
(gdb) b 1201
(gdb) info b
(gdb) c
(gdb) step
(gdb) finish
(gdb) layout src
(gdb) list
(gdb) print a
(gdb) print $r0
(gdb) q

THE END!

猜你喜欢

转载自blog.csdn.net/SoaringLee_fighting/article/details/82251334