2011-10-14 79 views
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 
    [email protected]() + 0x65 bytes 
    [email protected]() + 0x1a bytes 
    [email protected]() + 0x11 bytes  
    [email protected]() + 0x1794c bytes  
    [email protected]() + 0x37 bytes 

有沒有從我們這個堆棧上的應用程序代碼,並與上述證據配對,我懷疑崩潰是因爲外殼擴展(大概一個信息提示處理程序,給定堆棧跟蹤)在我們的應用程序顯示「保存」對話框時調用,但由於某種原因在進程中未加載。

  • 是我的假設是否合理?
  • 如果是這樣,我應該如何去跟蹤負責任的shell擴展?

回答

2

是,外殼擴展和其他系統鉤子的dll的進程空間中有效地運行。我發現這種情況發生在一些擴展DLL中,導致我們的應用程序崩潰,通常在顯示文件打開對話框時。如果你有崩潰轉儲windbg然後看看所有加載的dll。忽略任何微軟的,剩下的將包含罪魁禍首。或者讓客戶運行Autoruns,保存.arn文件併發送給您。 AppInit和Explorer是要檢查的選項卡。

0

這種崩潰的一個原因是堆棧溢出。由於shell擴展是在文件打開/保存對話框中加載的,而且這些擴展也會佔用堆棧空間,所以您必須確保您的應用程序有足夠的堆棧空間來容納這些空間。

所以請增加進程的堆棧大小,或減少堆棧使用,你調用文件打開該功能/保存對話框。

這可能無法解決此崩潰,但這是崩潰的可能原因之一。