Sun Studio 12 Update 1:使用 dbx 调试程序

第 12 章 调试子进程

本章介绍如何调试子进程。dbx 提供了若干种工具,可帮助调试使用 fork (2) 和 exec (2) 函数创建子进程的进程。

本章由以下部分组成:

连接到子进程

可通过以下方法之一连接到正在运行的子进程。


$ dbx program_name process_id

(dbx) debug program_name process_id

可以将 program_name 替换成名称 -(减号),这样 dbx 便会自动查找与给定进程 ID (process_id) 相关联的可执行程序。使用 - 符号后,后面的 run 命令或 rerun 命令将不起作用,因为 dbx 不知道可执行程序的完整路径名。

也可以在 Sun Studio IDE 中连接到正在运行的子进程(请参见 IDE 联机帮助中的“将调试器连接到正在运行的进程”),或在 dbxtool 中连接到正在运行的子进程(请参见 dbxtool 联机帮助中的“将 dbxtool 连接到正在运行的进程”)。

跟随 exec 函数

如果一个子进程使用 exec(2) 函数或其变体之一执行新程序,进程 ID 不会更改,但进程映像将更改。dbx 会自动记录对 exec() 函数的调用,并隐式重新装入新执行的程序。

可执行程序的原始名称保存在 $oprog 中。要返回原始名称,请使用 debug $oprog 命令。

跟随 fork 函数

如果子进程调用 vfork(2)fork1(2)fork(2) 函数,则进程 id 会发生更改,但进程映像保持不变。根据 dbx 环境变量 follow_fork_mode 的具体设置,dbx 会执行以下操作之一。

Parent

在传统行为中,dbx 将忽略派生而跟随父进程。

Child

dbx 自动切换到使用新进程 ID 的派生子进程。到原始父进程的所有连接以及对该进程的所有认知均丢失。

Both

此模式只有在通过 Sun Studio IDE 或 dbxtool 使用 dbx 时才有效。

Ask

只要 dbx 检测到派生,便会提示您选择 parentchildbothstop to investigate。如果选择 stop,便可以检查程序的状态,然后键入 cont 继续执行;这时会再次提示选择继续的方式。仅在 Sun Studio IDE 和 dbxtool 中支持 both

与事件交互

为所有 exec()fork() 进程删除全部断点和其他事件。通过将 dbx 环境变量 follow_fork_inherit 设置为 on 覆盖对派生进程的删除,或使用 - perm eventspec 修饰符使事件成为持久性事件。有关使用事件规范修饰符的详细信息,请参见cont at 命令