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.  命令参考

索引

使用运行时检查

要使用运行时检查,请在运行程序前启用要使用的检查类型。

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

要启用内存使用和内存泄漏检查,请键入:

(dbx) check -memuse

启用了内存使用检查或内存泄漏检查时,showblock 命令将显示有关指定地址处堆块的详细信息。这些详细信息包括块分配的位置及其大小。有关更多信息,请参见showblock 命令

启用内存访问检查

要仅启用内存访问检查,请键入:

(dbx) check -access

启用所有运行时检查

要启用内存泄漏、内存使用和内存访问检查,请键入:

(dbx) check -all

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

关闭运行时检查

要彻底关闭运行时检查,请键入:

(dbx) uncheck -all

有关详细信息,请参见uncheck 命令

运行程序

在启用了所需类型的运行时检查之后,可运行所测试的程序(是否使用断点均可)。

程序正常运行,但速度很慢,因为每次进行内存访问前都要检查其有效性。如果 dbx 检测到无效访问,便会显示错误的类型和位置。控制权将交还给您(除非 dbx 环境变量 rtc_auto_continue 设置为 on,请参见设置 dbx 环境变量。)

然后便可发出 dbx 命令,例如执行 where 获取当前堆栈跟踪,或执行 print 检查变量。如果命令不是致命错误,可以使用 cont 命令继续执行程序。程序继续执行,直至遇到下一个错误或断点(无论先检测到哪一个)。有关详细信息,请参见cont 命令

如果 rtc_auto_continue 环境变量设置为 on,则运行时检查会继续查找错误,并自动保持运行。它将错误重定向至 dbx 环境变量 rtc_error_log_file_name 命名的文件。(请参见设置 dbx 环境变量。)缺省的日志文件名为 /tmp/dbx.errlog.uniqueid

可以使用 suppress 命令限制报告运行时检查错误。有关详细信息,请参见suppress 命令

下面的简单示例说明了如何对名为 hello.c 的程序启用内存访问和内存使用检查。

% cat -n hello.c
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4
     5 char *hello1, *hello2;
     6
     7 void
     8 memory_use()
     9 {
    10      hello1 = (char *)malloc(32);
    11      strcpy(hello1, "hello world");
    12      hello2 = (char *)malloc(strlen(hello1)+1);
    13      strcpy(hello2, hello1);
    14 }
    15
    16 void
    17 memory_leak()
    18 {
    19      char *local;
    20      local = (char *)malloc(32);
    21      strcpy(local, "hello world");
    22 }
    23
    24 void
    25 access_error()
    26 {
    27      int i,j;
    28
    29      i = j;
    30 }
    31
    32 int
    33 main()
    34 {
    35      memory_use();
    36      access_error();
    37      memory_leak();
    38      printf("%s\n", hello2);
    39      return 0;
    40 }
% cc -g -o hello hello.c

% dbx -C hello
Reading ld.so.1
Reading librtc.so
Reading libc.so.1
Reading libdl.so.1

(dbx) check -access
access checking - ON
(dbx) check -memuse
memuse checking - ON
(dbx) run Running: hello
(process id 18306)
Enabling Error Checking... done
Read from uninitialized (rui):
Attempting to read 4 bytes at address 0xeffff068
     which is 96 bytes above the current stack pointer
Variable is ’j’
Current function is access_error
    29       i = j;
(dbx) cont
hello world
Checking for memory leaks...
Actual leaks report    (actual leaks:         1 total size:      32 bytes)

 Total      Num of  Leaked     Allocation call stack
 Size       Blocks  Block
                    Address
==========  ====== ==========  =======================================
        32       1    0x21aa8  memory_leak < main

Possible leaks report  (possible leaks:       0  total size:      0 bytes)

Checking for memory use...
Blocks in use report   (blocks in use:        2  total size:      44 bytes

 Total     % of Num of  Avg    Allocation call stack
 Size      All  Blocks  Size
========== ==== ====== ======  =======================================
        32  72%      1     32  memory_use < main
        12  27%      1     12  memory_use < main

execution completed, exit code is 0

函数 access_error() 在变量 j 被初始化前便读取它。运行时检查将此访问错误报告为从尚未初始化项读取 (rui)。

函数 memory_leak() 在其返回前没有释放变量 localmemory_leak() 返回时,此变量超出作用域,在第 20 行分配的块变为泄漏。

程序使用全局变量 hello1hello2,这两个变量始终处于作用域内。它们都指向动态分配的内存,这种情况报告为使用的块 (biu)。