2

我想找出用 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 行,并且控制器未使用调试信息编译。

4

1 回答 1

1

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

于 2015-05-29T17:34:26.000 回答