云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > gdb手册

gdb手册

  • 62 次阅读
  • 3 次下载
  • 2025/5/4 7:44:04

4.在GDB下运行程序

在GDB下运行程序时,首先必须在编译时生成调试信息。

在你选择的一个环境中,如果有的话,你可以使用参数启动GDB。如果进行的是本地调试,可以重定向程序的输入输出,调试某个已经运行的进程,或者杀掉某个子进程。

4.1 适合调试的编译 4.2 启动程序 4.3 程序的参数 4.4 程序的环境 4.5 程序的工作目录 4.6 程序的输入输出 4.7 调试某个已运行的进程 4.8 杀掉子进程 4.9 多线程程序的调试 4.10 多进程程序的调试

4.1 适合调试的编译

为了有效的调试某个程序,需要在编译的时候生成调试信息。这个调试信息被存储在目标文件中;它描述了各个变量或函数的数据类型,以及可执行代码与源代码行号之间的对应关系。

在运行编译器时,指定“-g”选项,要求编译器产生调试信息。配备给客户的程序是使用最优化编译的,使用的是“-O”选项。可是,好多编译器不能把“-g”和“-O”选项放在一起处理。使用这些编译器,不能产生包含编译信息的最优化可执行代码。

GCC,GNU C/C++编译器,支持附带或不附带“-O”的“-g”,这使得它能够调试优化后的代码。我们建议,只要编译程序,就使用“-g”。你可能认为你的程序是正确的,但不要期望好运会持续。

在调试某个使用“-g –O”编译的程序时,要想到优化程序已经重排了代码,调试器显示给你的是真实的代码。执行路径与源文件不符时,不要太惊讶。一个极端的例子:假如你

定义了一个变量,但是从来没有使用过,GDB根本就看不到到那个变量——因为编译器已经把他优化掉了(译者注:不存在了)。

仅使用“-g”,某些东西跟使用“-g –O”工作的不一样,特别是在有指令调度的机器上。要是不信的话,就单独使用“-g”重新编译,这要是校准这个问题,请把他作为一个bug发送给我们(包括测试条件)。要得到更多有关调试优化代码的信息,参见8.2 程序变量一章。

老版本的GCC编译器允许有一个不同的选项“-gg”用于生成调试信息。GDB现已不再支持这个格式。要是你的GCC有这个选项,请不要使用。

GDB了解有关的预处理宏,而且可以把它展开后显示给你(参见9.C的预处理宏一章)。单独指定“-g”标志,大部分编译器不会在调试信息中包含有关预处理宏的信息,因为这些信息是相当庞大的。3.1及其以后版本的GCC中的GNU C编译器,如果指定了“-gdwarf-2”和“-g3”选项,可以提供宏的信息。前一个选项要求产生Dwarf 2格式的调试信息,后一个选项要求产生“非常信息(extra information)”。今后,我们希望找到些更紧凑的方式来描述宏信息,以使它单独使用“-g”就可以被包含。

4.2 启动程序

run

r

利用run命令在GDB下启动程序。首先必须使用一个参数给GDB指定程序的名称(除非是在VxWorks上),或者使用file或exe-file命令指定(见指定文件的命令一节)

如果在一个支持进程的环境下运行程序,run创建一个次级进程,让这个进程来运行程序。(在没有进程的环境下,run跳转的程序的开始处)。

某个程序的执行,受到从它上级接收到的某些信息的影响。GDB提供了指定这些信息的方式,但必须在程序启动之前指定。(虽然能够在程序启动之后更改它,但是所作的更改只能在程序下次启动后才有作用。)这些信息可以被划分为四类:

参数

把参数最为运行命令参数指定给程序。如果在你的目标上有一个shell可用,那么这个shell通常用于传递这个参数,以便于可以利用常规描述参数的约定(如通配符展开或变量置换)。在UNIX系统中,可以利用SHELL环境变量控制使用哪一

个Shell。参见程序的参数一节。

环境

