Не удается загрузить символы Microsoft при запуске cdb в службе Windows

У меня есть служба Windows .NET, которая вызывает cdb.exe для анализа аварийных дампов. Я хочу автоматически загружать символы с http://msdl.microsoft.com, когда это необходимо, используя аргумент:

-y srv*c:\symbols*http://msdl.microsoft.com/download/symbols

Если я запускаю приложение как консольное приложение, оно работает должным образом и загружает необходимые символы для каждого дампа.

Проблема в том, что когда я запускаю приложение как службу Windows, символы не загружаются, и, если я включаю symnoisy, в журнале вывода cdb у меня есть запись для каждого символа, в которой говорится, что символ не был найден в http://msdl.microsoft.com

Итак, я проверил это с помощью сниффера, и самое забавное, что при работе в качестве службы не делается никаких запросов к серверу символов Microsoft.

погуглите немного, я обнаружил, что я не единственный, кто столкнулся с этой проблемой, и кажется, что проблема заключается в том, что при запуске приложения в качестве службы Windows оно использует библиотеку winHTTP для HTTP-запросов. , вместо wininet, который, как мне кажется, является корнем проблемы: http://support.microsoft.com/kb/238425

Итак, я не знаю, почему cdb не может подключиться к серверу символов ms с помощью библиотеки winHTTP, и мне нужен способ заставить cdb использовать wininet по умолчанию.

У кого-нибудь есть идея обходного пути к этой проблеме?


person David Espart    schedule 23.02.2011    source источник
comment
В каком контексте учетной записи работает ваша служба? Как СИСТЕМА у вас будет ограниченный доступ к сетевым ресурсам. Начиная с Windows 2000 существовала специальная учетная запись для сетевых служб, хотя... это уже могло быть решением.   -  person 0xC0000022L    schedule 24.02.2011
comment
Это была моя первая мысль, когда я обнаружил эту проблему. Пробовал запускать от имени администратора и системы, не помогло. Кроме того, сервис выполняет некоторые другие задачи, которые могут подключаться к интернет-ресурсам.   -  person David Espart    schedule 28.02.2011


Ответы (3)


Полный ответ здесь: https://web.archive.org/web/20150221111112/http://infopurge.tumblr.com/post/10438913681/how-does-cdb-access-the-microsoft-symbol-server

При запуске из командной строки cdb использует WinINet для доступа к интернет-ресурсам. При запуске из службы Windows cdb использует WinHTTP для доступа к интернет-ресурсам.

Для WinHTTP необходимо установить некоторые параметры реестра, чтобы предотвратить попытку использования прокси (bogusproxy) для доступа к серверу символов.

Вы можете заставить cdb использовать WinHttp из командной строки и, таким образом, эмулировать то, что происходит внутри службы в целях тестирования, введя следующее перед загрузкой cdb.

SET DBGHELP_WINHTTP=AnythingOtherThanEmpty

Чтобы отключить прокси WinHTTP для cdb и symsrv, вам необходимо установить один из следующих ключей в реестре.

Для x32-версии cdb, работающей на 32-разрядной машине из среды службы Windows. HKLM\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

Для версии x32 cdb, работающей на 32-разрядной машине из командной строки. HKEY_CURRENT_USER\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

Для x32-версии cdb, работающей на 64-разрядной машине из среды службы Windows. HKLM\Software\Wow6432Node\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

Для x32-версии cdb, работающей на 64-разрядной машине из командной строки. HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

Для 64-разрядной версии cdb, работающей на 64-разрядной машине из среды службы Windows. HKLM\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

Для x64-версии cdb, работающей на 64-разрядной машине из командной строки. HKEY_CURRENT_USER\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

person Mark D Jackson    schedule 12.05.2011
comment
Большое спасибо за ответ. Этот вопрос так и остался для меня нерешенным. Я попробую, как только смогу. - person David Espart; 13.05.2011
comment
Без проблем. Посетите сайт www.StackHash.com. Он может предложить функциональность, которую вы пытались внедрить в готовом виде. - person Mark D Jackson; 16.05.2011
comment
stackhash.com перенаправляет на fwdservice.com, который, в свою очередь, не возвращает содержимого. Это все еще законно? - person Kim Gräsman; 08.10.2012
comment
Вау! А я думал, что буду единственным сумасшедшим, который захочет запускать cdb.exe в качестве фоновой службы :) Спасибо! Проблема решена! - person Ghostrider; 14.07.2013
comment
Это 2018 год, и решение все еще работает для cdb 10.0.16299.15. Ссылка вверху страницы больше недоступна (только через веб-архив), но применять исправление на самом деле не нужно. Спасибо за ответ! - person Xantrul; 07.07.2018
comment
Спасибо за этот ответ. Я поместил их в reg-файл gist.github.com/discostu105/176e7af5af9cb7aa18396538a220a82f - person chrisn; 22.01.2019

Вы также можете сделать обратное — заставить dbghelp.dll использовать WinInet вместо WinHTTP, добавив

DBGHELP_WININET=1

к системной среде. Это устранит проблему в cdb.exe и других инструментах, использующих dbghelp.dll, например symchk.exe.

person sekogan    schedule 29.09.2017

Та же проблема возникает при запуске из планировщика заданий. Я пытался использовать разные учетные записи, но безрезультатно, пока не нашел этот пост.

Я запускаю CDB из скрипта Python (который выполняет всю «магию» по созданию необходимых предварительных условий) и для облегчения запуска Python я создал небольшой пакетный скрипт.

Добавление переменной среды, как описано Sekogan, решило проблему.

@echo off
setlocal
REM Forcing CDB to use WinInet instead of WinHTTP when running as a 
REM 'service' due to that WinHTTP uses some bogus proxy when not run from 
REM the console.
set DBGHELP_WININET=1

set PYTHONPATH=<your path>
call <path to venv>\Scripts\python.exe -m <script module> <params>

endlocal
person Johan H    schedule 31.05.2018