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

索引

运行时检查错误

运行时检查报告的错误一般分两类,即访问错误和泄漏。

访问错误

如果启用了访问检查,运行时检查会检测并报告下列类型的错误。

错误释放 (baf) 错误

问题: 尝试释放尚未分配的内存。

可能的原因: 将非堆数据指针传递给了 free()realloc()

示例:

char a[4];
char *b = &a[0];

free(b);                    /* Bad free (baf) */

重复释放 (duf) 错误

问题: 尝试释放已释放过的堆块。

可能的原因: 多次使用同一指针调用 free()。在 C++ 中,多次对同一指针使用删除操作符。

示例:

char *a = (char *)malloc(1);
free(a);
free(a);                    /* Duplicate free (duf) */

未对齐释放 (maf) 错误

问题: 尝试释放未对齐的堆块。

可能的原因: 将未正确对齐的指针传递给了 free()realloc();更改了 malloc 返回的指针。

示例:

char *ptr = (char *)malloc(4);
ptr++;
free(ptr);                    /* Misaligned free */

未对齐读 (mar) 错误

问题: 尝试从未正确对齐的地址中读取数据。

可能的原因: 分别从那些没有半字对齐、字对齐或双字对齐的地址中读取 2 个、4 个或 8 个字节。

示例:

char *s = “hello world”;
int *i = (int *)&s[1];
int j;

j = *i;                    /* Misaligned read (mar) */

未对齐写 (maw) 错误

问题: 尝试将数据写入未正确对齐的地址。

可能的原因: 将 2 个、4 个或 8 个字节分别写入没有半字对齐、字对齐或双字对齐的地址。

示例:

char *s = “hello world”;
int *i = (int *)&s[1];

*i = 0;                    /* Misaligned write (maw) */

内存不足 (oom) 错误

问题: 尝试分配超出可用物理内存的内存。

原因: 程序无法从系统获得更多的内存。查找在未检查 malloc() 的返回值是否为 NULL(一个常见编程错误)时发生的问题时会有用。

示例:

char *ptr = (char *)malloc(0x7fffffff);
/* Out of Memory (oom), ptr == NULL */

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

问题:尝试从数组越界内存中进行读取。

可能的原因:溢出堆块边界的迷失指针。

示例:

char *cp = malloc (10);
char ch = cp[10];

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

问题: 尝试从不存在、未分配或未映射的内存中进行读取。

可能的原因: 溢出堆块边界或访问已被释放的堆块的迷失指针。

示例:

char *cp = malloc (10);
free (cp);
cp[0] = 0;

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

问题: 尝试从未初始化的内存中进行读取。

可能的原因: 读取尚未初始化的局部数据或堆数据。

示例:

foo()
{   int i, j;
    j = i;    /* Read from uninitialized memory (rui) */
}

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

问题:尝试写入到数组越界内存。

可能的原因:溢出堆块边界的迷失指针。

示例:

char *cp = malloc (10);
cp[10] = 'a';

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

问题: 尝试写入到只读内存。

可能的原因: 向文本地址写入、向只读数据区 (.rodata) 写入或向已由 mmap 设置为只读的页写入。

示例:

foo()
{   int *foop = (int *) foo;
    *foop = 0;                /* Write to read-only memory (wro) */
}

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

问题: 尝试写入到不存在、未分配或未映射的内存。

可能的原因: 溢出堆块边界或访问已被释放的堆块的迷失指针。

示例:

char *cp = malloc (10);
free (cp);
cp[0] = 0;

内存泄漏错误

启用了泄漏检查时,运行时检查会报告下列类型的错误。

地址位于块内 (aib) 错误

问题: 可能的内存泄漏。没有对已分配块开始处的引用,但至少有一个对块内地址的引用。

可能的原因: 指向块开始处的唯一指针增加。

示例:

char *ptr;
main()
{
   ptr = (char *)malloc(4);
   ptr++;    /* Address in Block */
}

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

问题: 可能的内存泄漏。尚未释放已分配块,程序内存中不存在对块的引用,但寄存器中存在引用。

可能的原因: 如果编译器只将程序变量保留在寄存器中,而不保留在内存中,自然会出现这种错误。编译器常常会在启用了优化功能的情况下这样处理局部变量和函数参数。如果在未启用优化功能的情况下出现这种错误,则可能是真正的内存泄漏。如果指向已分配块的唯一指针在块被释放前超出作用域,便会出现这种情况。

示例:

if (i == 0) {
       char *ptr = (char *)malloc(4);
       /* ptr is going out of scope */
}
  /* Memory Leak or Address in Register */

内存泄漏 (mel) 错误

问题: 尚未释放已分配块,程序中不存在对块的引用。

可能的原因: 程序未能释放不再使用的块。

示例:

char *ptr;

    ptr = (char *)malloc(1);
    ptr = 0;
/* Memory leak (mel) */