更新:我正在使用 Linux 上的 GNU 运行时。在具有 Apple 运行时的 MacOS 上不会出现此问题。
更新 2:我在 MacOS 上编译了 GNU 运行时并用它构建了示例。在具有 GNU 运行时的 MacOS 上不会发生该错误。我会说问题出在 glibc(因为backtrace
并且backtrace_symbols
是 glibc 扩展)。
backtrace
在使用and在 GCC 编译的 Objective-C 应用程序中打印回溯时backtrace_symbols
,我没有得到任何 Objective-C 符号。仅显示文件名、地址和 C 符号。
我编译-g
并与-rdynamic
.
我的测试应用程序:
void _printTrace()
{
void *addr[1024];
int aCount = backtrace(addr, 1024);
char **frameStrings = backtrace_symbols(addr, aCount);
for (int i = 0; i < aCount; i++) {
printf("%s\n", frameStrings[i]);
}
free(frameStrings);
}
@interface TheObject
+ (void)_printTrace;
+ (void)printTrace;
@end
@implementation TheObject
+ (void)_printTrace
{
_printTrace();
}
+ (void)printTrace
{
[self _printTrace];
}
@end
void printTrace()
{
[TheObject printTrace];
}
int main(int argc, char **argv)
{
printTrace();
return 0;
}
它的输出:
./test.bin(_printTrace+0x1f) [0x8048e05]
./test.bin() [0x8048e60]
./test.bin() [0x8048e8b]
./test.bin(printTrace+0x34) [0x8048ec5]
./test.bin(main+0xf) [0x8048eda]
/lib/libc.so.6(__libc_start_main+0xe5) [0xb7643bb5]
./test.bin() [0x8048b51]
有没有办法让 Objective-C 符号出现在这个回溯中?