【发布时间】:2015-05-29 00:22:31
【问题描述】:
我想找出用 C/C++ 编写的应用程序到底在哪里失败了。我无法直接调试应用程序,既不使用 gdb / lldb 也不使用 IDE,因为该应用程序是由程序启动的(它是 webots 机器人模拟软件的机器人控制器)。在 OSX 控制台中,我可以找到一个“用户诊断报告”,它甚至会在崩溃时显示轨迹跟踪。 我只需要找出崩溃发生在我的源代码中的确切位置,但我不理解以下堆栈跟踪语法:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: EXC_I386_GPFLT
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libsystem_c.dylib 0x00007fff92d6b859 strtol_l + 77
1 controller_2 0x0000000100006b57 main + 4839
2 controller_2 0x00000001000010b4 start + 52
显然,在我的 int main() {} 函数中的某个地方 (+4839) 最终调用了 strtol_l(必须是间接的,因为在控制器代码中没有出现此函数调用)导致崩溃。
+ 4839 代表什么?它是内存块偏移量吗?它不能是源代码行号,因为控制器的源代码只有约 1200 行,并且控制器没有使用调试信息编译。
【问题讨论】:
-
我会说
+ 4839是说它在进入main后的第4839 条处理器指令中调用了strtol_l。如果你反汇编你运行的二进制文件,你应该能够找到它是什么指令,并且可能找到对周围程序集中熟悉的代码行的引用。 -
这是一个字节数,距离
main开头的偏移量。 -
如果你重新编译控制器代码,使用'-ggdb'(这将使可执行文件显着变大)然后让它运行直到它出现段错误,然后堆栈跟踪将包括行号等
-
当控制器软件段发生故障时,它会输出一个“核心”文件。使用该核心文件作为 gdb 的输入。 (让所有源代码对 gdb 可见,并使用(至少 '-g' 最好是 '-ggdb'名称,行号等。注意:由于您可能没有从源代码编译库,因此库函数中的细节仍然相当少,但是,问题的根源,在您的主函数中,将非常明显
-
您可能对这个问题的答案感兴趣:stackoverflow.com/questions/16227845/…
标签: c++ c macos crash-reports webots