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.  使用运行时检查

10.  修复并继续

使用修复并继续

修复并继续如何操作

使用修复并继续修改源码

修复程序

修复文件

修复后继续

更改已执行的函数

更改一个尚未被调用的函数

更改当前正在执行的函数

更改当前位于堆栈中的函数

修复后更改变量

修改头文件

修复 C++ 模板定义

11.  调试多线程应用程序

12.  调试子进程

13.  调试 OpenMP 程序

14.  处理信号

15.  使用 dbx 调试 C++

16.  使用 dbx 调试 Fortran

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

18.  在机器指令级调试

19.  将 dbx 与 Korn Shell 配合使用

20.  调试共享库

A.  修改程序状态

B.  事件管理

C.  宏

D.  命令参考

索引

修复后更改变量

pop 命令或 fix 命令不会撤消对全局变量所做更改。要手动为全局变量赋适当值,请使用 assign 命令。(请参见assign 命令。)

下例显示如何修复简单的错误。在尝试解除 NULL 指针引用时,应用程序在第 6 行发生段故障。

dbx[1] list 1,$
    1    #include <stdio.h>
    2    
    3    char *from = “ships”;
    4    void copy(char *to)
    5    {
    6        while ((*to++ = *from++) != ’\0’);
    7        *to = ’\0’;
    8    }
    9    
    10    main()
    11    {
    12        char buf[100];
    13    
    14        copy(0);
    15        printf("%s\n", buf);
    16        return 0;
    17    }
(dbx) run
Running: testfix
(process id 4842)
signal SEGV (no mapping at the fault address) in copy at line 6 in file “testfix.cc”
    6        while ((*to++ = *from++) != ’\0’);

将第 14 行更改为 copybuf(而不是 0)并保存文件,然后进行修复:

    14        copy(buf);      <=== modified line
(dbx) fix
fixing “testfix.cc” .....
pc moved to “testfix.cc”:6
stopped in copy at line 6 in file “testfix.cc”
    6        while ((*to++ = *from++) != ’\0’)

如果程序从这里继续,仍会发生段故障,因为仍然会将零指针推入堆栈中。可使用 pop 命令从调用堆栈中弹出一帧:

(dbx) pop
stopped in main at line 14 in file “testfix.cc”
      14 copy(buf);

如果程序从这里继续,则程序会运行,但不会输出正确的值,因为全局变量 from 已经递增 1。程序将输出 hips 而不是 ships。可使用 assign 命令恢复全局变量,然后使用 cont 命令。现在,程序会打印正确的字符串:

(dbx) assign from = from-1
(dbx) cont
ships