GDB使用总结

启动gdb

  • 调试可执行文件:gdb <bin>
  • 调试core文件:gdb <bin> <core>
  • 调试正在运行的程序:gdb -p <pid>
  • 指定源文件的路径:gdb … -d <source_file_path>

退出gdb

  • 从gdb命令行中退出:quit / Ctrl-D

调试命令

  • 查看代码
列出源代码:list(l)
	列出当前的源代码:l
	列出代码时向上走:l -
	列出代码时向下走:l +
	列出某一行的源代码:l <file:line_num>
	列出某个函数的源代码:l <file:func_name>(注意调试c++程序的时候,必须是file:namespace::classname::func_name)
	列出某个区间的源代码:l <file:begin>, <file:end>
	列出某个内存地址的代码:l <*address>
查看汇编代码:info line & disassemble
	查看行/函数的起始终止地址:info line
		查看某行的起始终止地址:info line <line_num>
		查看某函数的起始终止地址:info line <func_name>
	列出汇编代码:disassemble
		列出当前函数的汇编代码:disassemble 
		列出某个地址段的汇编代码:disassemble  <start_addr>, <end_addr> (start_addr和end_addr就是使用info line指令打印出来的起始终止地址)
		列出汇编代码时包含源代码:disassemble /m  <start_addr>, <end_addr>
  • 停止点管理:break(断点)/watch(观察点)/catch(捕获点)
设定断点:break(b)
	设定文件断点:b <file:line_num>
	设定函数断点:b <file:func_name>(注意调试c++程序的时候,必须是file:namespace::classname::func_name)
	设定条件断点:b .... if <condition>
设定观察点:watch/rwatch/awatch (注意只有程序开始运行之后才能设定观察点)
	表达式的值改变时暂停:watch <expr>
	表达式被读取时暂停:rwatch <expr>
	表达式被读取或修改时暂停:awatch <expr>
设定捕获点:catch/tcatch (非HP-UNIX只能用于异常,而编码规范又不让我们用异常...了解就好...)
	设定捕获点:catch <event>,event可以是下面表中的值(注意,在非HP-UNIX环境下只有throw/catch有用)
		throw	catch exception syscall exec fork vfork load unload 
  tcatch的含义是只捕获一次,并且停住之后自动删除此捕获点
查看停止点:info break / info watch
	查看所有停止点(包括break、watch和catch):info break
	查看某个停止点:info break <no.>
	查看所有观察点:info watch
	查看某个观察点:info watch <no.>
	只能使用info break <no.>查看捕获点(catch point)
disable停止点:disable 
	disable所有停止点:disable
	disable某个停止点:disable <no.>
	disable某个范围内的停止点:disable <range> (range的例子:1-7)
enable停止点:enable
	enable所有停止点:enable
	enable某个停止点:enable <no.>
	enable某个范围内的停止点:enable <range> (range的例子:1-7)
删除停止点:delete
	删除全部停止点:delete
	删除某个停止点:delete <no.>
	删除某个范围的停止点:delete <range> (range的例子:1-7)
清除停止点:clear
	清除当前行停止点:clear
	清除指定行停止点:clear <file:line_num>
	清除指定函数内部所有停止点:clear <file:func_name>(注意调试c++程序的时候,必须是file:namespace::classname::func_name)
断点条件修改:condition(只对break有效)
	清除断点条件:condition <break no.>
	修改断点条件:condition <break no.> <expression>
断点命令列表:commands
	设置断点的命令列表:commands <break no.>
  	... command list ...
  	end
  • 执行管理
运行程序:run(r)
	开始运行:r
	带命令行参数执行:r <args>
对正在运行的程序调试:attech & detach
	调试正在运行的程序:attach <pid>
	从正在运行的程序中离开:detach
单步执行进入调用:step(s) 
	单步执行step-in:s
	执行若干步step-in:s <line_count>
单步执行跳过调用:next(n) 
	单步执行step-over:n
	执行若干步step-over:n <line_count>
继续执行至下一个断点:continue(c)
	继续执行continue:c
	继续执行并忽略指定个数个断点:c <ignore_break_point_count>
继续执行跳出当前循环:until(u)
继续执行跳出当前函数:finish(f)
step-mode设定:
	开启step-mode:set step-mode on (让gdb遇到没有debug信息的函数时停止在它的第一行,然后就可以查看它的汇编了)
	关闭step-mode:set step-mode off
单步执行机器码:si(stepi)/ni(nexti) (它们的作用与s和n一样)
强制当前函数返回:return
	当前函数立即返回:return
	当前函数立即以某个返回值返回 :return <expr>
		强制调用函数:call
			强制调用某个函数:call <expr>
			print命令可以达到同样的目的 :print <expr>
		跳转执行:jump(j)
			跳转到某行:j <line_num>
			跳转到某文件的某行:j <file:line_num>
			向前向后跳转几行:j +n/-n
			跳转到某个地址:j <addr>
			注意:jump不会修改程序栈中的内容,使用时超级容易引起core,要小心使用
  • 查看信息
打印变量:print(p)
	打印变量:p <var>
	打印数组中的前n个变量:p <array-var>@n
	打印其他文件中的变量:p <file>::<var>
	打印其他函数中的变量:p <func_name>::<var>
	格式化打印:p /<format> xxxx
	GDB支持的格式:
		x	十六进制
    d	十进制
		u	无符号十六进制
		o	八进制
		t	二进制
		a	按地址打印(十六进制)
		c	字符
    f	浮点数
