作っていたもの:
FTPからデータをダウンロードするプログラム
事象:
Visual Studio で実行すると、ある特定のメソッドで処理が止まります。
8割ぐらいの確立で処理が戻ってきませんでした。
debug ビルドでも release ビルドでも返ってきません。
この場合、デバッグを停止しても処理が戻ってこないので、強制終了するしかありません。
しかし、ビルド完了後の"*.exe"ファイルを直接実行すると正常に動きます。
debug ビルドでも release ビルドでも正常にダウンロードできます。
処理が返ってこないメソッドは、
「CInternetSession() クラスの GetFtpConnection(); メソッド」
です。
で、Visual Studioの左下にあるメッセージを確認すると下記が出ていました。
「C:\WINDOWS\system32\iphlpapi.dll のシンボルを読み込んでいます...」
ここで処理が止まっています。
そうです。シンボルを検索しに行って読み込みで止まってるんですね。
![](https://blogimg.goo.ne.jp/thumbnail/48/7a/130476fa3b781688decd217050c3a0b6_s.jpg)
コードのバグとか、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 を使うことになったら、環境変数戻すの忘れるんだろうなぁ…
FTPからデータをダウンロードするプログラム
事象:
Visual Studio で実行すると、ある特定のメソッドで処理が止まります。
8割ぐらいの確立で処理が戻ってきませんでした。
debug ビルドでも release ビルドでも返ってきません。
この場合、デバッグを停止しても処理が戻ってこないので、強制終了するしかありません。
しかし、ビルド完了後の"*.exe"ファイルを直接実行すると正常に動きます。
debug ビルドでも release ビルドでも正常にダウンロードできます。
処理が返ってこないメソッドは、
「CInternetSession() クラスの GetFtpConnection(); メソッド」
です。
で、Visual Studioの左下にあるメッセージを確認すると下記が出ていました。
「C:\WINDOWS\system32\iphlpapi.dll のシンボルを読み込んでいます...」
ここで処理が止まっています。
そうです。シンボルを検索しに行って読み込みで止まってるんですね。
![](https://blogimg.goo.ne.jp/thumbnail/48/7a/130476fa3b781688decd217050c3a0b6_s.jpg)
コードのバグとか、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 を使うことになったら、環境変数戻すの忘れるんだろうなぁ…