2008-10-22 50 views
1

奇怪的程序掛起,這在調試中意味着什麼?奇怪的程序掛起,這在調試中意味着什麼?

附着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 

回答

2

問題

  1. 第一次機會異常意味着調試器是給你的,誰在使用調試器,第一次有機會調試異常的人,它拋出它回到了程序之前來處理這個問題。

  2. 在這種情況下,異常是「訪問衝突」。這意味着您的程序正試圖從非法內存位置讀取/寫入。

  3. 訪問違規是嚴重的,它可能會破壞一些對您的程序至關重要的內存,這可能是您的程序掛起的可能原因。

  4. 從錯誤的指令看來,您好像試圖從非法指令中獲取4字節值的內容。

調試問題

  • 如果這是你的代碼,那麼你可以很容易地通過調試符號位置設置的輸出文件夾調試這個問題你編譯器(這將包含有關pdb文件)

  • 當你得到這個異常得到調用堆棧(視圖窗口的人會擁有它)

  • 這將顯示代碼中發生錯誤堆棧的位置。

  • 現在打開包含這個源文件,並在那裏設置一個斷點,程序會打到這一點並停止在windebugger中。從這個角度調試,你會知道到底從哪個代碼行這違反拋出

  • 提示:升壓帶有源,以便可以輕鬆的放進一個破發點在代碼裏。當你進入asio :: detail :: win_iocp_io_service :: do_one時,一定要在調試時按F11。

    1

    ECX寄存器具有無效地址(DDDDDDDD)。我會建議這是一個內存損壞的情況。考慮將流程轉換爲gflags。

    6

    如果您正在使用MSVC和Debug構建配置,0xdddddddd通常意味着您正試圖訪問釋放的內存。調試CRT內存管理器使用0xdd填充空閒內存。

    1

    該callstack完全是STL/Boost代碼。除非你正在做的事情與衆不同,否則我不會認爲這個錯誤出現在你所粘貼的堆棧的任何部分。

    幾件事情要檢查:應定義,但是的arent

    1. 任何升壓具體#定義?

    2. 安全SCL &迭代器調試。嘗試啓用/禁用它。

    3. 你是否混合調試&發佈代碼。 (用STL/Boost容器壞主意)