我在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
,我仍然会在堆栈跟踪中获得有意义的函数名称。这是为什么?
答案 0 :(得分:1)
我无法直接回答您的第一个问题,但如果您无论如何使用wxWidgets,为什么不使用wxStackWalker甚至wxDebugReport而不是重新实现它们?
至于第二个,你真的需要看看反汇编,优化器很可能用完全不同的东西替换你的代码,甚至完全删除它,因为它似乎没有任何副作用。
编辑:对于第三个问题(由于它与其他问题没有多大关系,应该真正独立询问),即使没有调试信息,函数名也会保存在生成的二进制文件中,您可以使用{ {1}}摆脱它们(虽然通常没有真正的理由)。