WEB开发网
开发学院软件开发VC 定制调试诊断工具和实用程序(6) 阅读

定制调试诊断工具和实用程序(6)

 2006-07-20 11:42:24 来源:WEB开发网   
核心提示: 不要为 m_nLoaded 或 m_nRemoved 而困惑,如果你针对某一行的相同 DLL 多次调用 LoadLibrary,定制调试诊断工具和实用程序(6)(4),调试器只会收到 LOAD_DLL_DEBUG_EVENT 一次,并且 m_nLoaded 被赋值为 1,DLL已经被映射到

不要为 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 所需的数据结构。

上一页  1 2 3 4 5 6  下一页

Tags:定制 调试 诊断

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接