定制调试诊断工具和实用程序(7)
2006-07-20 11:42:21 来源:WEB开发网在 LoadLibrarySpy 工具中,启动被调试程序之前,与被调试程序对应的 GFlags 值会被 CApplicationDebugger 的 PreLoadingProcess 更新,其以前的值会被保存在 PostMortem 中,也就是说,因为使用“LDR”作为前缀,所以调试器从 Windows Loader 得到的专用输出信息很容易在 OnOutputDebugStringDebugEvent 中过滤。
这种 Loader 日志的一个主要优点是输出信息前都有一个 LDR:自动化 DLL 重定位信息。它解释哪个 DLL 与另外的 DLL 有地址冲突。这既是 CModuleListCtrl 获取 Reason 栏数据的方法。不幸的是,Windows 2000 Loader 好像抑制这种特定的输出信息。如果你过去习惯于通过加载某个进程来存取其资源,如 explorer.exe 的动画或图标,0x400000 加载地址通常已经被你的程序使用,Loader 会自动进行重定位。在这种特殊情况下,即便是在 Windows NT 4.0,它都不会发出 LDR:为动态加载进程自动化 DLL 重定向。
另外一个解决方案是枚举每个加载的 DLL 并与专用的地址空间区域(从 hModule 开始)进行比较,从而找到冲突者(实现细节参见 CLoadLibraryDebugger::OnLoadDLLDebugEvent)。加载器还提供另外一个带前缀“LDR:Loading (DYNAMIC)”的有趣的信息,同时其后跟随模块的全路径名。当某个 DLL 被显示通过 LoadLibrary 加载时,似乎就是这种情况。
使用这些来自 Windows Loader 的线索,LoadLibrarySpy 根据加载状态为每个 DLL 提供了一个专门的图标,详情参见 Figure 9。
带方形图标的 DLLs 是在进程初始化期间加载的,称为静态加载。带圆形图标的则是在进程初始化之后加载的,因此称为动态加载。图标的颜色预示着是否有加载地址冲突,红色表示有,蓝色表示没有。
- ››调试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篇)
更多精彩
赞助商链接