• WinDbg扩展


    WinDbg的扩展,也可以叫插件。它用于实现针对特定调试目标的调试功能,用于扩展某一方面的调试功能。扩展的实现是通过扩展模块(DLL)实现的。Windbg本身已经包含了很多扩展命令,这些扩展为这Windbg调试器提供了强大的功能和灵活性。调试器扩展命令的使用与标准调试器命令非常相似。但是,虽然内置调试程序命令本身是调试程序二进制文件的一部分,但调试程序扩展命令是由与调试程序不同的DLL公开的。windbg可以添加扩展功能,用户可以自己实现一组功能并添加到windbg中,把包含扩展功能的dll文件放到windbg目录下的winext子目录 ,windbg就会自动加载扩展模块。这允许您编写新的调试器命令,这些命令是根据您的特定需求定制的。

    加载调试器扩展DLL

    有几种方法可以加载调试器扩展DLL,以及控制默认调试器扩展DLL和默认调试器扩展路径:

    • 在启动调试程序之前,使用u nt u debugger u extension u path环境变量设置扩展DLL的默认路径。这可以是多个目录路径,用分号分隔。
    • 使用.load(加载扩展dll)命令加载新的dll。
    • 使用.unload(卸载扩展dll)命令卸载dll。
    • 使用.unload all(卸载所有扩展DLL)命令卸载所有调试器扩展。
    • 启动调试器之前,使用-a命令行选项设置默认扩展dll。
    • 使用.extpath(设置扩展路径)命令设置扩展dll搜索路径。
    • 使用.set dll(设置默认扩展dll)命令设置默认扩展dll。
    • 使用.chain(list debugger extensions)命令以默认搜索顺序显示所有加载的调试器扩展模块。
     您也可以通过使用full加载扩展dll!第一次从该模块发出命令时使用module.extension语法。您使用的扩展DLL必须与目标计算机的操作系统匹配。随Windows软件包调试工具一起提供的扩展DLL都放置在安装目录的不同子目录中:
    •  winxp目录包含可用于Windows XP和更高版本的Windows的扩展。
    • winext目录包含可与任何版本的Windows一起使用的扩展。dbghelp.dll模块位于Windows调试工具的基本目录中,也包含此类型的扩展。

    如果编写自己的调试器扩展,则可以将它们放在任何目录中。但是,建议您将它们放在新目录中,并将该目录添加到调试器扩展路径中。最多可以加载32个扩展DLL。

    使用调试器扩展命令

    调试器扩展命令的使用与调试器命令的使用非常相似。该命令在调试器命令窗口中键入,在该窗口中生成输出,或者在目标应用程序或目标计算机中生成更改。实际的调试器扩展命令是调试器调用的DLL中的入口点。

    调试器扩展由以下语法调用:
    ![module.]extension [arguments]
    

    模块名后面不应跟.dll文件扩展名。如果模块包含完整路径,则默认字符串大小限制为255个字符。如果模块尚未加载,则将使用对LoadLibrary(模块)的调用将其加载到调试器中。调试器加载扩展库后,调用getprocAddress函数在扩展模块中查找扩展名。扩展名区分大小写,输入时必须与扩展模块的.def文件中显示的完全一致。如果找到扩展地址,则调用该扩展。

    如果未指定模块名称,调试器将搜索加载的扩展模块以进行此导出。默认搜索顺序如下:
    1. 在所有操作系统和两种模式下工作的扩展模块:dbghelp.dll和winextext.dll。
    2. 可在所有模式下工作但特定于操作系统的扩展模块。对于Windows XP和更高版本的Windows,这是winxpexts.dll。Windows 2000没有相应的模块。
    3. 与所有操作系统一起工作但特定模式的扩展模块。对于内核模式,这是winextkext.dll。对于用户模式,这是winextuext.dll。
    4. 操作系统特定和模式特定的扩展模块。下表指定了此模块。
      Windows BuildUser ModeKernel Mode

      Windows 2000 (free build)

      w2kfre ntsdexts.dll

      w2kfre kdextx86.dll

      Windows 2000 (checked build)

      w2kchk ntsdexts.dll

      w2kchk kdextx86.dll

      Windows XP and later

      winxp ntsdexts.dll

      winxp kdexts.dll

    卸载扩展模块时,它将从搜索链中删除。加载扩展模块时,它将添加到搜索顺序的开头。.set dll(设置默认扩展dll)命令可用于将任何模块提升到搜索链的顶部。通过反复使用此命令,可以完全控制搜索链。使用.chain(list debugger extensions)命令以当前搜索顺序显示所有加载的扩展模块的列表。如果尝试执行不在任何加载的扩展模块中的扩展命令,将收到“导出未找到”错误消息。

    编写新的调试器扩展

    您可以通过编写扩展dll来创建自己的调试命令。例如,您可能希望编写一个命令来显示复杂的数据结构,或者根据某些变量或内存位置的值来停止和启动目标的命令。
    有两种不同类型的调试器扩展:
    • dbgeng扩展。这些是基于dbgeng.h头文件和wdbgexts.h头文件中的原型。
    • WDBGexts扩展。这些都是基于wdbgexts.h头文件中的原型。
    后面会详细讲解编写自己的扩展功能。
  • 相关阅读:
    BZOJ 4726: [POI2017]Sabota? 树形dp
    Codeforces Round #381 (Div. 1) B. Alyona and a tree dfs序 二分 前缀和
    uestc_retarded 模板
    CROC 2016
    Codeforces Round #381 (Div. 1) A. Alyona and mex 构造
    BZOJ 2648: SJY摆棋子 kdtree
    BZOJ 3732: Network 最小生成树 倍增
    HDU 5914 Triangle 数学找规律
    HDU 5902 GCD is Funny 数学
    Codeforces Round #379 (Div. 2) E. Anton and Tree 缩点 直径
  • 原文地址:https://www.cnblogs.com/yilang/p/11418989.html
Copyright © 2020-2023  润新知