开发者

Could a shell extension be causing my program to crash?

My company builds an MFC application that runs on Windows XP. One of our customers has reported a crash in this application that occurs when it opens a Common File Dialog to allow the user to save a log file.

We haven't observed this crash on any of our integration systems. The customer provided us with a crash dump which shows that the program is trying to read from some inaccessible memory at address 160b2d48. The address appears to be from the code section of the address space, as there are DLLs loaded just above and below it (15dc0000-16085000 and 160c0000-1611b000), but nothing is loaded at that address. The stack of the crashing thread is as follows:

>   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!_Rt开发者_如何转开发lpWorkerCallout@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

There is no code from our application on this stack, and paired with the above evidence, I suspect the crash happens because a shell extension (probably an info tip handler, given the stack trace) is called when our application shows the Save dialog, but isn't loaded in the process for some reason.

  • Is my hypothesis reasonable?
  • If so, how should I go about tracking down the responsible shell extension?


Yes, shell extensions and other system hook dlls effectively run within your process space. I've found this to happen with a number of extension dlls that have caused our application to crash, often when showing a file open dialog. If you have the crash dump in windbg then take a look at all the dlls that are loaded. Ignore any Microsoft ones, and whatever's left will contain the culprit. Alternatively ask the customer to run Autoruns, Save the .arn file and send it to you. AppInit and Explorer are the tabs to check.


One reason for such crashes are stack overflows. Since shell extensions are loaded in the file-open/save dialogs, and those extensions use up stack space as well, you have to make sure your app has enough stack space left to accommodate for that.

So either increase the stack size of your process, or reduce the stack use of the function where you call the file-open/save dialog.

This might not fix this crash, but it's one of the possible reasons for crashes.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