【发布时间】:2011-10-22 12:45:31
【问题描述】:
我有一个使用自动引用计数和 Lion SDK 构建的程序。该程序在 Snow Leopard 中的行为与预期不符,(不会加载一个视图,打开文档会挂起程序。)所以我想在那里调试它。但是因为我不能在雪豹下编译它,所以我不知道该怎么做。
那么我如何将调试符号导入 gdb 或者我可以在 Xcode 中调试这个东西 - 可能有远程方式或类似的东西吗?
【问题讨论】:
-
用虚拟机怎么样?
我有一个使用自动引用计数和 Lion SDK 构建的程序。该程序在 Snow Leopard 中的行为与预期不符,(不会加载一个视图,打开文档会挂起程序。)所以我想在那里调试它。但是因为我不能在雪豹下编译它,所以我不知道该怎么做。
那么我如何将调试符号导入 gdb 或者我可以在 Xcode 中调试这个东西 - 可能有远程方式或类似的东西吗?
【问题讨论】:
您可以通过gdbserver进行远程调试:
snow-leopard$ gdbserver :10000 /path/to/exe
lion$ gdb /path/to/exe
(gdb) target remote snow-leopard:10000
更简单的方法是将整个源代码和构建目录复制到雪豹并在本地使用 GDB 进行调试。即使你没有在那里构建,GDB 应该仍然能够找到它需要的一切。
【讨论】:
抱歉,我的研究表明,Snow Leopard 上的“g++”编译器不再在链接模块中放置对“gdb”有任何意义的符号。唯一找到的符号是为使所有符号独一无二而创建的虚构符号。这是一个简短的示例:
`_Z5DoSVCi', function, 0x151dd
`_Z7SEBTrapv', function, 0x1383c
Tiger 中相同的符号是这样的:
`_Z5DoSVCi' `DoSVC(int)', FUNCTION, 0x1394c
`_Z7SEBTrapv' `SEBTrap()', FUNCTION, 0xf994
“签名”是“gdb”需要解决的问题,例如:break emsvc.c:DoSVC 此外,您还必须拥有所有“对象卡组”,例如 emsvc.o,因为 Snow Leopard 的“g++”显然不再携带链接模块中的符号。
我将一个链接在 Tiger(基于 Intel)上的“g++”编译模块带到没有对象卡组的 Snow Leopard 上,“gdb”能够完美地处理它,包括设置断点。显然,“g++”或链接器没有为 Snow Leopard 上的“gdb”生成正确的模块。
【讨论】: