Моя компания создает приложение MFC, которое работает на Windows XP. Один из наших клиентов сообщил о сбое в этом приложении, которое возникает при открытии диалогового окна «Общий файл», позволяющего пользователю сохранить файл журнала.
Мы не наблюдали этот сбой ни в одной из наших систем интеграции. Клиент предоставил нам аварийный дамп, который показывает, что программа пытается прочитать данные из недоступной памяти по адресу 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
В нашем стеке нет кода из нашего приложения, и в сочетании с приведенными выше доказательствами, я подозреваю, что сбой происходит из-за того, что расширение оболочки (вероятно, обработчик информационных подсказок, учитывая трассировку стека) вызывается, когда наше приложение показывает Save диалоговое окно, но по какой-то причине не загружается в процессе.
- Является ли моя гипотеза обоснованной?
- Если так, как мне найти отслеживание ответственного расширения оболочки?