奇妙なプログラムがハングします、これはデバッグで何を意味しますか?
-
03-07-2019 - |
質問
奇妙なプログラムがハングします。これはデバッグで何を意味しますか?
windbgを接続すると、次のことがわかりました。
(1714.258): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=015b5c74 ebx=178a13e0 ecx=dddddddd edx=009a8ca0 esi=09fbf698 edi=09fbf594 eip=005ae2f7 esp=09fbf4a4 ebp=09fbf594 iopl=0 nv up ei ng nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010286 TestApplication!std::_Container_base::_Orphan_all+0x57: 005ae2f7 c70100000000 mov dword ptr [ecx],0 ds:0023:dddddddd=????????
コールスタック:
TestApplication!std::_Container_base::_Orphan_all+0x57 TestApplication!std::vector >::operator=+0x37 TestApplication!boost::asio::detail::win_iocp_io_service::do_one+0x189 TestApplication!boost::asio::detail::win_iocp_io_service::run+0xa2 TestApplication!boost::asio::io_service::run+0x3a
解決
問題
-
最初の機会の例外とは、デバッガーがデバッガーを使用しているユーザーに、問題を処理するために例外をプログラムにスローする前に、例外をデバッグする最初の機会を与えることを意味します。
-
この場合、例外は「アクセス違反」です。これは、プログラムが不正なメモリ位置から読み書きしようとしていることを意味します。
-
アクセス違反は深刻であるため、プログラムにとって重要な一部のメモリが破損している可能性があり、これがプログラムがハングする可能性が高い理由です。
-
フォールトした命令から、不正な命令から4バイト値の内容を取得しようとしているように見えます。
問題のデバッグ
-
これがあなたのコードである場合、コンパイラの出力フォルダにデバッグシンボルの場所を設定することで、この問題を簡単にデバッグできます(これには関連するpdbファイルが含まれます)
-
この例外が発生した場合、コールスタックを取得します(ビューウィンドウの1つに表示されます)
-
これは、障害のあるスタックが発生したコード内の場所を示します。
-
このソースを含むファイルを開き、そこにブレークポイントを設定すると、プログラムはこのポイントにヒットし、windebugger内で停止します。この時点からデバッグすると、この違反がスローされたコード行を正確に知ることができます
ヒント:Boostにはソースが付属しているため、このコード内にブレークポイントを簡単に配置できます。 asio :: detail :: win_iocp_io_service :: do_oneに到達したら、デバッグ中にF11を押してください。
他のヒント
MSVCとDebugビルド構成を使用している場合、 0xdddddddd
は通常、解放されたメモリにアクセスしようとしていることを意味します。デバッグCRTメモリマネージャは、空きメモリを 0xdd
で満たします。
ecxレジスタに無効なアドレス(dddddddd)があります。これはメモリ破損のケースであることをお勧めします。プロセスでgflagsをオンにすることを検討してください。
コールスタックは完全にSTL / Boostコードです。あなたがやっていることが普通でない場合を除き、貼り付けたコールスタックのどのセクションにもバグがあるとは思わない。
確認するいくつかの事項:
-
定義する必要があるブースト固有の#definesはありますか?
-
セキュアSCL&イテレータのデバッグ。有効/無効にしてみてください。
-
デバッグとアンプを混合していますか?リリースコード。 (STL / Boostコンテナーでは悪い考えです)