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

退出打印视图

更新时间: 2016 年 6 月
 
 

抑制错误

运行时检查包括一个强大的错误禁止工具,可极为灵活地限制报告的错误数量和类型。如果发生被抑制的错误,则不会生成任何报告,程序会继续执行,就像没有发生错误一样。

可以使用 suppress 命令禁止错误。

可以使用 unsuppress 命令撤消错误禁止。

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

禁止的类型

本节介绍了可用的禁止类型:

按作用域和类型抑制

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

Global(全局)

缺省值,应用于整个程序

Load Object(装入对象)

应用于整个装入对象(如共享库)或主程序

File(文件)

应用于特定文件中的所有函数

Function(函数)

应用于特定函数

Line(行)

应用于特定源代码行

Address(地址)

应用于某地址处的特定指令

抑制上一错误

缺省情况下,运行时检查将禁止最近的错误,防止重复报告相同的错误。 此设置由 dbx 变量 rtc_auto_suppress 控制。rtc_auto_suppress 设置为 on(缺省值)时,在特定位置出现的特定访问错误只在首次出现时报告,此后抑制报告。此设置非常有用,例如,执行多次的循环中出现错误时,可用于防止出现同一错误报告的多个副本。

限制报告的错误数

您可以使用 dbxenv 变量 rtc_error_limit 限制将报告的错误数。 错误限制分别用于访问错误和泄漏错误。例如,如果错误限制设置为 5,则在运行结束和您发出每条 showleaks 命令时生成的泄漏报告中,最多显示 5 个访问错误和 5 个内存泄漏。 缺省值为 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