反向工程OSX用户诊断报告堆栈跟踪

reverse engineer OSX User Diagnostic Report stack trace

本文关键字:诊断 报告 堆栈 跟踪 用户 OSX      更新时间:2023-10-16

我想找出用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

显然某处(+4839)在我的int main() {}函数的东西最终调用strtol_l(必须是间接的,因为在控制器代码中没有出现这个函数调用),导致崩溃。

+ 4839代表什么?是内存块偏移量吗?它不能是源代码行号,因为控制器的源代码只有~1200行,并且控制器没有用调试信息编译。

可以在gdb中使用gdb attach命令和要调试的机器人控制器进程的PID来调试机器人控制器进程。这将允许gdb动态地附加进程并调试它,就好像它最初是从gdb启动的一样。这在Webots文档中有很好的解释:http://www.cyberbotics.com/dvd/common/doc/webots/guide/section5.5.html