私の会社では、Windows XP で動作する MFC アプリケーションを構築しています。ユーザーがログ ファイルを保存できるようにコモン ファイル ダイアログを開くと、このアプリケーションでクラッシュが発生するという報告が、お客様の 1 人から報告されています。
どの統合システムでも、このクラッシュは確認されていません。顧客は、プログラムがアドレス 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
このスタックにはアプリケーションからのコードはなく、上記の証拠と組み合わせると、アプリケーションが [保存] ダイアログを表示するときにシェル拡張機能 (スタック トレースを考えると、おそらく情報ヒント ハンドラー) が呼び出されるためにクラッシュが発生するのではないかと思いますが、何らかの理由でプロセスに読み込まれません。
- 私の仮説は妥当ですか?
- もしそうなら、責任のあるシェル拡張を追跡するにはどうすればよいですか?