本章介绍如何调试子进程。dbx 提供了若干种工具,可帮助调试使用 fork (2) 和 exec (2) 函数创建子进程的进程。
本章由以下部分组成:
可以将 program_name 替换成名称 -(减号),这样 dbx 便会自动查找与给定进程 ID (process_id) 相关联的可执行程序。使用 - 符号后,后面的 run 命令或 rerun 命令将不起作用,因为 dbx 不知道可执行程序的完整路径名。
也可以在 Oracle Solaris Studio IDE 中连接到正在运行的子进程(请参见 IDE 联机帮助中的“将调试器连接到正在运行的进程”),或在 dbxtool 中连接到正在运行的子进程(请参见 dbxtool 联机帮助中的“将 dbxtool 连接到正在运行的进程”)。
如果一个子进程使用 exec(2) 函数或其变体之一执行新程序,进程 ID 不会更改,但进程映像将更改。dbx 会自动记录对 exec() 函数的调用,并隐式重新装入新执行的程序。
可执行程序的原始名称保存在 $oprog 中。要返回原始名称,请使用 debug $oprog 命令。
如果子进程调用 vfork(2)、fork1(2) 或 fork(2) 函数,则进程 id 会发生更改,但进程映像保持不变。根据 dbx 环境变量 follow_fork_mode 的具体设置,dbx 会执行以下操作之一。
在传统行为中,dbx 将忽略派生而跟随父进程。
dbx 自动切换到使用新进程 ID 的派生子进程。到原始父进程的所有连接以及对该进程的所有认知均丢失。
只有在通过 Oracle Solaris Studio IDE 或 dbxtool 使用 dbx 时,此模式才有效。
只要 dbx 检测到派生,便会提示您选择 parent、child、both 或 stop to investigate。如果选择 stop,便可以检查程序的状态,然后键入 cont 继续执行;这时会再次提示选择继续的方式。只有在 Oracle Solaris Studio IDE 和 dbxtool 中才支持 both。
为所有 exec() 或 fork() 进程删除全部断点和其他事件。通过将 dbx 环境变量 follow_fork_inherit 设置为 on 覆盖对派生进程的删除,或使用 - perm eventspec 修饰符使事件成为持久性事件。有关使用事件规范修饰符的更多信息,请参见cont at 命令。