Oracle® Developer Studio 12.5:使用 dbx 调试程序

退出打印视图

更新时间: 2016 年 6 月
 
 

对象文件和可执行文件中的调试信息

为了获得最佳结果,您可使用 -g 选项编译源文件,以使程序的可调试性更好。-g 选项会使编译器将调试信息(采用 stabs 或 DWARF 格式)与程序的代码和数据一起记录到对象文件中。

需要调试信息时,dbx 会根据需要解析和装入每个对象文件(模块)的调试信息。可以使用 module 命令让 dbx 装入有关任何特定模块或所有模块的调试信息。另请参见查找源文件和对象文件

对象文件装入

将对象 (.o) 文件链接到一起后,链接程序可选择只将摘要信息存储到生成的装入对象中。dbx 可以在运行时使用此摘要信息从对象文件本身(而不是可执行文件)装入其余调试信息。生成的可执行文件占用的磁盘资源较小,但要求在 dbx 运行时能够使用对象文件。

使用 -xs 选项编译对象文件可覆盖此要求,从而使这些对象文件的所有调试信息在链接时都被放入可执行文件中。

如果使用对象文件创建归档库(.a 文件),并且在程序中使用归档库,则 dbx 会根据需要从归档库中提取对象文件。此时不需要原始对象文件。

将所有调试信息放入可执行文件的唯一缺点是会占用更多磁盘空间。由于运行时调试信息并未装入到进程映像中,因此程序运行速度不会降低。

使用 stabs 时的缺省行为是使编译器只将摘要信息放入可执行文件中。

通过使用 –xs 选项,您可利用 DWARF 创建对象文件。有关更多信息,请参见索引 DWARF (-xs[={yes|no}])


注 -  记录相同的信息时,使用 DWARF 格式要比使用 stabs 格式紧凑得多。但是,由于将全部信息都复制到可执行文件中,因此 DWARF 信息所占的空间看上去要比 stabs 信息所占的空间大。

有关 stabs 索引的更多信息,请参见 Stab 接口指南(可在 install-dir/solarisstudio12.4/READMEs/stabs.pdf 路径中找到)。

用于支持调试的编译器和链接程序选项

使用编译器和链接程序选项,用户可更自由地生成和使用调试信息。编译器为 DWARF 生成索引,这与索引 stabs 类似。该索引始终存在,并可在使用 DWARF 进行调试时加快 dbx 启动速度并带来其他改进。

下图显示了不同类型的调试信息及其位置,特别突出显示了调试数据所在的位置:

图 1  调试信息流

image:图中显示了选中后可影响调式数据所在位置的选项。

索引 DWARF (–xs[={yes|no}])

缺省情况下,DWARF 已装入可执行文件。新索引可使用 –xs=no 选项将 DWARF 保留在对象文件中。这样可生成更小的可执行文件和更快的链接。对象文件必须保留,以便进行调试。这与 stabs 的工作原理类似。

独立的调试文件 (–z ancillary[=outfile])

Oracle Solaris 11.1 链接程序可以将调试信息发送到单独的辅助文件,同时生成可执行文件。在必须移动、安装或归档所有调试信息的环境中,独立的调试文件非常有用。可执行文件既可独立运行,也可由用户使用其独立的调试文件副本进行调试。

dbx 继续支持使用 GNU 实用程序 objcopy 将调试信息提取到独立的文件中,但与 objcopy 相比,使用 Oracle Solaris 链接程序具有以下优点:

  • 独立的调试文件作为链接的副产物生成

  • 由于过大而难以作为一个文件链接的程序可作为两个文件链接为两个文件

有关更多信息,请参见辅助文件(仅限 Oracle Solaris)

最大程度地减少调试信息

–g1 编译器选项旨在实现已部署应用程序的最小可调试性。使用此选项编译应用程序时,将生成文件、行号以及系统认为对事后调试至关重要的简单参数信息。有关更多信息,请参见编译器手册页和编译器用户指南。

列出模块的调试信息

module 命令及其选项有助于在调试会话期间跟踪程序模块。使用 module 命令可读入一个模块或所有模块的调试信息。 一般情况下,dbx 会根据需要自动并且延后读入模块的调试信息。

要读入模块的调试信息:

(dbx) module [-f] [-q] name

要读入所有模块的调试信息:

(dbx) module [-f] [-q] -a

其中:

-a

指定所有模块

-f

强制读取调试信息,即使该文件比可执行文件新也是如此。

-q

指定静默模式。

-v

指定冗余模式,在该模式下会输出语言、文件名等信息。这是缺省值。

要输出当前模块的名称,请键入:

(dbx) module

列出模块

modules 命令通过列出模块名称可帮助您跟踪模块。

要列出包含已读入 dbx 的调试信息的模块的名称,请键入:

(dbx) modules [-v] -read

要列出所有程序模块(无论是否包含调试信息)的名称,请键入:

(dbx) modules [-v]

要列出包含调试信息的所有程序模块,请键入:

(dbx) modules [-v] -debug

其中:

-v

指定冗余模式,在该模式下会输出语言、文件名等信息。