1

奇妙なプログラムがハングします。これはデバッグで何を意味しますか?

windbg を取り付けた後、次のことがわかりました。

(1714.258): アクセス違反 - コード c0000005 (最初のチャンス)
初回例外は、例外処理の前に報告されます。
この例外は予期され、処理される場合があります。
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

4 に答える 4

7

MSVCとデバッグビルド構成を使用している場合は、0xdddddddd通常、解放されたメモリにアクセスしようとしていることを意味します。デバッグCRTメモリマネージャは、空きメモリを。で埋めます0xdd

于 2008-10-22T16:49:09.627 に答える
3

問題

  1. ファーストチャンス例外とは、問題を処理するためにプログラムに例外をスローする前に、デバッガーがデバッガーを使用しているユーザーに例外をデバッグする最初のチャンスを与えることを意味します。

  2. この場合、例外は「アクセス違反」です。これは、プログラムが不正なメモリ位置から読み取り/書き込みを試みていることを意味します。

  3. アクセス違反は深刻であり、プログラムにとって重要なメモリを破壊している可能性があり、これがプログラムがハングする原因である可能性があります。

  4. 障害のある命令からは、不正な命令から4バイトの値の内容を取得しようとしているように見えます。

問題のデバッグ

  1. これがコードの場合、デバッグシンボルの場所をコンパイラの出力フォルダに設定することで、この問題を簡単にデバッグできます(これには関連するpdbファイルが含まれます)。

  2. この例外が発生したら、呼び出しスタックを取得します(ビューウィンドウの1つに例外があります)

  3. これにより、障害が発生したスタックが発生したコード内の場所が表示されます。

  4. ここで、このソースを含むファイルを開き、そこにブレークポイントを設定すると、プログラムはこのポイントに到達し、windebugger内で停止します。この時点からデバッグすると、この違反がスローされたコードの行が正確にわかります。

ヒント:Boostにはソースが付属しているため、このコード内にブレークポイントを簡単に配置できます。asio :: detail :: win_iocp_io_service :: do_oneに到達したら、デバッグ中に必ずF11を押してください。

于 2008-10-22T16:53:42.177 に答える
2

コールスタックは完全にSTL/Boostコードです。あなたがしていることが異常でない限り、私はバグがあなたが貼り付けたコールスタックのどのセクションにもあるとは思いません。

確認すべき点がいくつかあります。

  1. 定義する必要があるが、存在しないBoost固有の#defineはありますか?

  2. 安全なSCLとイテレータのデバッグ。有効/無効にしてみてください。

  3. デバッグコードとリリースコードを混在させていますか?(STL / Boostコンテナの悪い考え)

于 2008-10-22T19:36:52.890 に答える
2

ecx レジスターに無効なアドレス (dddddddd) があります。これはメモリ破損のケースであると思います。プロセスの gflags をオンにすることを検討してください。

于 2008-10-22T16:32:48.457 に答える