GDB 调试常用指令
时间:2010-12-17 来源:study_linu_x
gdb
file /opt/bin/test 运行执行文件的路径
directory /opt/test_code 源码的路径
run -qws display dircetfb 运行可执行文件(可显示的程序,参数是根据可执行文件的特性)
break(b) 设置断点
info break(info b) 显示断点信息
delete b 删除断点
continue(c) 继续执行函数,直到函数结束或遇到新断点
next(n) 单步恢复程序运行,但不进入函数调用
step(s) 单步恢复程序运行,且进入函数调用
list(l)行号|<函数名> 查看指定位置的程序源码
run 程序开始运行,直到遇到断点
print(p) 表达式 |变量 查看程序运行对应表达式和变量的值
(gdb)l 查看源文件,一次显示10行
(gdb)list/l 行号 查看指定位置的代码
(gdb)b 函数名/行号 在某函数或指定位置设置断点
(gdb)info b 查看断点信息(有多个断点,Num显示断点序号)
(gdb)r 行号 gdb默认从第一行开始运行,如果要指定行开始运行,则使用该命令
(gdb)p 变量名 查看指定变量的值
(gdb)set 变量=设定值 修改变量值。gdb显示变量时都会在对应值前加“%n”标记,以后再引用的话可以直接使用 “%n”,提高效率。
(gdb)n或s 单步运行程序。若有函数,调用时s会进入该函数,而n不会进入该函数。
(gdb)c 查看完变量或堆栈后可以输入“c” 命令恢复程序的正常运行,把剩余的程序执行完。
(gdb)q 退出gdb环境 info args 列出你程序所接受的命令行参数
info registers 列出寄存器的状态
info b 列出在程序中设的断点 当程序崩溃的时候linux会生成一个core文件,可以用
gdb a.out core
where
查看导致崩溃的原因 break ... if COND
这个命令设置一个条件断点,条件由COND指定;在gdb每次执行到此断点时
COND都被计算当COND的值为非零时,程序在断点处停止 rbreak REGEX
在所有满足表达式REGEX的函数上设置断点。这个命令在所有相匹配的函数上设置无
条件断点,当这个命令完成时显示所有被设置的断点信息。这个命令设置的断点和
break命令设置的没有什么不同。当调试C++程序时这个命令在重载函数上设置断点时
非常有用。 watch EXPR
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
这个命令使用EXPR作为表达式设置一个观察点。GDB将把表达式加入到程序中并监
视程序的运行,当表达式的值被改变时GDB就使程序停止。这个也可以被用在SPARClite
DSU提供的新的自陷工具中。当程序存取某个地址或某条指令时(这个地址在调试寄
存器中指定),DSU将产生自陷。对于数据地址DSU支持'watch'命令,然而硬件断点寄
存器只能存储两个断点地址,而且断点的类型必须相同。就是两个'rwatch'型断点
或是两个'awatch'型断点。
info watchpoints
在多线程的程序中,观察点的作用很有限,GDB只能观察在一个线程中的表达式的值
如果你确信表达式只被当前线程所存取,那么使用观察点才有效。GDB不能注意一个
非当前线程对表达式值的改变。 catch EXCEPTIONS
使用这个命令在一个被激活的异常处理句柄中设置断点。EXCEPTIONS是一个你要抓住
的异常。你一样可以使用'info catch'命令来列出活跃的异常处理句柄。
GDB中对于异常处理由以下情况不能处理:
* 如果你使用一个交互的函数,当函数运行结束时,GDB将象普通情况一样把控制返
回给你。如果在调用中发生了异常,这个函数将继续运行直到遇到一个断点,一个信号
或是退出运行。
* 你不能手工产生一个异常( 即异常只能由程序运行中产生 )
* 你不能手工设置一个异常处理句柄。
有时'catch'命令不一定是调试异常处理的最好的方法。如果你需要知道异常产生的
确切位置,最好在异常处理句柄被调用以前设置一个断点,这样你可以检查栈的内容。
如果你在一个异常处理句柄上设置断点,那么你就不容易知道异常发生的位置和原因。
要仅仅只在异常处理句柄被唤醒之前设置断点,你必须了解一些语言的实现细节
file /opt/bin/test 运行执行文件的路径
directory /opt/test_code 源码的路径
run -qws display dircetfb 运行可执行文件(可显示的程序,参数是根据可执行文件的特性)
break(b) 设置断点
info break(info b) 显示断点信息
delete b 删除断点
continue(c) 继续执行函数,直到函数结束或遇到新断点
next(n) 单步恢复程序运行,但不进入函数调用
step(s) 单步恢复程序运行,且进入函数调用
list(l)行号|<函数名> 查看指定位置的程序源码
run 程序开始运行,直到遇到断点
print(p) 表达式 |变量 查看程序运行对应表达式和变量的值
(gdb)l 查看源文件,一次显示10行
(gdb)list/l 行号 查看指定位置的代码
(gdb)b 函数名/行号 在某函数或指定位置设置断点
(gdb)info b 查看断点信息(有多个断点,Num显示断点序号)
(gdb)r 行号 gdb默认从第一行开始运行,如果要指定行开始运行,则使用该命令
(gdb)p 变量名 查看指定变量的值
(gdb)set 变量=设定值 修改变量值。gdb显示变量时都会在对应值前加“%n”标记,以后再引用的话可以直接使用 “%n”,提高效率。
(gdb)n或s 单步运行程序。若有函数,调用时s会进入该函数,而n不会进入该函数。
(gdb)c 查看完变量或堆栈后可以输入“c” 命令恢复程序的正常运行,把剩余的程序执行完。
(gdb)q 退出gdb环境 info args 列出你程序所接受的命令行参数
info registers 列出寄存器的状态
info b 列出在程序中设的断点 当程序崩溃的时候linux会生成一个core文件,可以用
gdb a.out core
where
查看导致崩溃的原因 break ... if COND
这个命令设置一个条件断点,条件由COND指定;在gdb每次执行到此断点时
COND都被计算当COND的值为非零时,程序在断点处停止 rbreak REGEX
在所有满足表达式REGEX的函数上设置断点。这个命令在所有相匹配的函数上设置无
条件断点,当这个命令完成时显示所有被设置的断点信息。这个命令设置的断点和
break命令设置的没有什么不同。当调试C++程序时这个命令在重载函数上设置断点时
非常有用。 watch EXPR
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
这个命令使用EXPR作为表达式设置一个观察点。GDB将把表达式加入到程序中并监
视程序的运行,当表达式的值被改变时GDB就使程序停止。这个也可以被用在SPARClite
DSU提供的新的自陷工具中。当程序存取某个地址或某条指令时(这个地址在调试寄
存器中指定),DSU将产生自陷。对于数据地址DSU支持'watch'命令,然而硬件断点寄
存器只能存储两个断点地址,而且断点的类型必须相同。就是两个'rwatch'型断点
或是两个'awatch'型断点。
info watchpoints
在多线程的程序中,观察点的作用很有限,GDB只能观察在一个线程中的表达式的值
如果你确信表达式只被当前线程所存取,那么使用观察点才有效。GDB不能注意一个
非当前线程对表达式值的改变。 catch EXCEPTIONS
使用这个命令在一个被激活的异常处理句柄中设置断点。EXCEPTIONS是一个你要抓住
的异常。你一样可以使用'info catch'命令来列出活跃的异常处理句柄。
GDB中对于异常处理由以下情况不能处理:
* 如果你使用一个交互的函数,当函数运行结束时,GDB将象普通情况一样把控制返
回给你。如果在调用中发生了异常,这个函数将继续运行直到遇到一个断点,一个信号
或是退出运行。
* 你不能手工产生一个异常( 即异常只能由程序运行中产生 )
* 你不能手工设置一个异常处理句柄。
有时'catch'命令不一定是调试异常处理的最好的方法。如果你需要知道异常产生的
确切位置,最好在异常处理句柄被调用以前设置一个断点,这样你可以检查栈的内容。
如果你在一个异常处理句柄上设置断点,那么你就不容易知道异常发生的位置和原因。
要仅仅只在异常处理句柄被唤醒之前设置断点,你必须了解一些语言的实现细节
相关阅读 更多 +