我的公司构建了一个在 Windows XP 上运行的 MFC 应用程序。我们的一位客户报告了此应用程序在打开通用文件对话框以允许用户保存日志文件时发生的崩溃。
我们没有在我们的任何集成系统上观察到这种崩溃。客户向我们提供了一个故障转储,它显示该程序正试图从地址 160b2d48 处的一些不可访问的内存中读取。该地址似乎来自地址空间的代码部分,因为在其上方和下方加载了 DLL(15dc0000-16085000 和 160c0000-1611b000),但在该地址处没有加载任何内容。崩溃线程的堆栈如下:
> shell32.dll!CFSFolder::GetDetailsEx() + 0x533c8 bytes
shell32.dll!CInfoTip::_GetInfoTipFromItem() + 0x169 bytes
shell32.dll!CInfoTip::GetInfoTip() + 0x1c bytes
shell32.dll!CFolderInfoTip::GetInfoTip() + 0x95 bytes
shell32.dll!CStatusBarAndInfoTipTask::RunInitRT() + 0xf5 bytes
shell32.dll!CRunnableTask::Run() + 0x4c bytes
browseui.dll!CShellTaskScheduler_ThreadProc() + 0x82 bytes
shlwapi.dll!ExecuteWorkItem() + 0x1d bytes
ntdll.dll!_RtlpWorkerCallout@16() + 0x65 bytes
ntdll.dll!_RtlpExecuteWorkerRequest@12() + 0x1a bytes
ntdll.dll!_RtlpApcCallout@16() + 0x11 bytes
ntdll.dll!_RtlpWorkerThread@4() + 0x1794c bytes
kernel32.dll!_BaseThreadStart@8() + 0x37 bytes
在这个堆栈上没有来自我们应用程序的代码,结合上述证据,我怀疑发生崩溃是因为当我们的应用程序显示“保存”对话框时调用了一个 shell 扩展(可能是一个信息提示处理程序,给定堆栈跟踪),但是由于某种原因未在该过程中加载。
- 我的假设合理吗?
- 如果是这样,我应该如何去追踪负责任的外壳扩展?