1

我的公司构建了一个在 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 扩展(可能是一个信息提示处理程序,给定堆栈跟踪),但是由于某种原因未在该过程中加载。

  • 我的假设合理吗?
  • 如果是这样,我应该如何去追踪负责任的外壳扩展?
4

2 回答 2

3

是的,shell 扩展和其他系统挂钩 dll 在您的进程空间内有效运行。我发现许多扩展 dll 都会发生这种情况,这些扩展 dll 会导致我们的应用程序崩溃,通常是在显示文件打开对话框时。如果您有故障转储,windbg请查看所有已加载的 dll。忽略任何微软,剩下的将包含罪魁祸首。或者请客户运行Autoruns,保存 .arn 文件并将其发送给您。AppInit 和 Explorer 是要检查的选项卡。

于 2011-10-14T14:42:18.700 回答
0

这种崩溃的一个原因是堆栈溢出。由于 shell 扩展是在文件打开/保存对话框中加载的,并且这些扩展也会占用堆栈空间,因此您必须确保您的应用程序有足够的堆栈空间来容纳它。

因此,要么增加进程的堆栈大小,要么减少调用文件打开/保存对话框的函数的堆栈使用。

这可能无法修复此崩溃,但它是崩溃的可能原因之一。

于 2011-10-14T15:48:06.457 回答