GDB的使用(转)[@more@]要使用GDB进行调试,编译程序时要指定-g或-ggdb的编译选项。
如:
gcc –g main.c
gcc –ggdb main.c
这样,gcc就会在生成可执行文件时产生调试讯息。-g用于产生一般的调试讯息,-ggdb则用于产生GDB特有的调试讯息。
--------------------------------------------------------------------------------
GDB的基本指令:
f(ile):指定一个可执行文件进行调试,gdb将读取些文件的调试讯息,如f a.exe
l(ist):列程序出源文件
r(un) :装载完要调试的可执行文件后,可以用run命令运行可执行文件
b(reak):设置断点(break point),如b 25,则在源程序的第25行设置一个断点,当程序执行到第25行时,就会产生中断;也可以使用b funcname,funcname为函数的名称,当程序调用些函数时,则产生中断
c(ontinue):c命令可以另中断的程序继续执行,直到下一个中断点或程序结束
p(rint):输入某个变量的值,如程序定义了一个int aa的就是,p aa就会输出aa的当前值
n(ext):程序执行到断点时中断执行,可以用n指令进行单步执行
s(tep):程序执行到断点时中断执行,可以用s指令进行单步执行进某一函数
q(uit):退出GDB
--------------------------------------------------------------------------------
记录输出日志
你可能想保存GDB命令的输出到一个文件中去。这里有几个命令来控制GDB的记录功能。
set logging on 打开记录功能。
set logging off 关闭记录功能。
set logging file file 改变当前日志文件的名称。默认的日志文件是`gdb.txt'。
set logging overwrite [on|off]
默认情况下,GDB会添加到日志文件中。如果你set logging on想复盖掉日志文件,就设置overwrite。
set logging redirect [on|off]
默认情况下,GDB会输出到终端和日志文件。如果你想仅仅输出到日志文件,设置redirect。
show logging
显示日志设置的当前值。
--------------------------------------------------------------------------------
为调试而编译
为了有效地调试一个程序, 你需要在编译时生成调试信息. 调试信息是存储在目标文件中的, 它描述了各个变量和函数的数据类型, 以及源代码行号与可执行代码地址之间的对应关系.
要加入调试信息, 需在运行编译器gcc时加入 ‘-g’选项.
一般,交付给客户的程序是需要优化编译的, 用了 ‘-O’编译器选项. 然而, 许多编译器是无法一起处理‘-g’和‘-O’选项的. 所以用这些编译器时, 不可能生成带有调试信息的优化的可执行文件.
GCC, GNU C/C++ 编译器, 支持带和不带‘-O’ 的‘-g’, 使得调试优化代码成为可能. 我们推荐你始终在编译程序时用‘-g’. 也许你自认为程序是正确无误的,但没有必要打这个赌。
当你调试一个用‘-g -O’编译的程序时, 记住: 优化器重新整理了你的代码, 而调试器给你看的是实际存在的(优化後的代码). 不要太惊讶, 如果实际执行路径并不能精确对应你的源文件. 一个极端的例子是: 如果你定义了一个变量, 但并没有用它, GDB 就不可能看见这个变量, 因为编译器把它优化没了.
有些情况下‘-g -O’并不像‘-g’一样, 特别是在有指令调度的机器上. 如果有疑问, 重新编译, 只使用‘-g’
--------------------------------------------------------------------------------
程序环境
环境由一组环境变量和它们的值组成。环境变量通常记录着这些:你的用户名,你的主目录,你的终端类型,以及你的要运行程序的搜索路径。一般你用 shell 设置环境变量,然後它们会由你运行的其他程序继承。调试时,试着用修改的环境运行你的程序而不需要重新启动 GDB,这是很有用的。
path directory把 directory 加到将会传给你的程序的 PATH 环境变量(可执行文件的搜索路径)的前面。show paths
显示可执行文件的搜索路径列表(PATH 环境变量的值)
show environment [varname]打印环境变量 varname 的值,这个变量会在你的程序启动时传给它。如果你不提供 varname 参数,会打印所有会传给你的程序的环境变量的名字和值。你可以缩写 environment 为 env 。
set environment varname [=value]设置环境变量 varname 的值为 value 。这个改变只针对你的程序,不影响 GDB 本身。value 可以是任何字符串,环境变量的值仅仅是字符串,任何解释都是你的程序自己的。value 参数是可选的,如果没有,变量会设为空值。
如:
gcc –g main.c
gcc –ggdb main.c
这样,gcc就会在生成可执行文件时产生调试讯息。-g用于产生一般的调试讯息,-ggdb则用于产生GDB特有的调试讯息。
--------------------------------------------------------------------------------
GDB的基本指令:
f(ile):指定一个可执行文件进行调试,gdb将读取些文件的调试讯息,如f a.exe
l(ist):列程序出源文件
r(un) :装载完要调试的可执行文件后,可以用run命令运行可执行文件
b(reak):设置断点(break point),如b 25,则在源程序的第25行设置一个断点,当程序执行到第25行时,就会产生中断;也可以使用b funcname,funcname为函数的名称,当程序调用些函数时,则产生中断
c(ontinue):c命令可以另中断的程序继续执行,直到下一个中断点或程序结束
p(rint):输入某个变量的值,如程序定义了一个int aa的就是,p aa就会输出aa的当前值
n(ext):程序执行到断点时中断执行,可以用n指令进行单步执行
s(tep):程序执行到断点时中断执行,可以用s指令进行单步执行进某一函数
q(uit):退出GDB
--------------------------------------------------------------------------------
记录输出日志
你可能想保存GDB命令的输出到一个文件中去。这里有几个命令来控制GDB的记录功能。
set logging on 打开记录功能。
set logging off 关闭记录功能。
set logging file file 改变当前日志文件的名称。默认的日志文件是`gdb.txt'。
set logging overwrite [on|off]
默认情况下,GDB会添加到日志文件中。如果你set logging on想复盖掉日志文件,就设置overwrite。
set logging redirect [on|off]
默认情况下,GDB会输出到终端和日志文件。如果你想仅仅输出到日志文件,设置redirect。
show logging
显示日志设置的当前值。
--------------------------------------------------------------------------------
为调试而编译
为了有效地调试一个程序, 你需要在编译时生成调试信息. 调试信息是存储在目标文件中的, 它描述了各个变量和函数的数据类型, 以及源代码行号与可执行代码地址之间的对应关系.
要加入调试信息, 需在运行编译器gcc时加入 ‘-g’选项.
一般,交付给客户的程序是需要优化编译的, 用了 ‘-O’编译器选项. 然而, 许多编译器是无法一起处理‘-g’和‘-O’选项的. 所以用这些编译器时, 不可能生成带有调试信息的优化的可执行文件.
GCC, GNU C/C++ 编译器, 支持带和不带‘-O’ 的‘-g’, 使得调试优化代码成为可能. 我们推荐你始终在编译程序时用‘-g’. 也许你自认为程序是正确无误的,但没有必要打这个赌。
当你调试一个用‘-g -O’编译的程序时, 记住: 优化器重新整理了你的代码, 而调试器给你看的是实际存在的(优化後的代码). 不要太惊讶, 如果实际执行路径并不能精确对应你的源文件. 一个极端的例子是: 如果你定义了一个变量, 但并没有用它, GDB 就不可能看见这个变量, 因为编译器把它优化没了.
有些情况下‘-g -O’并不像‘-g’一样, 特别是在有指令调度的机器上. 如果有疑问, 重新编译, 只使用‘-g’
--------------------------------------------------------------------------------
程序环境
环境由一组环境变量和它们的值组成。环境变量通常记录着这些:你的用户名,你的主目录,你的终端类型,以及你的要运行程序的搜索路径。一般你用 shell 设置环境变量,然後它们会由你运行的其他程序继承。调试时,试着用修改的环境运行你的程序而不需要重新启动 GDB,这是很有用的。
path directory把 directory 加到将会传给你的程序的 PATH 环境变量(可执行文件的搜索路径)的前面。show paths
显示可执行文件的搜索路径列表(PATH 环境变量的值)
show environment [varname]打印环境变量 varname 的值,这个变量会在你的程序启动时传给它。如果你不提供 varname 参数,会打印所有会传给你的程序的环境变量的名字和值。你可以缩写 environment 为 env 。
set environment varname [=value]设置环境变量 varname 的值为 value 。这个改变只针对你的程序,不影响 GDB 本身。value 可以是任何字符串,环境变量的值仅仅是字符串,任何解释都是你的程序自己的。value 参数是可选的,如果没有,变量会设为空值。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10617731/viewspace-961904/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10617731/viewspace-961904/