文章摘自
手把手教你玩GDB
入门命令
将程序编译为可调试
启动GDB开始调试
- gdb program 最常用的用gdb启动程序,开始调试的方式
- gdb program core 用gdb查看core dump文件,跟踪程序core的原因
- gdb program pid 用gdb调试已经开始运行的程序,指定pid即可
常用命令
attach/detach
- attach process_id: 在gdb状态下,开始调试一个正在运行的进程,其进程ID为process_id。
- detatch: 停止调试当前正在调试的进程,与attach配对使用。
breakpoint 让程序执行到某个特定的地方停止运行(断点)
- 添加断点
- b function: 在函数funtion入口处设置breakpoint
- b +offset:在程序当前停止的行向前offset行处设置breakpoint
- b linenum:在当前源文件的第linenum行处设置breakpoint
- b filename:linenum :在当前源文件的第linenum行处设置breakpoint
- b filename:function: 在名为filename的源文件中的function函数入口处设置breakpoint
- 清除断点
- clear: 清除当前stack frame中下一条指令之后的所有breakpoints
- clear function & clear filename:function: 清除函数function入口处的breakpoints
- delete breakpoints: 删除全部断点
- delete [breakpoints] [range…]: 删除由range指定的范围内的breakpoints
step
- step[count]:如果没有指定count,则继续执行程序,直到到达与当前源文件不同的源文件中时停止。如果指定了count,则重复上面的过程count次。
- step可以简写为s
continue
- continue[ignore-count]: 唤醒程序,继续运行,直到遇到下一个断点或者程序结束。如果指定了ignore-count,那么程序在接下来的运行中,忽略ignore-count次断点。
finish
- finish:继续执行程序,直到当前被调用的函数结束,如果该函数有返回值,把返回值也打印到控制台。
print 打印变量值
show print elements
查看默认打印字符串长度大小set print elements N
设置默认打印字符串长度大小为N- @ 操作符 p *对象数组@元素数量
调试改变变量的值
set variable
set variable varname = value
print
print key=value
容器
vector
打印整个vector
- p yourVector
- (gdb) p *(yourVector._M_impl._M_start)@yourVector.size()
打印vector第1~N个元素
- p *(yourVector._M_impl._M_start)@N
调用栈
bt(backtrace) 查看调用栈(Call Stack)信息
- backtrace: 显示程序的调用栈信息,可以用bt缩写
- where, info stack: 都是bt的别名,功能一样
frame 选择某一帧(stack frame)进行查看
up n: 查看当前桢上面第n桢的信息
down n: 查看当前桢下面第n桢的信息
寄存器
info register
info registers [regname]
多线程调试
常用命令
- info threads 查看GDB当前调试的程序的各个线程的相关信息
- thread threadno 切换当前线程到由threadno指定的线程
- thread apply [threadno] [all] args 对指定(或所有)的线程执行由args指定的命令
- set scheduler-locking off 不锁定任何线程,也就是所有线程都执行,这是默认值
- set scheduler-locking on 只有当前被调试线程会执行
- break %.c:行号 thread all 在所有线程中相应的行上设置断点
总结图
信号处理
info signals
- info signals / info handle:打印所有的信号相关的信息,以及GDB缺省的处理方式。
handle signal keywords
- handle signal keywords:设置GDB对某个具体信号的处理方式。signal可以为信号整数值,也可以为SIGEGV这样的符号。keywords的取值有:
- stop/ nostop: stop表示收到指定的信号,停止进程的运行;nostop表示GDB收到指定的信号,不会停止进程的运行,只会打印出一条收到信号的消息。
- print/ noprint: print表示如果收到指定的信号,打印出一条信息;noprint是相反的意思。
- pass/ nopass: pass表示如果收到指定的信号,把该信号通知给进程;nopass则表示相反的意思。