dbx 为优化代码提供部分调试支持。支持的程度主要取决于编译程序的方式。
当分析优化代码时,可以:
在任何函数的开始处停止执行(stop in function 命令)
计算、显示或修改参数
计算、显示或修改全局变量、局部变量或静态变量
从一行到另一行单步执行(next 或 step 命令)
如果在同时启用优化和调试的情况下(使用 -O -g 选项)编译程序,dbx 将在限定模式下进行操作。
关于在什么情况下哪些编译器发出哪种符号信息的详细信息通常被认为是不稳定的接口,可能随版本的变化而不同。
源代码行信息可用,但一个源代码行的代码可能会出现在优化程序的几个不同位置上,所以按源代码行在程序中单步执行会导致“当前行”在源文件中跳转,这取决于优化器如何调度代码。
当函数中的最后一个有效操作是调用另一个函数时,尾部调用优化会导致丢失栈帧。
通常,对于优化程序而言,参数、局部变量和全局变量的符号信息可用。结构、联合、C++ 类的类型信息,以及局部变量、全局变量和参数的类型和名称应该可用。C++ 编译器不提供局部变量的符号类型信息;C 编译器则提供。
优化代码中有时会缺少有关参数和局部变量的位置的信息。如果 dbx 无法找到值,它会报告无法找到。有时该值可能会临时消失,因此请尝试再次单步执行和输出。如果在优化函数的第一个指令处停止,则 dbx 可输出参数的值,因为这些值将位于符合 ABI 标准的寄存器或栈位置中。
基于 SPARC 的系统的 Sun Studio 12 Update 1 编译器提供有关查找参数和局部变量的信息。较新的 GNU 编译器版本也提供此信息。基于 x86 的系统的 Sun Studio 12 Update 1 编译器和 Sun Studio 12 发行版及早期 Sun Studio 发行版中的编译器不提供此信息。
尽管在尚未发生最终寄存器至内存存储的情况下全局变量的值可能不准确,但您仍可以输出全局变量并为这些变量赋值。
Sun Studio 性能分析器手册第 8 章的“函数内联”和“并行化”节中包含调试优化程序时可能有用的信息。
对于 OpenMP 程序,使用 -xopenmp=noopt 选项进行编译即指示编译器不要应用任何优化。但是,为了实现 OpenMP 指令,优化器仍会处理代码,因此,使用 -xopenmp=noopt 编译的程序可能会出现所描述的一些问题。
虽然大多数调试支持要求使用 -g 选项编译程序,但 dbx 仍为未使用 -g 选项进行编译的代码提供以下级别的支持:
栈回溯 (dbx where 命令)
调用函数(但没有参数检查)
检查全局变量
但请注意,除非用 -g 选项编译代码,否则 dbx 无法显示源代码。此限制也适用于使用 strip -x 的代码。
要获得完全支持,共享库也必须使用 -g 选项进行编译。如果利用没有使用 -g 选项进行编译的共享库模块来生成程序,则仍可以调试该程序。但由于未为这些库模块生成信息,所以无法获得完全 dbx 支持。
dbx 能够调试已完全剥离的程序。这些程序包含一些可用来调试程序的信息,但只有外部可见函数可用。有些运行时检查对剥离的程序或装入对象有效:内存使用检查有效,访问检查对使用 strip -x 剥离的代码有效,但对使用 strip 剥离的代码无效。