我逼崩潰在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
,libunwind
或wxDebugReport/wxStackWalker
(如VZ所建議),則無關緊要。結果堆棧跟蹤總是相同的。最頂級的功能從來不在列表中。現在,如果buggyFunc
要調用另一個函數(假設爲buggyFunc2
),那麼在崩潰被強制的情況下,buggyFunc
實際上將包含在內,而buggyFunc2
則不會。那麼爲什麼最頂級的功能不會出現在跟蹤中?
問題2:(解決見回答以下) 當我運行在調試模式下MyApp
,它說Caught signal 11
,這是一個SIGSEGV
,這是我所期待的,但釋放模式使4,這是SIGILL
。這裏發生了什麼事?
答:多虧了VZ的建議,我看着在Xcode的構建設置,發現這個:
設置Optimization level
到None
解決了這個問題。不過,現在我已經得到了另一個問題...
問題3: 當我建立一個RelWithDebInfo
版本的應用程序,我仍然可以在堆棧跟蹤有意義的函數名,儘管Generate Debug Symbols
設置爲No
它。爲什麼是這樣?
謝謝你的建議。我嘗試使用提供的示例實現'wxDebugReport',但我得到一個鏈接器錯誤。 '架構x86_64的未定義符號:「wxDebugReport :: AddAll(wxDebugReport :: Context)」'。似乎無法找到關於此的任何信息。未定義通常意味着缺少一個對象(或框架),但我認爲這個類只是wxWidgets的一部分。 – Ash
另外,我嘗試使用wxStackWalker,但我遇到了與我的問題中所述相同的問題。 'buggyFunc'不在它走過的幀列表中。可能是因爲wxStackWalker在內部使用了backtrace()。 – Ash
'wxDebugReport'在「qa」庫中,請確保與它鏈接。如果'wxStackWalker'不能正常工作,並且您可以通過一個簡單示例重現它,請在[wxTrac](http://trac。wxwidgets.org/)。 –