Windbg扩展指令开发教程

之前我曾提供了导出stl map和set内容的windbg扩展指令库,并给出了使用方法。授人以鱼不如授人以渔,下面的文章将以开发一个导出CMap容器内容的windbg扩展指令cmap为例,介绍如果开发一个windbg的扩展指令库。


1. windbg扩展指令

Windbg自身提供丰富的扩展指令,使得它的调试功能十分强大。通常,我看到的以!开头的指令就是扩展指令,而这些扩展指令大多由windbg安装目录下winext、winxp等子目录中的DLL导出。
有时候我们也需要开发自己的扩展指令,用以方便地完成特殊的调试任务。例如,我们很可能需要导出一个存储了大量数据CMap容器的内容,开发一个自己的CMap导出指令会很方便地解决问题。
开发一个扩展指令,实质上就是要按照debug engine定义的开发规范,开发一个导出了扩展指令的扩展DLL。扩展DLL可以分为3类,在Windbg目录下sdk\sample中提供了对应的简单示例:
  • DbgEng extension DLLs。这种类型是基于dbgeng.h头文件提供的接口所开发的DLL并导出DbgEng 扩展指令。这类指令的实现过程中可以使用Debugger Engine的API并且也能使用WdbgExts API。(示例代码名称:exts)
  • EngExtCpp extension DLLs。 这种类型是基于engextcpp.h和dbgeng.h头文件中提供的接口开发的DLL。导出DbgEng 扩展指令。这类指令在实现过程中可以使用Debugger Engine的API,EngExtCpp 扩展框架提供的接口,同时也能使用WdbgExts API。(示例代码名称:extcpp)
  • WdbgExts extension DLLs。这种类型基于wdbgexts.h头文件提供的接口开发并导出DbgEng 扩展指令。指令开发中只能使用WdbgExts API。(示例代码名称:simplext)

2. EngExtCpp扩展指令开发

EngExtCpp扩展指令是按照C++的语法进行开发,下面的内容将主要介绍如何开发这种类型的指令。在windbg官方帮助文档中有名为EngExtCpp Extension Design Guide的专题对EngExtCpp扩展指令的开发做了一定的介绍,不一定适用,但是可以参考其中的基本概念。

2.1 创建完整的EngExtCpp工程

按照windbg官方帮助文档提供的开发方案,扩展插件需要在DDK环境编译,显然比较麻烦。而且按照它的方法,我用DDK没有成功编译过它所提供的示例代码。事实上,在VC环境中照样能够开发出扩展指令。下面就以在VS2008中开发一个导出CMap内容的 扩展指令cmap 为例,说明主要的过程。
1) 创建一个空白的win32 DLL工程。
2) 向工程添加 engextcpp.hpp和engextcpp.cpp两个现有文件,文件所在路径位于Windbg安装目录下 sdk\sample\inc。按照Windbg帮助文档的说明,以及官方示例代码的内容显示,原本我们只需要包含头文件 engextcpp.hpp,并连接engextcpp.lib静态库就能完成开发,但是事实上直接使用静态库在连接过程中会出现错误,并不能成功编译,所以我 选择了直接包含engextcpp.cpp源文件的方法,而不去连接engextcpp.lib
3) 向工程中添加一个新建的cpp文件,命名为mtlkit.cpp。这个文件的内容就是我们实现扩展指令
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值