定制调试诊断工具和实用程序(6)
2006-07-20 11:42:24 来源:WEB开发网回到 DLL Hell
前面我们已经看到获取所有静态或动态加载的 DLLs 列表是很容易的事情。但是对动态加载的DLL而言,情况比想象的稍微复杂一些。例如,DllSpy 和 ProcessSpy 两个工具依据某个时间点获得的快照。因此,有可能出现来不及扫描某个被快速加载和卸载的DLL。Win32 调试 API 提供了对这个问题的解决办法:在调试程序时, 这些 API 可以对被调试程序加载和卸载的任何DLL了如指掌。
要实现我的意图,并不需要一个功能完整,名副其实的调试器,但我必须侦测到新 DLL 何时被加载到进程地址空间。因此,我将讨论 Win32 调试 API 的基本知识以及它们在 Windows NT、Windows 2000 和 Windows XP 操作系统中有用的扩展。
为了调试一个程序,你首先必须使用用下面这些特殊的标志之一调用 CreateProcess 来启动拟调试的程序。DEBUG_PROCESS 表示请求来自被调试程序以及被调试程序启动的每一个进程的事件。DEBUG_ONLY_THIS_PROCESS 表示只请求来自被调试程序的事件(而不是来自其子进程的事件)。
使用 DEBUG_ONLY_THIS_PROCESS 标志时,调试器将接收不到来自被调试程序启动的进程事件。性能监视器(perfmon.exe)就是一个很好的例子,此标志对这个程序没有作用。性能监视器是一个简单的打包程序,其作用 只不过是启动另外一个程序——微软管理控制台(MMC),并传递任何所需的参数使它显示性能计数器。
在被调试程序的生命期内,Windows 通知调试器 Figure 1 所列出的事件。这些事件由 DEBUG_EVENT 结构描述,如 Figure 2 所示。
为了接收这些事件,调试器必须调用 WaitForDebugEvent。该函数阻塞调试器的运行,直到被调试程序发生 Figure 1 所列的事件之一,或者超时参数中给定的秒数为止。当调试器处理某个事件时,它调用 ContinueDebugEvent 让被调试程序继续其生命之旅。注意:在调试器中,当 WaitForDebugEvent 解除阻塞时,所有被调试者线程被冻结,在调用 ContinueDebugEvent 期间被解冻。参见 Figure 3:
- ››调试SQL server 2008功能设置
- ››调试JavaScript错误
- ››定制个性化的对话框窗口类
- ››定制 SWT/RCP 界面:如何编写一个漂亮的 SWT/RCP ...
- ››调试和测试 Swing 代码
- ››定制基于 Visual studio 2005 平台 Windows CE(AR...
- ››定制版黑雨 blackra1n 越狱3.1.2 全系 iPhone
- ››调试集成 Java 和 C/C++ 的代码
- ››定制 Eclipse RCP 应用程序,第 1 部分: 可与 SWT...
- ››调试JavaScript脚本程序(Firefox篇)
- ››调试JavaScript/VB Script脚本程序(ASP.NET篇)
- ››调试JavaScript/VB Script脚本程序(Wscript篇)
更多精彩
赞助商链接