定制调试诊断工具和实用程序(6)
2006-07-20 11:42:24 来源:WEB开发网不要为 m_nLoaded 或 m_nRemoved 而困惑。如果你针对某一行的相同 DLL 多次调用 LoadLibrary,调试器只会收到 LOAD_DLL_DEBUG_EVENT 一次,并且 m_nLoaded 被赋值为 1。如果调试器接收到某个 DLL 的 UNLOAD_DLL_DEBUG_EVENT,你便可以确定该 DLL 不再被该进程使用。因此,对于静态 DLLs 而言,你决不会收到此事件,即使可能在进程被启动后,它们被动态加载并用 LoadLibrary/FreeLibrary 卸载。
处理被调试程序的事件
一旦被调试程序的进程启动后,调试器便等待某些事件的发生。这就是为什么它应该在一个与主 UI 线程不同的单独线程中的原因,当主窗口是一个模式对话框时尤其如此!
为了在 CLoadLibrarySpyDlg 中有效地使用 CApplicationDebugger,GoThreadProc 线程过程首先声明一个 CApplicationDebugger 对象,指定要执行的命令行并说明是否截获来自被调试程序的 OutputDebugString 或 TRACE 输出。接着,DebugProcess 阻塞,直到被调试程序终止(接收 EXIT_PROCESS_DEBUG_EVENT 或第二次的未处理异常),或者重写的方法之一未返回 DBG_CONTINUE。
线程与对话框之间的沟通机制很简单:当某个被调试事件发生时,调试器线程将 Figure 6 中所列的消息发送到对话框。其中第一个消息是在加载了所有静态链接的 DLLs 时发送;也就是说,当 Windows 触发第一个(伪)断点时,便发信号给调试器,然后调试器调用可重写的 OnProcessRunning 将消息发送给对话框。第二个消息是当被调试程序卸载某个 DLL 时,由可重写的 OnUnloadDLLDebugEvent 调试事件处理例程发送
第三个消息需要所解释几句,为了创建 CModuleInfo,需要 DLL 的全路径名。而在本文第一部分中,我们没有提供任何方法直接从其 hModule 或加载地址获取 DLL 文件名。即便是当调试器接收到此事件时(因为它可能浏览到了它的 PE 头),DLL已经被映射到被调试程序的地址空间,这时,Windows 还没有初始化 PSAPI 所需的数据结构。
- ››调试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篇)
更多精彩
赞助商链接