2016-03-04 42 views
0

我逼崩潰在OSX我wxWidgets的應用程序(MyApp),通過執​​行以下操作在事件處理程序:回溯沒有給我完整的堆棧跟蹤

void MainFrame::buggyFunc(wxCommandEvent &event) { 
    int* a = NULL; 
    *a = 1; 

這將生成以下堆棧跟蹤:

0 MyApp       0x000000010dc5d5d5 generateCrashLog(int)     + 325 
1 MyApp       0x000000010dc5db46 abortHandler(int)      + 118 
2 libsystem_platform.dylib  0x00007fff94e6ceaa _sigtramp       () + 26 
3 ???        0x00000000ffffffff 0x0 + 4294967295 
4 MyApp       0x0000000108a5880b wxAppConsoleBase::HandleEvent(wxEvtHandler*, void (wxEvtHandler::*)(wxEvent&), wxEvent&) const + 139 
5 MyApp       0x0000000108a588b7 wxAppConsoleBase::CallEventHandler(wxEvtHandler*, wxEventFunctor&, wxEvent&) const + 151 
6 MyApp       0x0000000108ba96e7 wxEvtHandler::ProcessEventIfMatchesId(wxEventTableEntryBase const&, wxEvtHandler*, wxEvent&) + 231 
7 MyApp       0x0000000108ba94c3 wxEventHashTable::HandleEvent(wxEvent&, wxEvtHandler*) + 243 
8 MyApp       0x0000000108bab276 wxEvtHandler::TryHereOnly(wxEvent&)  + 134 
9 MyApp       0x0000000108bac71d wxEvtHandler::TryBeforeAndHere(wxEvent&) + 77 
10 MyApp       0x0000000108bab03f wxEvtHandler::ProcessEventLocally(wxEvent&) + 47 
11 MyApp       0x0000000108baafb0 wxEvtHandler::ProcessEvent(wxEvent&)  + 336 
12 MyApp       0x0000000108a270df wxWindowBase::TryAfter(wxEvent&)   + 175 
13 MyApp       0x0000000108baafe6 wxEvtHandler::ProcessEvent(wxEvent&)  + 390 
14 MyApp       0x0000000108bab4a0 wxEvtHandler::SafelyProcessEvent(wxEvent&) + 32 
15 MyApp       0x0000000108a1e4e5 wxWindowBase::HandleWindowEvent(wxEvent&) const + 37 
16 MyApp       0x00000001089c8d8b wxMenuBase::SendEvent(int, int)   + 443 
17 MyApp       0x000000010885630a wxMenu::HandleCommandProcess(wxMenuItem*, wxWindow*) + 314 
18 MyApp       0x00000001088d8b6b -[wxNSMenuItem clickedAction:] + 107 
19 libsystem_trace.dylib   0x00007fff9052107a _os_activity_initiate 

and so on... 

問題1: 爲什麼不在堆棧跟蹤buggyFunc?如果我使用backtrace,libunwindwxDebugReport/wxStackWalker(如VZ所建議),則無關緊要。結果堆棧跟蹤總是相同的。最頂級的功能從來不在列表中。現在,如果buggyFunc要調用另一個函數(假設爲buggyFunc2),那麼在崩潰被強制的情況下,buggyFunc實際上將包含在內,而buggyFunc2則不會。那麼爲什麼最頂級的功能不會出現在跟蹤中?

問題2:(解決見回答以下) 當我運行在調試模式下MyApp,它說Caught signal 11,這是一個SIGSEGV,這是我所期待的,但釋放模式使4,這是SIGILL。這裏發生了什麼事?

答:多虧了VZ的建議,我看着在Xcode的構建設置,發現這個:

enter image description here 設置Optimization levelNone解決了這個問題。不過,現在我已經得到了另一個問題...

問題3: 當我建立一個RelWithDebInfo版本的應用程序,我仍然可以在堆棧跟蹤有意義的函數名,儘管Generate Debug Symbols設置爲No它。爲什麼是這樣?

回答

1

我不能直接回答你的第一個問題,但是如果你使用wxWidgets無論如何,你爲什麼不使用wxStackWalker甚至wxDebugReport而不是重新實現它們?至於第二個,你真的需要看反彙編,很可能是優化器用完全不同的東西替換你的代碼,甚至完全刪除它,因爲它似乎沒有任何副作用。

編輯:至於第三個問題(應該單獨提出這個問題,因爲它與其他問題沒有多大關係),即使沒有調試信息,函數名仍保留在生成的二進制文件中,您可以使用strip擺脫他們(雖然通常應該沒有真正的理由)。

+0

謝謝你的建議。我嘗試使用提供的示例實現'wxDebugReport',但我得到一個鏈接器錯誤。 '架構x86_64的未定義符號:「wxDebugReport :: AddAll(wxDebugReport :: Context)」'。似乎無法找到關於此的任何信息。未定義通常意味着缺少一個對象(或框架),但我認爲這個類只是wxWidgets的一部分。 – Ash

+0

另外,我嘗試使用wxStackWalker,但我遇到了與我的問題中所述相同的問題。 'buggyFunc'不在它走過的幀列表中。可能是因爲wxStackWalker在內部使用了backtrace()。 – Ash

+0

'wxDebugReport'在「qa」庫中,請確保與它鏈接。如果'wxStackWalker'不能正常工作,並且您可以通過一個簡單示例重現它,請在[wxTrac](http://trac。wxwidgets.org/)。 –