程序一般从GDB继承它的环境,但是也可以使用GDB命令set environment与unset environment更改某些影响程序的局部环境。参见程序的环境一节。

工作目录

程序从GDB继承它的工作目录,在GDB中可以使用cd命令设置GDB的工作目录。参见程序的工作目录一节。

标准输入输出

程序一般与GDB所使用的相同的设备作为标准输入输出。可以在run的命令行里从定向输入输出,或者使用tty命令给程序设定一个不同的设备。见程序的输入输出一节。

警告:当输入输出从定向生效时,不能使用管道传递正调试的程序的输入给另外一个程序。试图这么做的话,GDB可能终止调试错误的程序。

下达run命令时,程序会立即开始执行。有关讨论怎样安排程序的停止,见停止与继续一节。一旦程序已经停止,就可以使用print或call命令调用程序中的函数。参见检验数据一章。

自上一次GDB读取符号后,符号文件的修改时间已更改的话,GDB会重读它。当做这件事的时候,GDB会努力保持当前的断点。

start

不同的语言,主过程名也不相同。C或C++的主过程永远是main,但是像Ada就不要求为它们的主过程起个特殊的名字。调试器提供了一个方便的方法开始程序的执行,并在主过程的起始位置停住,这依赖于所使用的语言。

“start”命令相当于在程序主过程的起始位置设置一个临时断点之后调用“run”命令。

有些程序会包含一个细化(elaboration)阶段,有些代码在主过程被调用之前执行。这取决于编写程序的具体语言。例如,在C++中,静态的与全局的对象的构造函

数会在main被调用之前执行。这使得调试器在达到主过程之前停止程序成为可能。不管怎样,临时断点仍然会停止程序的执行。

程序的参数可以作为“start”命令的参数指定给程序。这些参数会精确地传递给次级的“run”命令。要注意,后面调用的“start”或“run”没有提供给参数的话,会重用前面提供的那个参数。

在细化期间调试程序,有些时候是必要的。在这种情况下,使用start命令对于停止程序的执行来说,那太晚了,因为这时程序早已完成了细化阶段。在这种情况下,在运行程序之前在细化代码中插入断点。

4.3 程序的参数

程序的参数可由“run”命令的参数指定。它们被传递给一个shell,展开通配符并重定向标I/O,最后传递给程序。SEHLL环境变量(如果有)规定了GDB使用什么shell。如果没有定义SHELL,GDB会使用默认的shell(在UNIX上是“/bin/sh”)。

在非UNIX系统上,程序一般由GDB直接调用,利用适当的系统调用来模拟I/O重定向,同时,通配符由程序的启动代码展开,而不是shell。

没有参数的run通常使用前一个run的参数,或者是set args命令指定的那些。 set args

指定下次程序运行用到的参数。如果set args没有参数,run不传递参数而执行程序。一旦使用参数run了程序,那么在下次run程序之前使用set args,是再次不使用参数run程序的唯一方法。

show args

显示启动时传给程序的参数。

4.4 程序的环境

“环境”由一组环境变量和它们对应的值构成。环境变量通常记录着如:用户名、HOME

搜索更多关于: gdb手册 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

4.在GDB下运行程序 在GDB下运行程序时,首先必须在编译时生成调试信息。 在你选择的一个环境中,如果有的话,你可以使用参数启动GDB。如果进行的是本地调试,可以重定向程序的输入输出,调试某个已经运行的进程,或者杀掉某个子进程。 4.1 适合调试的编译 4.2 启动程序 4.3 程序的参数 4.4 程序的环境 4.5 程序的工作目录 4.6 程序的输入输出 4.7 调试某个已运行的进程 4.8 杀掉子进程 4.9 多线程程序的调试 4.10 多进程程序的调试 4.1 适合调试的编译 为了有效的调试某个程序,需要在编译的时候生成调试信息。这个调试信息被存储在目标文件中;它描述了各个变量或函数的数据类型,以及可执行代码与源代码行号之间的对应关系。 在运行编译器时,指定“-g”选项,要求编译器产生调试信息

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com