反向工程OSX用户诊断报告堆栈跟踪
reverse engineer OSX User Diagnostic Report stack trace
我想找出用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
相关文章:
- Android NDK传感器向事件队列报告奇怪的间隔
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 使用std::source_location报告错误的最佳实践
- xmake总是报告:错误:无法获取cxx的程序,为什么
- 当用户超过按钮点击限制时报告
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 内存清理程序报告全局对象构造中未初始化值的使用
- QDataStream 读取和写入的字节数比 QFile::length() 报告要多
- 在 Linux 中使用 ioctl() 获取隐藏功能报告时,零字节消失
- 如何使用CAPL的诊断功能获取CAN传输的数据(256字节)?
- 在 std::index_sequence 中没有诊断包膨胀
- Valgrind 在 std::string::swap 中报告 SIGILL
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- #pragma(*诊断)当将Clang分析器与GCC编译器混合时
- 柯南,CMake.test()生成XML报告
- 如何构建一个异常类来报告C++中的哪些文件和行号?
- 反向工程OSX用户诊断报告堆栈跟踪