c++ - 回溯没有给我完整的堆栈跟踪

标签 c++ c xcode macos wxwidgets

我在 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 不在堆栈跟踪中?我使用 backtracelibunwind 还是 wxDebugReport/wxStackWalker 都没有关系(正如 VZ 所建议的)。生成的堆栈跟踪始终相同。最顶层的函数从不在列表中。现在,如果 buggyFunc 调用另一个函数(假设是 buggyFunc2),强制崩溃,那么 buggyFunc 实际上将被包括在内,而buggyFunc2 不会。那么,为什么最顶层的函数从未出现在跟踪中?

问题 2:(已解决。请参阅下面的答案) 当我在 Debug模式下运行 MyApp 时,它显示 Caught signal 11,这是一个 SIGSEGV,这是我所期望的,但是 Release模式给出 4,即 SIGILL。这里发生了什么?

回答:感谢 VZ 的建议,我查看了 Xcode build设置并发现了这个:

enter image description hereOptimization level 设置为 None 可解决此问题。但是,现在我有另一个问题......

问题 3: 当我构建应用程序的 RelWithDebInfo 版本时,尽管 Generate Debug Symbols 设置为 No,但我仍然在堆栈跟踪中得到有意义的函数名称.这是为什么?

最佳答案

我不能直接回答你的第一个问题,但如果你无论如何都在使用 wxWidgets,为什么不使用 wxStackWalker甚至 wxDebugReport而不是重新实现它们?

至于第二个,您确实需要查看反汇编,优化器很可能用完全不同的东西替换您的代码,甚至完全删除它,因为它似乎没有任何副作用。

编辑:至于第三个问题(实际上应该独立提出,因为它与其他问题没有太大关系),即使没有调试信息,函数名称也会保留在生成的二进制文件中,您可以使用 strip 以摆脱它们(尽管通常没有真正的理由这样做)。

关于c++ - 回溯没有给我完整的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35788560/

相关文章:

c - 一个程序,在整数数组中搜索 10 个数字,以确定它们的总和是否等于给定的 nb

ios - Xcode 4.2.1 Storyboard 多对一 View 返回

c++ - 序列化 boost 变体;非常奇怪和迟钝的编译器错误(MSVC 2010)

C++线程性能

c++ - 使用 C++ fmtlib,是否有比使用 std::ostringstream 更简洁的方法将数据序列 append 到字符串?

php - 我希望在单击按钮时将我的 UISlider 值发送到 mysql 数据库

c++ - Xcode MongoDB Boost 导入 <angle>

c++ - 堆栈模板参数

c - 业余C和结构

c - 如何解决 C 添加非常小的 float 的问题?