显示变量的类型:ptype
	显示变量的类型 :ptype <var>
查看内存:examine(x)
	打印地址:x <addr>
	打印地址并重复n次:x /<num> <addr>
	按照某种格式打印地址:x /<format> <addr>
 		x	十六进制(默认值)
		i	查看汇编代码
		s	按照字符串格式打印
	按照指定的unit-size打印地址:x /<unitsize> <addr>
 		b	单字节(byte)
		h	双字节
		w	四字节
		g	八字节
		/后面的三个参数可以联合起来使用:x /4bx <addr>
查看栈信息:
	打印栈信息:backtrace(bt)
	打印全部栈信息:bt
	打印当前frame向上n层:bt <+n>
	打印当前frame向下n层:bt <-n>
	切换到栈的某一层:frame(f)
	打印当前栈信息:f
	切换到栈的某一层:f <num>
	打印当前栈信息:info frame
	沿着栈向上走:up
	沿着栈向下走:down
查看线程信息:
	打印线程信息:info thread
	跳转到某个线程:thread(t)
	打印当前线程信息:t
	切换到某个线程:t <num>
	设定线程运行模式:set scheduler-locking
	所有线程都可以执行:set scheduler-locking off
	只有当前线程得到执行:set scheduler-locking on
	当前线程最高优先级执行:set scheduler-locking step(也就是说除非当前线程交出运行权限(使用finish/util/continue/next命令),否则其他线程都得不到执行)
查看macro信息:
	查看macro的定义:info macro <macro_name>
	展开macro:macro expand <expr>
	注意:在编译程序的时候加上gcc的参数-g3
	注意:低版本的gdb/gcc组合可能对macro调试的支持不好,需要4x的gcc和7.4及以上的gdb
查看寄存器信息:
	查看寄存器的值(不包含浮点寄存器):info registers
	查看寄存器的值:info registers
	查看某个寄存器的值:info registers <reg_name>
	查看所有寄存器的值(包含浮点寄存器):info all-registers
自动显示管理:
	设定自动显示:display 
	打印所有的自动显示:display
	设定自动显示变量:display <var>
	指定自动显示变量格式:display /<fmt> <var>
    x	十六进制
    d	十进制
    u	无符号十六进制
    o	八进制
    t	二进制
    a	按地址打印(十六进制)
    c	字符
    f	浮点数
查看自动显示:info display
	enable自动显示:enable display
	enable所有的自动显示:enable display
	enable某个自动显示:enable display <no.>
	disable自动显示:disable display
	disable所有的自动显示:disable display
	disable某个自动显示:disable display <no.>
	删除自动显示:undisplay / delete display
	删除所有的自动显示:undisplay / delete display
	删除某个自动显示 :undisplay <no.>/ delete display <no.>
  • 信号处理
查看信号处理策略:info signals / handle
	查看全部信号处理策略:info signals / handle
	查看某个信号处理策略:info signals / handle <sig_name>
调整信号处理策略:handle
	调整信号处理策略:handle <sig_name> <keywords>
	<signal>就是info handle/signals中列出的signal名称
	handle支持以下keywords:
		nostop 接收到信号不停止,但是打印信息
		stop	接收到信号停止程序
		print	接收到信号打印信息
		noprint	接收到信号不打印信息
		pass	GDB不响应这个信号
		noignore	GDB不响应这个信号
		nopass	GDB响应这个信号
		ignore	GDB响应这个信号
产生信号量:signal
	产生某个信号:signal <signal>
  • 其他
命令行参数操作:set  args & show args
	设定命令行参数:set args <args>
	显示命令行参数:show args
运行时动态修改内存中变量的值:set var
	使用print命令:print <var>=<value>
	使用set var命令:set var <var>=<value>
一些有用的显示设定:
	美化数组打印:set print array on
	美化结构体打印:set print pretty on
	打印union中的数据:set print union on
	基于虚函数表打印:set print object on

实用技巧

  • 调试core
1.使用gdb <exec_file> <core_file>打开core文件
2.之后bt打印栈信息,找到需要查看的位置
3.f <num>到该位置
4.使用l显示附近的代码,使用p打印需要查看的变量
  • 调试正在运行中的程序
1.ps aux|grep xxx查找对应程序的pid
2.gdb -p pid或者启动gdb之后attach pid
3.使用info thread查看线程信息,使用t <num>跳到需要查看的线程
4.之后bt打印栈信息,找到需要查看的位置
5.f <num>到该位置
6.使用l显示附近的代码,使用p打印需要查看的变量
7.也可以用b设定断点之后再c,等等
8.注意:退出时需要先detach再quit,否则会终止该程序
  • 打印stl库中的变量内容
1.gdb中对stl类型变量的打印支持的不好,所以需要使用内存地址来打印对应的信息
2.第一p <var>,打印这个对象的内容,列如说一个vector<string>对象
3.然后根据具体打印的信息,找到对应的内存地址
4.根据这个内存地址信息,就可以打印对应的内容了
  • gdbinit文件与gdb脚本
gdb与vim类似,启动时加载$home目录下的.gdbinit文件,一些显示设定可以直接写在.gdbinit文件中来始终生效
gdb与vim类似,支持用户编写自己的脚本,例如:打印stl容器的gdb脚本,http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容