热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

编写windbg调试器扩展入门篇2

前面一篇是用sources和nmake组合编译生成调试器扩展,步骤比较繁琐,我相信读者应该更倾向于用IDE来编写代码。本篇有2个主题:1.将前面的代码移植到VS上,用IDE编译;2.调试生成的

    前面一篇是用sources和nmake组合编译生成调试器扩展,步骤比较繁琐,我相信读者应该更倾向于用IDE来编写代码。本篇有2个主题:1.将前面的代码移植到VS上,用IDE编译;2.调试生成的扩展命令。

1.移植代码到IDE

    这部分相对简单,所以放在开头。要用IDE代替nmake编译调试器扩展,只要把sources文件中的编译/链接选项复制到VS对应的选项中就可以了。

1.1.设置编译项:

    工程属性-C/C++-常规-附加包含目录中添加头文件的路径:C:\WinDDK\7600.16385.1\Debuggers\sdk\inc

1.2.设置链接项:

工程属性-链接器-输入-附加依赖项中添加库文件的路径:C:\WinDDK\7600.16385.1\Debuggers\sdk\lib\$(ARCH)\dbgeng.lib。对于运行在不同架构的调试器扩展要使用不同的ARCH,我的调试器扩展用于调试x86的程序,因此最终路径为:C:\WinDDK\7600.16385.1\Debuggers\sdk\lib\i386\dbgeng.lib.
上面的截图中"将模块添加到程序集",我在这里直接将exts/目录下的windbgExt.def文件添加进来。当然,你也可以不添加这项,直接在代码中声明导出函数即可。怎么选择取决于个人~

2.调试调试扩展

    写程序难免会出bug,出了bug就得通过调试器定位/解决。平时,我们都是用调试器附加到有问题的程序中调试代码;现在情况变了:windbg在加载扩展命令后变得岌岌可危,如何应对新问题?其实很简单:另起炉灶,新开一个windbg实例,attach到加载了扩展命令的有问题的windbg实例上,就能把新问题变成与调试普通代码一样了。扩展命令本身是Dll程序,通过windbg调用LoadLibrary加载,因此,调试扩展命令可以再细分为两种类型:1.调试Dll入口函数;2.调试其他导出函数,下面仍以demo程序dbgexts.dll为例分类讨论。为了加以区分,我们先做如下约定:加载扩展命令的windbg叫做调试器A,调试有问题的windbg的windbg叫做调试器B。

2.1.调试扩展命令入口函数

    在调试器A加载调试器扩展前,先运行调试器B,并使调试器B attach调试器A上。然后在调试器B中启用加载Dll事件,这样一旦调试器A加载了扩展命令dbgexts,调试器B就会捕捉到调试事件并中断。 以下输出来源于调试器B:
0:002> |.        ;查看当前进程
. 0id: 2324attachname: C:\Users\Administrator\Desktop\DevTools\windbg v10\x86\windbg.exe
0:002> sxe ld dbgexts ;启用Dll加载事件
0:007> lm ;查看调试器A中已加载的模块(至少没加载dbgexts.dll)
start end module name
012a0000 01331000 windbg (pdb symbols) C:\Users\Administrator\Desktop\DevTools\windbg v10\x86\sym\windbg.pdb\CC6E30603ED243FBB418BC2ED0F2FDC71\windbg.pdb
60d60000 6113b000 ext (deferred)
61d40000 621bc000 dbgeng (deferred)
64f60000 6509e000 dbghelp (deferred)
67050000 67109000 exts (deferred)
...
以下输出来源于调试器A:
0:004> .chain
Extension DLL chain:
dbghelp: image 10.0.10586.15, API 10.0.6, built Fri Nov 20 12:39:22 2015
[path: C:\Users\Administrator\Desktop\DevTools\windbg v10\x86\dbghelp.dll]
ext: image 10.0.10586.15, API 1.0.0, built Fri Nov 20 12:39:52 2015
[path: C:\Users\Administrator\Desktop\DevTools\windbg v10\x86\winext\ext.dll]
exts: image 10.0.10586.15, API 1.0.0, built Fri Nov 20 12:39:08 2015
[path: C:\Users\Administrator\Desktop\DevTools\windbg v10\x86\WINXP\exts.dll]
uext: image 10.0.10586.15, API 1.0.0, built Fri Nov 20 12:38:53 2015
[path: C:\Users\Administrator\Desktop\DevTools\windbg v10\x86\winext\uext.dll]
ntsdexts: image 10.0.10586.15, API 1.0.0, built Fri Nov 20 13:08:00 2015
[path: C:\Users\Administrator\Desktop\DevTools\windbg v10\x86\WINXP\ntsdexts.dll]
从上面的输出可以看到目前调试器A尚未加载调试器扩展dbgExts.dll。
    调试器A一旦执行了.load命令,调试器B就会中断。这是加载符号,设置断点的好时机: 以下输出来源于调试器B:
