使用 DBH

DBH 是一种命令行工具,可公开 DbgHelp API (dbghelp.dll) 中的许多函数。 它可以显示有关符号文件内容的信息,显示文件中符号的特定详细信息,并在文件中搜索与各种条件匹配的符号。

DBH 提供的功能类似于 WinDbg、KD 和 CDB 中由命令(如 x (检查符号) 提供的功能)。

在交互模式下运行 DBH

使用简单的命令行启动 DBH,在该命令行上指定要调查其符号的目标模块。 目标模块可以是 EXE 程序或 PDB 符号文件。 还可以 (PID) 指定要调查的进程 ID。 有关完整语法,请参阅 DBH Command-Line 选项

当 DBH 启动时,它将加载指定模块的符号,然后提供一个提示,你可以在其中键入各种命令。 有关可用命令的列表,请参阅 DBH 命令。

例如,以下序列通过指定进程 ID 为 4672 的目标进程来启动 DBH,然后在 DBH 提示符处执行 枚举 命令以显示与特定模式匹配的符号,然后执行 q 命令退出 DBH:

C:\> dbh -p:4672 
            400000 : TimeTest
          77820000 : ntdll
          77740000 : kernel32

pid:4672 mod:TimeTest[400000]: enum TimeTest!ma* 

 index            address     name
     1             42cc56 :   main
     3             415810 :   malloc
     5             415450 :   mainCRTStartup

pid:4672 mod:TimeTest[400000]: q 

goodbye 

在批处理模式下运行 DBH

如果只想运行单个 DBH 命令,可以在命令行的末尾指定它。 这会导致 DBH 启动、加载指定的模块、运行指定的命令,然后退出。

例如,可以将前面的示例替换为单个命令行:

C:\> dbh -p:4672 enum TimeTest!ma* 
           400000 : TimeTest
         77820000 : ntdll
         77740000 : kernel32

index            address     name
    1             42cc56 :   main
    3             415810 :   malloc
    5             415450 :   mainCRTStartup 

这种运行 DBH 的方法称为 批处理模式,因为它可以在批处理文件中轻松使用。 此版本的命令行后跟一个管道 ( | ) 将 DBH 输出重定向到另一个程序。

指定目标

DBH 可以通过三种方式选择目标:按正在运行的进程 ID、可执行文件的名称或符号文件的名称。 例如,如果当前只有一个进程 ID 为 1234 的 MyProg.exe 实例正在运行,则以下命令几乎等效:

C:\> dbh -v -p:1234 
C:\> dbh -v c:\mydir\myprog.exe 
C:\> dbh -v c:\mydir\myprog.pdb 

这些命令之间的一个区别是,通过指定进程 ID 启动 DBH 时,DBH 将使用此过程使用的实际虚拟地址。 通过指定可执行文件名称或符号文件名启动 DBH 时,DBH 假定模块的基址是标准值, (例如,0x01000000) 。 然后,可以使用 base 命令指定实际基址,从而移动模块中所有符号的地址。

DBH 不会以调试器的方式附加到目标进程。 DBH 不会导致进程开始或结束,也不能更改该进程的运行方式。 若要通过进程 ID 将 DBH 附加到进程,目标进程必须运行,但启动 DBH 后,可以终止目标进程,并且 DBH 将继续访问其符号。

修饰和未修饰的符号

默认情况下,DBH 在显示和搜索符号时使用未修饰的符号名称。 如果关闭 SYMOPT_UNDNAME 符号选项,或在 DBH 命令行中包含 -d 选项,则将包含修饰。

有关符号修饰的信息,请参阅 公共符号和专用符号

正在退出 DBH

若要退出 DBH,请在 DBH 提示符处使用 q 命令。