Может ли расширение оболочки вызывать сбой моей программы? - PullRequest
1 голос
/ 14 октября 2011

Моя компания создает приложение 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 диалоговое окно, но по какой-то причине не загружается в процессе.

  • Является ли моя гипотеза обоснованной?
  • Если так, как мне найти отслеживание ответственного расширения оболочки?

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

Да, расширения оболочки и другие системные крючки эффективно работают в вашем рабочем пространстве.Я обнаружил, что это происходит с несколькими библиотеками расширений, которые вызывали сбой нашего приложения, часто при отображении диалога открытия файла.Если у вас есть аварийный дамп в windbg, взгляните на все загруженные библиотеки.Игнорируйте любые из них Microsoft, и все, что осталось, будет содержать виновника.Или попросите клиента запустить Autoruns , сохраните файл .arn и отправьте его вам.AppInit и Explorer - это вкладки для проверки.

0 голосов
/ 14 октября 2011

Одна из причин таких сбоев - переполнение стека. Поскольку расширения оболочки загружаются в диалогах открытия / сохранения файла, и эти расширения также занимают место в стеке, вы должны убедиться, что в вашем приложении осталось достаточно места в стеке, чтобы вместить его.

Так что либо увеличьте размер стека вашего процесса, либо уменьшите использование стека функцией, в которой вы вызываете диалог открытия / сохранения файла.

Это может не исправить этот сбой, но это одна из возможных причин сбоев.

...