使用修复并继续功能,可以修改和重新编译本地源文件并继续执行,而无需重新生成整个程序。通过更新 .o 文件并将其拼接到程序中,即可不必重新进行链接。
使用修复并继续的优点是:
不必重新链接程序。
不必重新装入调试程序。
可以从修复位置恢复运行程序。
请勿在生成过程中使用 fix 命令。
使用 fix 命令之前,必须编辑源代码。(有关修改代码的方式,请参见使用修复并继续修改源码。)保存更改后,请键入 fix。有关 fix 命令的信息,请参见fix 命令。
调用 fix 命令后,dbx 会使用适当的编译器选项来调用编译器。编译已修改的文件并创建共享对象 (.so) 文件。通过比较新旧文件进行语义测试。
使用运行时链接程序将新的目标文件链接到正在运行的进程。如果正在修复位于栈顶的函数,则新的停止于函数便是新函数中同一行的开头。旧文件中的所有断点均被移到新文件中。
无论文件在编译时是否使用了调试信息,都可以对其使用修复并继续功能,但对于在最初编译时未使用调试信息的文件,fix 命令和 cont 命令有一些功能性限制。有关更多信息,请参见fix 命令中有关 -g 选项的说明。
可以修复共享目标 (.so) 文件,但必须在特殊模式下打开这些文件。在调用 dlopen 函数时,可以使用 RTLD_NOW|RTLD_GLOBAL 或 RTLD_LAZY|RTLD_GLOBAL。
Oracle Solaris Studio C 和 C++ 编译器的预编译头功能要求在重新编译时使用相同的编译器选项。由于 fix 命令会对编译器选项稍加更改,因此请勿对使用预编译头创建的目标文件使用 fix 命令。
使用修复并继续时,可以通过以下方式修改源码:
添加、删除或更改函数中的各代码行
添加或删除函数
添加或删除全局变量和静态变量
将函数从旧文件映射到新文件时,可能会出现问题。要在编辑源文件时尽量减少此类问题:
不要更改函数的名称。
不要添加、删除参数或将其类型更改为函数。
不要添加或删除当前在栈中处于活动状态的函数中的局部变量,也不要更改其类型。
不要对模板声明或模板实例进行更改。只能修改 C++ 模板函数定义的主体。
如果进行上述任一更改,请重新生成整个程序,而不要使用修复并继续。