いつもどこかでデスマーチ♪

不定期に、私の日常を書き込みしていきます。

Visual Studio 2008 で問題発生!

2013年02月05日 17時21分11秒 | Windows
作っていたもの:
 FTPからデータをダウンロードするプログラム


事象:
 Visual Studio で実行すると、ある特定のメソッドで処理が止まります。
 8割ぐらいの確立で処理が戻ってきませんでした。

 debug ビルドでも release ビルドでも返ってきません。

 この場合、デバッグを停止しても処理が戻ってこないので、強制終了するしかありません。


 しかし、ビルド完了後の"*.exe"ファイルを直接実行すると正常に動きます。
 debug ビルドでも release ビルドでも正常にダウンロードできます。

 処理が返ってこないメソッドは、
 「CInternetSession() クラスの GetFtpConnection(); メソッド」
 です。

 で、Visual Studioの左下にあるメッセージを確認すると下記が出ていました。
 「C:\WINDOWS\system32\iphlpapi.dll のシンボルを読み込んでいます...」
 ここで処理が止まっています。
 そうです。シンボルを検索しに行って読み込みで止まってるんですね。


 コードのバグとか、FTPの接続ではないので、「タイムアウトは発生しない」「例外も発生しない」
 困ったものです。

 で、一般的にVisual Studioでのシンボルの読み込みと言えば…
 「ツール → オプション → デバッグ → 全般」と「ツール → オプション → デバッグ → シンボル」の設定を行いますよね。

 そう…ここでシンボルの読み込みを行わないようにしても処理が止まるんです。
 処理が帰ってこないんです。


ここで2・3日はまってしまいました。orz


解決策:
 ここで"WinDbgの設定"が出てきます。
 WinDbgの設定として、環境変数に"_NT_SYMBOL_PATH"を追加している人は多いと思います。
 コイツが原因でした。

 よく「"_NT_SYMBOL_PATH"を設定しているとデバッグが遅くなる。」と言う記事を見ます。
 デバッグが遅くなるのは、ローカルに存在しないシンボルを指定アドレスから探してくるので遅くなります。
 そりゃ、ローカルフォルダを探すより、インターネット接続する方が遅いよね。

 でも今回は20分以上待っても処理が戻ってきませんでした。ネットワーク通信をしている感じもありません。

 ってな訳で、環境変数から"_NT_SYMBOL_PATH"をリネーム例:"__NT_SYMBOL_PATH"することにより、
 シンボルの読み込みを行わないようになりました。

 ちなみに変数値は「SRV*C:\WINDOWS\symbols*http://msdl.microsoft.com/download/symbols」です。
 "C:\WINDOWS\symbols"に無いんだからさっさとURL見て、さっさと読み込み失敗してよ…


 そして「CInternetSession() クラスの GetFtpConnection(); メソッド」でも処理が止まる事は無くなりました。


チャンちゃん…

…マイクロソフトさん…何でやネン…orz
動く時は動くんです。8割ぐらい動かないけど…orz


今度 WinDbg を使うことになったら、環境変数戻すの忘れるんだろうなぁ…

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Excel の VBA ではまった… | トップ | log4cpp がビルドできません。 »

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

Windows」カテゴリの最新記事