0:001> .sympath+ C:\WinDDK\7600.16385.1\Debuggers\sdk\samples\exts\objchk_win7_x86\i386
Symbol search path is: SRV*;C:\Users\Administrator\Desktop\studio\windbgExt\Debug;
0:001> .reload
Reloading current modules
.....................................................
0:001> bl
0 e 71981898 0001 (0001) 0:**** dbgexts!DebugExtensionInitialize+0x8
根据网上的资料介绍,调试器扩展的初始化函数原型为:
HRESULT
CALLBACK
DebugExtensionInitialize(PULONG Version, PULONG Flags)
于是我在这下了断点,并等待中断,按下F5以后很快就会中断到这个函数。

再次F5,调试器A才会从.load命令中返回。 以下输出来源于调试器A:
0:004> .load C:\WinDDK\7600.16385.1\Debuggers\sdk\samples\exts\objchk_win7_x86\i386\dbgexts.dll
Extension dll detected a break connected to X86
00 01c9fb64 7763ec87 ntdll!DbgBreakPoint
0:004> .chain
Extension DLL chain:
C:\WinDDK\7600.16385.1\Debuggers\sdk\samples\exts\objchk_win7_x86\i386\dbgexts.dll: image 6.1.7600.16385, API 1.0.0, built Wed Aug 09 23:24:43 2017
[path: C:\WinDDK\7600.16385.1\Debuggers\sdk\samples\exts\objchk_win7_x86\i386\dbgexts.dll]
dbghelp: image 10.0.10586.15, API 10.0.6, built Fri Nov 20 12:39:22 2015
[path: C:\Users\Administrator\Desktop\DevTools\windbg v10\x86\dbghelp.dll]
ext: image 10.0.10586.15, API 1.0.0, built Fri Nov 20 12:39:52 2015
对比前面调试器A运行.chain的输出,可以看到现在调试器A已经加载了dbgexts扩展。当然,这也可以从调试器B中获得信息:
以下输出来源于调试器B:
0:003> lml
start end module name
012a0000 01331000 windbg (pdb symbols) C:\Users\Administrator\Desktop
...
71980000 71989000 dbgexts (private pdb symbols) C:\Users\Administrator\Desktop\DevTools\windbg v10\x86\sym\dbgexts.pdb\C92C6D4B2699410CB2A62310F29351D41\dbgexts.pdb

2.2.调试其他导出函数

    调试自定义导出函数相对简单,前面已经加载了调试符号,只要在相应函数入口加断点即可,这里不再赘述。

推荐阅读
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 高端存储技术演进与趋势
    本文探讨了高端存储技术的发展趋势,包括松耦合架构、虚拟化、高性能、高安全性和智能化等方面。同时,分析了全闪存阵列和中端存储集群对高端存储市场的冲击,以及高端存储在不同应用场景中的发展趋势。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 2009年12月28日,易语言公司正式推出了“易语言5.0静态编译测试版1”,这一版本标志着易语言在技术上的重要突破。与之前的4.x版本相比,5.0测试版1引入了静态编译功能,显著提升了程序的运行效率和安全性。此外,新版本还优化了代码生成机制,增强了语言的表达能力和兼容性。自发布以来,用户反馈非常积极,普遍认为新功能带来了更加流畅的开发体验。 ... [详细]
  • 如何查询计算机的显卡型号及性能参数? ... [详细]
author-avatar
哥的微笑帅_655
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有