JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:使用 dbx 调试程序     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  dbx 入门

2.  启动 dbx

3.  定制 dbx

4.  查看和导航到代码

5.  控制程序执行

6.  设置断点和跟踪

7.  使用调用堆栈

8.  求值和显示数据

9.  使用运行时检查

运行时检查功能

何时使用运行时检查

运行时检查要求

使用运行时检查

启用内存使用和内存泄漏检查

启用内存访问检查

启用所有运行时检查

关闭运行时检查

运行程序

使用访问检查

理解内存访问错误报告

内存访问错误

使用内存泄漏检查

检测内存泄漏错误

可能的泄漏

检查泄漏

理解内存泄漏报告

生成泄漏报告

合并泄漏

修复内存泄漏

利用内存使用检查

抑制错误

抑制的类型

按作用域和类型抑制

抑制上一错误

限制报告的错误数

抑制错误示例

缺省抑制

使用抑制来管理错误

对子进程使用运行时检查

对连接的进程使用运行时检查

在运行 Solaris 的系统中

在运行 Linux 的系统中

结合使用修复并继续功能与运行时检查

运行时检查应用编程接口

在批处理模式下使用运行时检查

bcheck 语法

bcheck 示例

直接在 dbx 中启用批处理模式

疑难解答提示

运行时检查限制

具有更多符号和调试信息时工作效果会更好

SIGSEGVSIGALTSTACK 信号在 x86 平台上受限制

当 8 MB 的所有现有代码中具有足够的补丁区域时工作效果会更好(仅限 SPARC 平台)。

运行时检查错误

访问错误

错误释放 (baf) 错误

重复释放 (duf) 错误

未对齐释放 (maf) 错误

未对齐读 (mar) 错误

未对齐写 (maw) 错误

内存不足 (oom) 错误

从数组越界中读 (rob) 错误

从未分配的内存中读 (rua) 错误

从未初始化的内存中读 (rui) 错误

写入到数组越界内存 (wob) 错误

写入到只读内存 (wro) 错误

写入到未分配内存 (wua) 错误

内存泄漏错误

地址位于块内 (aib) 错误

地址位于寄存器内 (air) 错误

内存泄漏 (mel) 错误

10.  修复并继续

11.  调试多线程应用程序

12.  调试子进程

13.  调试 OpenMP 程序

14.  处理信号

15.  使用 dbx 调试 C++

16.  使用 dbx 调试 Fortran

17.  使用 dbx 调试 Java 应用程序

18.  在机器指令级调试

19.  将 dbx 与 Korn Shell 配合使用

20.  调试共享库

A.  修改程序状态

B.  事件管理

C.  宏

D.  命令参考

索引

抑制错误

运行时检查提供了一个强大的错误抑制工具,利用它可以非常灵活地限制所报告错误的数量和类型。如果发生被抑制的错误,则不会生成任何报告,程序会继续执行,就像没有发生错误一样。

可以使用 suppress 命令抑制错误(请参见suppress 命令)。

可以使用 unsuppress 命令撤消对错误的抑制(请参见unsuppress 命令)。

抑制在同一调试会话期间内的各 run 命令中有效,但在各 debug 命令之间,抑制作用无关。

抑制的类型

下面介绍了一些抑制类型:

按作用域和类型抑制

必须指定要抑制的错误类型。可以指定要抑制的程序部分。选项有:

选项
说明
全局
缺省值,应用于整个程序。
装入对象
应用于整个装入对象(如共享库)或主程序。
文件
应用于特定文件中的所有函数。
功能
应用于特定函数。
应用于特定源代码行。
地址
应用于某地址处的特定指令。

抑制上一错误

缺省情况下,运行时检查会抑制最近的错误,以防止对相同的错误生成重复报告。这由 dbx 环境变量 rtc_auto_suppress 控制。当 rtc_auto_suppress 设置为 on(缺省值)时,在特定位置出现的特定访问错误只在首次出现时报告,此后抑制报告。例如,要防止因多次执行的循环中出现某一错误而生成多份同一错误的报告时,这很有用。

限制报告的错误数

可以使用 dbx 环境变量 rtc_error_limit 限制将报告的错误数。错误限制分别用于访问错误和泄漏错误。例如,如果将错误限制设置为 5,那么,运行结束时生成的泄漏报告中和发出的每个 showleaks 命令报告的结果中,均显示最多五个访问错误和最多五个内存泄漏。缺省值为 1000。

抑制错误示例

在下面的示例中,main.cc 是文件名,foobar 是函数,a.out 是可执行文件的名称。

不报告在函数 foo 中发生分配的内存泄漏。

suppress mel in foo

抑制报告从 libc.so.1 分配的使用的块。

suppress biu in libc.so.1

抑制在 a.out 的所有函数中从尚未初始化的项读取。

suppress rui in a.out

不报告在文件 main.cc 中从未分配项读取。

suppress rua in main.cc

抑制在 main.cc 的第 10 行重复释放。

suppress duf at main.cc:10

抑制报告函数 bar 中的所有错误。

suppress all in bar

有关更多信息,请参见suppress 命令

缺省抑制

为了检测所有错误,运行时检查不要求使用 - g 选项(符号)编译程序。但是,为保证准确检测某些错误(主要是 rui 错误),有时会需要符号信息。为此,如果没有符号信息,缺省情况下,会抑制某些错误(a.outrui 以及共享库的 ruiaibair)。可以使用 suppress 命令和 unsuppress 命令的 -d 选项更改此行为。

如果使用以下命令,运行时检查将不再抑制在无符号信息(编译时未使用 -g)的代码中从未初始化的内存中读取 (rui):

unsuppress -d rui

有关更多信息, 请参见unsuppress 命令

使用抑制来管理错误

初次在大型程序上运行时,可能出现无法应付的大量错误。采取分阶段的方法可能会更好。这可以按以下方法完成:使用 suppress 命令将报告错误数减少到便于管理的数量、仅修复这些错误以及重复该循环过程,每次重复时抑制的错误越来越少。

例如,可以每次侧重处理几个类型的错误。通常遇到的最常见错误类型是 ruiruawua,而且通常是按该顺序出现。rui 错误最不严重(尽管它们可能会导致以后出现较严重的错误)。通常,程序在遇到这些错误时可能仍会正常运行。ruawua 错误比较严重,因为它们是通过无效内存地址进行的访问,而且总是指示编码错误。

可以先抑制 ruirua 错误。修复出现的所有 wua 错误后,再次运行程序,这次只是抑制 rui 错误。修复出现的所有 rua 错误后,再次运行程序,这次不抑制错误。修复所有 rui 错误。最后,再一次运行程序,确保无残余错误。

如果要抑制上一次报告的错误,请使用 suppress -last