运行时检查提供了一个强大的错误抑制工具,利用它可以非常灵活地限制所报告错误的数量和类型。如果发生被抑制的错误,则不会生成任何报告,程序会继续执行,就像没有发生错误一样。
可以使用 suppress 命令抑制错误(请参见suppress 命令)。
可以使用 unsuppress 命令撤消对错误的抑制(请参见unsuppress 命令)。
抑制在同一调试会话期间内的各 run 命令中有效,但在各 debug 命令之间,抑制作用无关。
必须指定要抑制的错误类型。可以指定要抑制的程序部分。选项有:
选项 |
说明 |
---|---|
全局 |
缺省值,应用于整个程序。 |
装入对象 |
应用于整个装入对象(如共享库)或主程序。 |
文件 |
应用于特定文件中的所有函数。 |
功能 |
应用于特定函数。 |
行 |
应用于特定源代码行。 |
地址 |
应用于某地址处的特定指令。 |
缺省情况下,运行时检查会抑制最近的错误,以防止对相同的错误生成重复报告。这由 dbx 环境变量 rtc_auto_suppress 控制。当 rtc_auto_suppress 设置为 on(缺省值)时,在特定位置出现的特定访问错误只在首次出现时报告,此后抑制报告。例如,要防止因多次执行的循环中出现某一错误而生成多份同一错误的报告时,这很有用。
可以使用 dbx 环境变量 rtc_error_limit 限制将报告的错误数。错误限制分别用于访问错误和泄漏错误。例如,如果将错误限制设置为 5,那么,运行结束时生成的泄漏报告中和发出的每个 showleaks 命令报告的结果中,均显示最多五个访问错误和最多五个内存泄漏。缺省值为 1000。
在下面的示例中,main.cc 是文件名,foo 和 bar 是函数,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.out 的 rui 以及共享库的 rui、aib 和 air)。可以使用 suppress 命令和 unsuppress 命令的 -d 选项更改此行为。
如果使用以下命令,运行时检查将不再抑制在无符号信息(编译时未使用 -g)的代码中从未初始化的内存中读取 (rui):
unsuppress -d rui |
有关更多信息, 请参见unsuppress 命令。
初次在大型程序上运行时,可能出现无法应付的大量错误。采取分阶段的方法可能会更好。这可以按以下方法完成:使用 suppress 命令将报告错误数减少到便于管理的数量、仅修复这些错误以及重复该循环过程,每次重复时抑制的错误越来越少。
例如,可以每次侧重处理几个类型的错误。通常遇到的最常见错误类型是 rui、rua 和 wua,而且通常是按该顺序出现。rui 错误最不严重(尽管它们可能会导致以后出现较严重的错误)。通常,程序在遇到这些错误时可能仍会正常运行。rua 和 wua 错误比较严重,因为它们是通过无效内存地址进行的访问,而且总是指示编码错误。
可以先抑制 rui 和 rua 错误。修复出现的所有 wua 错误后,再次运行程序,这次只是抑制 rui 错误。修复出现的所有 rua 错误后,再次运行程序,这次不抑制错误。修复所有 rui 错误。最后,再一次运行程序,确保无残余错误。
如果要抑制上一次报告的错误,请使用 suppress -last。