2009年4月14日星期二

gdb(gcc 的debug 工具)简介(三)

gdb(gcc 的debug 工具)简介(三)

为调试准备带调试信息的代码
===========================
为了高效的调试一个程序,你需要使用编译器来产生附带调试信息的可执行代码
这些调试信息存储在目标文件中;描述了变量数据类型和函数声明,在原文件代码行
和执行代码之间建立联系。
为产生调试信息,当你使用编译器时指定"-g"选项,就可以为你的程序产生带有
调试信息的可执行代码。
有些c编译器不支持"-g"选项和"-O"选项,那你就有麻烦了,或者有别的方法产生
带调试信息的可执行代码,要不就没办法了。
gcc,GNU的c语言编译器支持"-g"和"-O"选项。这样你就可以产生带调试信息的且
优化过的可执行代码.
当你使用gdb来调试一个使用"-g","-O"选项产生的程序时,千万记住编译器为了优
化你的程序重新安排了你的程序。不要为运行次序与你原来设想的不同,最简单的例子
就是当你定义了一个变量但从未使用过它时,gdb中是看不到这个变量的--因为它已经
被优化掉了。
所以有时你不要使用"-O"选项,如果当你不用优化时产生的程序是正确的,而优化
过后变的不正确了,那么这是编译器的bug你可以向开发者提供bug-reports(包括出错
的例子)。
早期的GUN C语言编译器允许"-gg"选项,也用来产生调试信息,gdb不再支持这种格
式的调试信息,如果你的编译器支持"-gg"选项,请不要使用它。

开运行你的程序
=====================

`run"
`r"
使用"run"命令在gdb下启动你的程序。你必须先指定你程序的名字(用gdb的命令行
参数)或使用"file"命令,来指定文件名。如果你在一个支持多进程的环境下运行你的程
序"run"命令创建一个子进程然后加载你的程序。如果环境不支持进程,则gdb直接调到
程序的第一条命令。
一些父进程设置的参量可以决定程序的运行。gdb提供了指定参量的途径,但你必须
在程序执行前设置好他们。你也可以在运行过程中改变它们,但每次改变只有在下一次
运行中才会体现出来。这些参量可以分为四类:
---参数
你可以在使用"run"命令时设置,如果shell支持的话,你还可以使用通配符,或
变量代换。在UNIX系统中你可以使用"shell环境变量"来控制shell。
---环境:
你的程序一般直接从gdb那里继承环境变量。但是你可以使用"set environment"
命令来设置专门的环境变量。
---工作目录
你的程序还同时从gdb那里继承了工作目录,你可以使用"cd"命令在gdb中改变工作
目录。
---标准输入/输出
你的程序一般使用与gdb所用的相似的设备来输入/输出。不过你可以为你的程序的
输入/输出进行重定向。使用"run"或"tty"命令来设置于gdb所用不同的设备。
*注意:当你使用输入/输出重定向时,你将不能使用无名管道来把你所调试的程序的输出
传给另一个程序。这样gdb会认为调试程序出错。
当你发出"run"命令后,你的程序就开始运行。
如果你的符号文件的时间与gdb上一次读入的不同,gdb会废弃原来的符号表并重新读
入。当前的断点不变。
设置运行参量(arguments)
========================
使用"run"命令指定你程序的运行参量。这些命令行参量被传给shell,由shell来处理
通配符和进行输入/出重定向。shell是gdb从"shell"环境变量中所得的名字。就是当前shell
如果没有定义"shell"环境变量,那么gdb将使用"/bin/sh".
当"run"不带参量运行是缺省是表示使用上一次调试所使用的参变量,或者你可以用"set
args"命令来设置参变量。

`set args"
为程序指定参变量。如果"set args"不带参量,那么下一次"run"命令将不带任何参量
运行。如果你要去掉"run"命令后带的缺省参量(在使用过带参量的"run"以后,只有这个方法
来去掉参量)你可以使用不带参量的"set args"命令。

`show args"
显示当前命令行参量。
Show the arguments to give your program when it is started.

