簡體   English   中英

我的程序在boost :: thread :: thread_start_function中崩潰,我該如何調試

[英]My program crashes in boost::thread::thread_start_function, how can I debug

我已經使用Visual Studio 2008構建C ++程序。發行版和調試版在隨機時間崩潰。 崩潰的頻率取決於其運行的計算機(從每周一次到每小時一次)。

該程序將boost asio用於TCP通信,並將wxWidget用於UI。 但是,崩潰與任何TCP問題或UI交互都不相關,因為崩潰通常在程序空閑時發生。

這是崩潰時我擁有的調用堆棧:

msvcr90d.dll!_NMSG_WRITE(int rterrnum=10)  Line 198 C
msvcr90d.dll!abort()  Line 59 + 0x7 bytes   C
msvcr90d.dll!terminate()  Line 130  C++
enf_client.exe!boost::thread::thread_start_function(void * param=0x00161e60)  Line 184  C++
msvcr90d.dll!_callthreadstartex()  Line 348 + 0xf bytes C
msvcr90d.dll!_threadstartex(void * ptd=0x01385d28)  Line 331    C
kernel32.dll!7c80b729()     
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll

我對如何調試這個東西一無所知。 如果您對要尋找的地方有任何想法,那就太好了。

編輯

我在崩潰之前的調試跟蹤中已經注意到了這一點:

First-chance exception at 0x7c812afb in enf_client.exe: Microsoft C++ exception: std::out_of_range at memory location 0x0189efd4..

我無法計算出該地址在內存中的內容(看起來像很多垃圾):

LH............ ð..0.=..zH. ð...ð.......

at stl容器的at函數旁邊,哪些函數可以觸發此操作?

在您的調用堆棧中包含terminate()的事實使我相信正在調用一個純虛函數。 在以下情況下,這很容易引起注意:

  • 代表線程的基類在ctor中啟動線程。 “執行”功能是純虛擬的
  • 子類實現“執行”功能。

有時,從Base ctor啟動的線程將完全完成Base ctor 之前開始運行。 因此,未完全構造被調用的對象execute,並且調用了Base的execute,從而導致終止()

如此反復的terminate()可能是由其他幾種情況引起的,我建議您嘗試在實際創建線程的調用之后立即休眠,以激發它。

您是否嘗試過將調試器設置為在引發異常時中斷? (調試菜單->異常-> C ++異常->選中std :: exception框。)

如果沒有看到任何代碼,將很難告訴您可能是什么問題。

我將執行以下操作:

似乎在catch塊的boost :: thread :: thread_start_function內部調用了terate()。 在Windows下,我將在std :: terminate()之前調用DebugBreak()並啟動應用程序(當然,您必須運行調試版本)。 當錯誤再次發生時,DebugBreak將啟動您的調試器並在該點等待。 從那里,您可以分析stacktrace並檢查誰啟動了該線程,並檢查內部發生了什么。

考慮到我有一個std::out_of_range ,我看了所有對at函數的調用。

這是:

std::string temp; ... ; if (temp.size() >= 8) temp.at(8) = '0'

應該是: if (temp.size() >= 9) temp.at(8) = '0'

我仍然不明白為什么我在調試模式下沒有關於此異常的更多調試信息。 可能是因為它在由wxWidget管理的UI線程上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM