当前位置:Linux教程 - Linux - GDB调试器使用手册(六-1)

GDB调试器使用手册(六-1)



         得到帮助
    ============
    你可以使用help命令来得到gdb的在线帮助。

    `help\"
    `h\"
    你可以使用help或h后面不加任何参数来得到一个gdb命令类的列表。

    (gdb) help
    List of classes of commands:

    running -- Running the program
    stack -- Examining the stack
    data -- Examining data
    breakpoints -- Making program stop at certain points
    files -- Specifying and examining files
    status -- Status inquiries
    support -- Support facilities
    user-defined -- User-defined commands
    aliases -- Aliases of other commands
    obscure -- Obscure features

    Type \"help\" followed by a class name for a list of
    commands in that class.
    Type \"help\" followed by command name for full
    documentation.
    Command name abbreviations are allowed if unambiguous.
    (gdb)

    `help CLASS\"
    使用上面列出的help class作为help或h的参量,你可以得到单一的命令列表。
    例如显示一个\"status\"类的列表。

    (gdb) help status
    Status inquiries.

    List of commands:

    show -- Generic command for showing things set
    with \"set\"
    info -- Generic command for printing status

    Type \"help\" followed by command name for full
    documentation.
    Command name abbreviations are allowed if unambiguous.
    (gdb)

    `help COMMAND\"
    详细列出单个命令的资料。

    `complete ARGS\"
    列出所有以ARGS开头的命令。例如:

    complete i

    results in:

    info
    inspect
    ignore

    This is intended for use by GNU Emacs.

    除了使用\"help\"你还可以使用gdb的命令\"info\"和\"show\"来查询你程序的
    状态,每个命令可以查询一系列的状态。这些命令以恰当的方式显示所有的
    子命令。

    `info\"
    此命令(可以缩写为\"i\")用来显示你程序的状态。比如,你可以使用info
    args 列出你程序所接受的命令行参数。使用info registers列出寄存器的状态。
    或用info breakpoint列出在程序中设的断点。要获得详细的关于info的信息打
    help info.
    `set\"
    这个命令用来为你的程序设置一个运行环境(使用一个表达式)。比如你
    可以用set prompt $来把gdb的提示符设为$.

    `show\"
    与\"info\"相反,\"show\"命令用来显示gdb自身的状态。你使用\"set\"命令来
    可以改变绝大多数由\"show\"显示的信息。比如使用show radix命令来显示基数。
    用不带任何参变量的\"set\"命令你可以显示所有你可以设置的变量的值。
    有三个变量是不可以用\"set\"命令来设置的。
    `show version\"
    显示gdb的版本号。如果你发现gdb有bug的话你应该在bug-reports里加
    入gdb的版本号。

    `show copying\"
    显示版权信息。

    `show warranty\"
    显示担保信息。
    在gdb下运行你的程序
    **************************
    当你在gdb下运行程序时,你必须先为gdb准备好带有调试信息的可执行文档。
    还可以在gdb中为你的程序设置参变量,重定向你程序的输入/输出,设置环境变
    量,调试一个已经执行的程序或kill掉一个子进程。
    这里许多内容在早先的例子中都已经用到过,可以参见gdb(二)。
    目录:

    * 编译:: 为调试编译带调试信息的代码
    * 运行:: 运行你的程序
    * 参变量:: 为你的程序设置参变量
    * 运行环境:: 为你的程序设置运行时环境
    * 设置工作目录:: 在gdb中设置程序的工作目录。
    * 输入/输出:: 设定你程序的输入和输出
    * 连接:: 调试一个已经运行的程序
    * 结束子进程:: Kill子进程
    * 进程信息:: 附加的进程信息
    * 线程:: 调试带多线程的程序
    * 多进程:: 调试带多进程的程序
    为调试准备带调试信息的代码
    ===========================
    为了高效的调试一个程序,你需要使用编译器来产生附带调试信息的可执行代码
    这些调试信息存储在目标文件中;描述了变量数据类型和函数声明,在原文件代码行
    和执行代码之间建立联系。
    为产生调试信息,当你使用编译器时指定\"-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会废弃原来的符号表并重新读
    入。当前的断点不变。

    发布人:netbull 来自:中国LINUX开发联盟