Sun Studio 12:使用 dbx 调试程序

修复程序

完成更改后,可以使用 fix 命令重新链接源文件,而不必重新编译整个程序。然后即可继续执行程序。

Procedure修复文件

  1. 将所作更改保存到源文件。

  2. dbx 提示符下键入 fix

    虽然修复的次数不受限制,但如果在一行中进行了多次修复,则需要考虑重新生成程序。fix 命令会更改内存中的程序映像,但不更改磁盘上的程序映像。当您进行更多的修复时,内存映像将不再与磁盘中的映像同步。

    fix 命令不在可执行文件中进行更改,而只更改 .o 文件和内存映像。完成程序调试后,必须重新生成程序,以便将所做更改合并到可执行文件中。退出调试时,会出现一条消息,提醒您重新生成程序。

    如果调用 fix 命令时使用 -a 之外的某个选项,并且不带文件名参数,则只修复当前修改的源文件。

    调用 fix 时,会在执行编译行之前搜索编译时操作的文件的当前工作目录。由于从编译时到调试时文件系统结构发生变化,因此可能会在查找正确目录时出现问题。为了避免此问题,请使用 pathmap 命令创建从一个路径名到另一个路径名的映射。映射是应用于源文件路径和目标文件路径。

修复后继续

可以使用 cont 命令继续执行(请参见cont 命令)。

在恢复程序执行之前,需要注意下列决定更改效果的条件。

更改已执行的函数

如果在已执行的函数中进行了更改,这些更改要在出现以下情况后才会生效:

如果不只是对变量进行简单更改,应先使用 fix 命令,然后使用 run 命令。使用 run 命令比较快,因为它不会重新链接程序。

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

如果在尚未调用的函数中进行了更改,这些更改将在调用该函数时生效。

更改当前正在执行的函数

如果对当前正在执行的函数进行了更改,fix 命令的作用取决于更改相对于停止于函数的位置:

更改当前位于栈中的函数

如果已经对当前位于栈中的函数而不是停止于函数进行了更改,当前的函数调用不会使用已更改的代码。 当停止于函数返回时,会执行栈中的旧版本函数。

下列几种方法可以解决此问题:

如果栈中已修改的函数内存在断点,则会将断点移动到函数的新版本中。如果执行了旧版本,则程序不会在这些函数中停止。