用GDB调试程序
GDB的基本工作原理剖析
gdb的启动
g++ -g hello.cpp -o hello
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行 时的内存地址。
装入想要调试的可执行文件
kill [filename]
终止正在调试的程序
break [file:]function
在(file文件的)function函数中设置一个断点
clear
删除一个断点,这个命令需要指定代码行或者函数名作为参数
run [arglist]
运行您的程序 (如果指定了arglist,则将arglist作为参数运行程序)
bt Backtrace
显示程序堆栈信息
print expr
打印表达式的值
continue
继续运行您的程序 (在停止之后,比如在一个断点之后)
list
列出产生执行文件的源代码的一部分
next
单步执行 (在停止之后); 跳过函数调用(与step相对应,step会进入函数内部)
nexti
执行下一行的源代码中的一条汇编指令
set
设置变量的值。例如:set nval=54 将把54保存到nval变量中;设置输入参数也可以通过这个命令(例如当三个入参分别为a、b、c的话,set args a b c)
step
单步执行 (在停止之后); 进入函数调用
stepi
继续执行程序下一行源代码中的汇编指令。如果是函数调用,这个命令将进入函数的内部,单步执行函数中的汇编代码
watch
使你能监视一个变量的值而不管它何时被改变
rwatch
指定一个变量,如果这个变量被读,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令
awatch
指定一个变量,如果这个变量被读或者被写,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令
Ctrl-C
在当前位置停止执行正在执行的程序,断点在当前行
disable
禁止断点功能,这个命令需要禁止的断点在断点列表索引值作为参数
display
在断点的停止的地方,显示指定的表达式的值。(显示变量)
undisplay
删除一个display设置的变量显示。这个命令需要将display list中的索引做参数
enable
允许断点功能,这个命令需要允许的断点在断点列表索引值作为参数
finish
继续执行,直到当前函数返回
ignore
忽略某个断点制定的次数。例:ignore 4 23 忽略断点4的23次运行,在第24次的时候中断
info [name]
查看name信息
load
动态载入一个可执行文件到调试器
xbreak
在当前函数的退出的点上设置一个断点
whatis
显示变量的值和类型
ptype
显示变量的类型
return
强制从当前函数返回
txbreak
在当前函数的退出的点上设置一个临时的断点(只可使用一次)
make
使你能不退出 gdb 就可以重新产生可执行文件
shell
使你能不离开 gdb 就执行 UNIX shell 命令
help [name]
显示GDB命令的信息,或者显示如何使用GDB的总体信息
quit
退出gdb.
gdb -tui 代码窗口相关命令:
info win 显示窗口的大小
layout next 切换到下一个布局模式
layout prev 切换到上一个布局模式
layout src 只显示源代码
ctrl+x+a 退出layout
layout asm 只显示汇编代码
layout split 显示源代码和汇编代码
layout regs 增加寄存器内容显示
focus cmd/src/asm/regs/next/prev 切换当前窗口
refresh 刷新所有窗口
tui reg next 显示下一组寄存器
tui reg system 显示系统寄存器
update 更新源代码窗口和当前执行点
winheight name +/- line 调整name窗口的高度
tabset nchar 设置tab为nchar个字符
gdb在执行中,会自动跟踪代码
Save current breakpoint definitions as a script.
This includes all types of breakpoints (breakpoints, watchpoints,
catchpoints, tracepoints). Use the 'source' command in another debug
session to restore them.
断点设置
gdb断点分类:
以设置断点的命令分类:
breakpoint
可以根据行号、函数、条件生成断点。
watchpoint
监测变量或者表达式的值发生变化时产生断点。
catchpoint
监测信号的产生。例如c++的throw,或者加载库的时候。
gdb中的变量从1开始标号,不同的断点采用变量标号同一管理,可以 用enable、disable等命令管理,同时支持断点范围的操作,比如有些命令接受断点范围作为参数。
具体命令略。