dbx 可以采用两种方法识别宏定义:
如果使用缺省 DWARF 格式调试信息,在以 –g3 选项进行编译时,编译器会提供定义。如果编译时指定 –xdebugformat=stabs 选项,则不提供定义。
dbx 可以通过略读源文件及其包含文件来重新创建定义。准确的重新创建取决于对原始源文件及包含文件的访问情况。这还取决于所使用编译器的路径名的可用性以及编译器选项(如 –D 和 –I)。可以从 Oracle Developer Studio 编译器(但不能从 GNU 编译器)以 DWARF 和 stabs 格式提供该信息。有关确保成功略读的信息,请参见略读 (skimming) 错误 和使用 pathmap 命令改进略读 (skimming)。
dbxenv 变量 macro_source(请参见定制 dbx中的表 1)可控制 dbx 使用两种方法中的哪一种来识别宏定义。
在选择希望 dbx 使用的方法时,需要考虑多种因素。
选择宏定义方法时要考虑的一个因素是不同类型信息的可用性,这些信息取决于用于生成代码的编译器和编译器选项。下表显示了可根据编译器和调试信息选项选择的方法。
|
选择宏定义方法时另一个要考虑的因素是根据选择的方法在功能方面进行权衡:
可执行文件的大小。略读方法的主要优点是不需要使用 –g3 选项进行编译,因为该方法适用于使用 –g 选项编译而生成的较小可执行文件。
调试格式。略读适用于 DWARF 和 stabs。使用 –g3 选项进行编译以通过编译器获得定义仅适用于 DWARF。
速度。第一次针对 dbx 尚未读取调试信息的模块对表达式求值时,略读最多需要一秒钟。
精确度。使用 –g3 选项进行编译时,编译器提供的信息比略读提供的信息更稳定、更准确。
生成环境的可用性。略读要求编译器、源代码文件以及包含文件在调试过程中可用。dbx 不会检查这些过期的项,因此,如果这些项有可能发生更改,准确性可能会下降,所以使用 –g3 选项进行编译可能好于依靠略读。
在与编译代码的系统不同的系统上进行调试。如果在系统 A 上编译代码而在系统 B 上进行调试,则 dbx 使用 NFS 并借助 pathmap 命令访问系统 A 上的文件。
pathmap 命令还有助于在略读期间访问文件。尽管,它适用于程序的源文件和包含文件,但它可能不适用于系统包含文件,这是因为 /usr/include 通常不通过 NFS 来提供。因此,宏定义将从调试系统(而不是生成系统)的 /usr/include 中提取。
您可以选择了解并容许系统包含文件之间可能存在的差异,或者选择使用 –g3 选项进行编译。
虽然 Fortran 编译器通过 cpp(1) 函数或 fpp(1) 函数支持宏,但 dbx 不支持 Fortran 的宏扩展。
dbx 会忽略使用 –g3 选项和 –xdebugformat=stabs 选项进行编译而生成的宏信息。
有关 stabs 索引的更多信息,请参见 Stab 接口指南(可在 install-dir/solarisstudio12.4/READMEs/stabs.pdf 路径中找到)。
略读适用于使用 –g 选项和 –xdebugformat=stabs 选项编译的代码。