Sun Studio 12:使用 dbx 调试程序

第 12 章 调试子进程

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

本章由以下部分组成:

连接到子进程

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


$ dbx program_name process_id

(dbx) debug program_name process_id

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

还可以使用 Sun Studio IDE 中的“调试器”窗口连接到正在运行的子进程。(请参见 IDE 联机帮助中的“将调试器连接到正在运行的进程”。)

跟随 exec 函数

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

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

跟随 fork 函数

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

Parent

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

Child

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

Both

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

Ask

只要 dbx 检测到派生,便会提示您选择 parentchildbothstop to investigate。如果选择 stop,便可以检查程序的状态,然后键入 cont 继续执行;这时会提示选择继续的方式。

与事件交互

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