程序环境
==========================
"环境"包括了一系列的环境变量和它们的值。环境变量一般记录了一些常用的信息,
比如你的用户名,主目录,你的终端型号和你的运行程序的搜索路径。一般你可以在shell
下设置环境变量,然后这些变量被所有你所运行的程序所共享。在调试中,可以设置恰当
的环境变量而不用退出gdb.

`path DIRECTORY"
在"PATH"环境变量前加入新的内容("PATH"提供了搜索执行文件的路径)。对于gdb和
你的程序来说你也许要设置一些专门的路径。使用":"或空格来分隔。如果DIRECTORY已经
在路径中了,这个操作将会把它移到前面。
你可以使用串"$cmd"来代表当前路径,如果你用"."的话,它代表你使用"path"命令
时的路径,gdb将在把DIRECTORY加入搜索路径前用"."代替当前路径

`show paths"
显示当前路径变量的设置情况。

`show environment [VARNAME]"
显示某个环境变量的值。如果你不指明变量名,则gdb会显示所有的变量名和它们的
内容。environment可以被缩写成"env"

`set environment VARNAME [=] VALUE"
设置某个环境变量的值。不过只对你所调试的程序有效。对gdb本身是不起作用的。
值可以是任何串。如果未指定值,则该变量值将被设为NULL.
看一个例子:
set env USER = foo
告诉一个linux程序,当它下一次运行是用户名将是"foo"

`unset environment VARNAME"
删除某环境变量。

注意:gdb使用"shell"环境变量所指定的shell来运行你的程序。

工作路径
================================
当你每次用"run"命令来运行你的程序时,你的程序将继承gdb的
当前工作目录。而gdb的工作目录是从它的父进程继承而来的(一般是
shell)。但你可以自己使用"cd"命令指定工作目录。
gdb的工作目录就是它去寻找某些文件或信息的途径。
`cd DIRECTORY"
把gdb的工作目录设为DIRECTORY
`pwd"
打印输出当前目录。
你程序的输入/输出
===============================
缺省时,你的程序的输入/输出和gdb的输入/输出使用同一个终端。
gdb在它自己和你的程序之间切换来和你交互,但这会引起混乱。
`info terminal"
显示你当前所使用的终端的类型信息。
你可以把你程序的输入/输出重定向。
例如:
run > outfile
运行你的程序并把你程序的标准输出写入文件outfile中。
另一个为你程序指定输入/输出的方法是使用"tty"命令,这个命令
接受一个文件名作为参量把这个文件作为以后使用"run"命令的缺省命
令文件。它还重新为子进程设置控制终端。
例如:
tty /dev/ttyb
指定以后用"run"命令启动的进程使用终端"/dev/ttyb"作为程序的输入
/输出,而且把这个终端设为你进程的控制终端。
一个清楚的使用"run"命令的重定向将重新设置"tty"所设置的内容
,但不影响控制终端。 当你使用"tty"命令或在"run"命令中对输入
/输出进行重定向时,只有你当前调试的程序的输入/输出被改变了,
并不会影响到别的程序。
调试一个已经运行的程序:
====================================

`attach PROCESS-ID"
这个命令把一个已经运行的进程(在gdb外启动)连接入gdb,以便
调试。PROCESS-ID是进程号。(UNIX中使用"ps"或"jobs -l"来查看进程)
"attach"一般不重复。(当你打了一个以上的回车时)
当然要使用"attach"命令的话,你的操作系统环境必须支持进程。
另外你还要有向此进程发信号的权力。
当使用"attach"命令时,你应该先使用"file"命令来指定进程所
联系的程序源代码和符号表。 当gdb接到"attach"命令后第一件
事就是停止进程的运行,你可以使用所有gdb的命令来调试一个"连接"
的进程,就象你用"run"命令在gdb中启动它一样。如果你要进程继续运
行,使用"continue"或"c"命令就行了。
`detach"
当你结束调试后可以使用此命令来断开进程和gdb的连接。(解除gdb
对它的控制)在这个命令执行后进程将继续执行。
如果你在用"attach"连接一个进程后退出了gdb,或使用"run"命令执
行了另一个进程,这个被"attach"的进程将被kill掉。但缺省时,gdb会
要求你确认你是否要退出或执行一个新的进程。

没有评论: