GDB调试命令

1:查看代码 (gdb) list 行号 查看指定行号附近的代码。 (gdb) search KeyWord 查找当前文件下一个KeyWord (gdb) reverse-search KeyWord 查找当前文件上一个KeyWord

2:执行程序 (gdb) run 可执行程序名 执行准备调试的程序 同时可以 使用(gdb) set args -x -y 来修改参数 使用(gdb) show args 获取参数

3:数据显示/修改 (gdb) print p 可以显示当前变量p的值 同时可以 print Fun( 1, 2 ) 可以输出函数返回值 print *pMyPtr 可以输出复杂对象的值 print $1 可以输出历史记录变量的值 (gdb) whatis p 可以显示当前变量p的类型(对自定义结构无效) (gdb) set variable 对指定变量赋值 (gdb) ptype p 获取一个变量p的类型。(对自定义结构有效) $pc 寄存器-程序计数器 $fp 寄存器-当前堆栈帧指针 $sp 寄存器-栈指针 $ps 寄存器-处理器状态

4:断点 (gdb) break FileName.cpp:2202 可以让程序在FileName.cpp的2202行设置断点 (gdb) breal FileName.cpp:Myfun if pParam==100 可以让程序在FileName.cpp文件中的MyFun函数处设置断点,该断点触发条件为 pParam==100 为真时才有效。 通常断点后可以使用 (gdb) backtrace 命令查看调用堆栈表。 <上文中的break允许用一个字符b替代> 我们可以查看当前程序项目的所有断点列表,命令为 (gdb) info break 删除全部断点,可使用下面命令 (gdb) delete breakpoint 删除一个断点,可以使用下面命令 (gdb) delete breakpoint 1 则删除了编号为1的断点。 禁止使用断点 (gdb) disable breakpoint 1 允许使用断点 (gdb) enable breakpoint 1 删除指定行上的断点 (gdb) clean 2204 则删除了2204行上的断点。

5:流程控制 (gdb) next 不进入函数内部的单步执行,可用一个字符n替代。 (gdb) step 进入函数内部的单步执行,可用一个字符s替代。 (gdb) finish 若进入了某函数,则直接执行至退出该函数体并显示其返回值。(void不显示)。 (gdb) call FunName( 167 ) 直接调用执行一个函数FunName,括号内加参数 (gdb) continue 当进入断点后,希望继续执行下去,则使用continue

6:多线程 (gdb) info threads 获取当前程序的所有线程列表 (gdb) thread ID 切换指定ID的线程为当前调试线程 (gdb) break FileName.cpp:1122 thread all 在所有线程的FileName.cpp文件中1122行设置断点 (gdb) thread apply ID1 ID2 ID3 command 在ID1,ID2,ID3等一个或多个线程中执行GDB的command命令 (gdb) thread apply all command 在所有线程中执行GDB的command命令 (gdb) set scheduler-locking off (或on或step) 当off时,意味着所有线程正常执行。这个是默认状态 当on时,意味着只有当前调试的线程正常执行,其他线程将中断。 当step时,意味着只有当前调试的线程正常执行,但当next过一个函数后,所有线程正常执行。