8

クラッシュダンプを分析するためにcdb.exeを呼び出している.NETWindowsサービスがあります。引数を使用して、必要に応じてhttp://msdl.microsoft.comからシンボルを自動的にダウンロードしたいと思います。

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

アプリケーションをコンソールアプリケーションとして実行すると、期待どおりに動作し、ダンプごとに必要なシンボルがダウンロードされます。

問題は、Windowsサービスとしてアプリを起動すると、シンボルがダウンロードされず、symnoisyをオンにすると、cdbの出力ログに、シンボルがhttp:/で見つからなかったことを示す各シンボルのエントリがあります。 /msdl.microsoft.com

それで、私はスニファを使用してそれをチェックしました、そして面白いことは、サービスとして実行されているとき、マイクロソフトシンボルサーバーに要求がなされないということです。

少しグーグルすると、この問題を抱えているのは私だけではないことがわかりました。問題は、アプリケーションをWindowsサービスとして実行するときに、wininetではなくwinHTTPライブラリをhttpリクエストに使用していることです。私は問題の根本だと思いますhttp ://support.microsoft.com/kb/238425

したがって、理由はわかりません。cdbはwinHTTPライブラリを使用してmsシンボルサーバーに接続できず、デフォルトでcdbにwininetを使用させる方法が必要です。

誰かがこの問題の回避策のアイデアを持っていますか?

4

3 に答える 3

12

ここで完全な答え: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

cdbおよびsymsrvのWinHTTPプロキシを無効にするには、レジストリに次のいずれかのキーを設定する必要があります。

Windowsサービス環境のx32ビットマシンで実行されているcdbのx32バージョンの場合。HKLM \ Software \ Microsoft \ Symbol Server \ NoInternetProxyDWORD1。

コマンドプロンプトからx32ビットマシンで実行されているcdbのx32バージョンの場合。HKEY_CURRENT_USER \ Software \ Microsoft \ Symbol Server \ NoInternetProxyDWORD1。

Windowsサービス環境のx64ビットマシンで実行されているcdbのx32バージョンの場合。HKLM \ Software \ Wow6432Node \ Microsoft \ Symbol Server \ NoInternetProxyDWORD1。

コマンドプロンプトからx64ビットマシンで実行されているcdbのx32バージョンの場合。HKEY_CURRENT_USER \ Software \ Wow6432Node \ Microsoft \ Symbol Server \ NoInternetProxyDWORD1。

Windowsサービス環境のx64ビットマシンで実行されているcdbのx64バージョンの場合。HKLM \ Software \ Microsoft \ Symbol Server \ NoInternetProxyDWORD1。

コマンドプロンプトからx64ビットマシンで実行されているcdbのx64バージョンの場合。HKEY_CURRENT_USER \ Software \ Microsoft \ Symbol Server \ NoInternetProxyDWORD1。

于 2011-05-12T07:10:45.197 に答える
2

逆のこともできます。dbghelp.dllにWinHTTPの代わりにWinInetを使用させるには、次を追加します。

DBGHELP_WININET=1

システム環境に。これにより、cdb.exeや、dbghelp.dll、たとえばsymchk.exeを使用するその他のツールの問題が修正されます。

于 2017-09-29T14:36:29.810 に答える
2

タスクスケジューラから実行する場合にも同じ問題が発生します。この投稿を見つけるまで、私は無駄に別のアカウントを使用しようとしました。

私はPythonスクリプトからCDBを起動しています(適切な前提条件を整えるためにすべての「魔法」を実行します)。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
于 2018-05-31T07:40:38.657 に答える