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

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

 2006-07-20 11:42:24 来源:WEB开发网   
核心提示: Figure 3 调试事件流CApplicationDebugger调用 CreateProcess 的线程必须是进入调试循环的线程,既然调试器阻塞于 WaitForDebugEvent,定制调试诊断工具和实用程序(6)(3),因此最好让这部分代码运行在一个与主UI线程不同的专门线程中,本

Figure 3 调试事件流

CApplicationDebugger

调用 CreateProcess 的线程必须是进入调试循环的线程。既然调试器阻塞于 WaitForDebugEvent,因此最好让这部分代码运行在一个与主UI线程不同的专门线程中。本文将其行为包装在 CApplicationDebugger 类中,其声明参见本文附带源代码中的 ApplicationDebugger.h 文件,这个类的一部分灵感还来自 Matt Pietrek 的 LoadProf32(参见 MSJJul95.exe)。

CApplicationDebugger 是一个虚拟类,因为你得从它派生并实现自己的重写版本,以便特定的调试事件发生时进行相应的调用。这个类被用于生成 LoadLibrarySpy(参见 Figure 4),这是一个调试程序和监控 DLL 加载和卸载的工具,不论是静态加载还是动态加载,也不论是不是有加载地址冲突,它都能监控。

Figure 4 LoadLibrarySpy

调用 CreateProcess 是在 CApplicationDebugger::LoadTheProcess 中进行的,为简单起见,参数使用 DEBUG_ONLY_THIS_PROCESS。如果需要,你可以将 CApplicationDebugger 扩展成能处理来自多个被调试进程的事件,对于 MMC 管理单元(snap-ins)很有用。

CLoadLibrarySpyDlg 类负责对话框自身的处理,同时也是暗中监视 CApplicationDebugger 派生类的线程宿主。CModuleListCtrl 类负责显示附属到每个DLL的详细信息 CModuleInfo*;针对每个 DLL,这个类存储的详细信息见 Figure 5。

当某个 DLL 被加载,对话框便调用 AddModule 方法;反之卸载DLL时,则执行 RemoveModule 方法。这两个方法都以 UpdateModule 方法告终,从而更新与该 DLL 对应的 CModuleObject 对象的 m_nLoaded 或 m_nRemoved。如果不存在这样的对象,则会创建一个新的对象,并将它添加到列表框中。

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

Tags:定制 调试 诊断

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