更新: LinuxでGNUランタイムを使用しています。この問題は、Appleランタイムを使用するMacOSでは発生しません。
アップデート2: MacOSでGNUランタイムをコンパイルし、それを使用してサンプルをビルドしました。GNUランタイムのMacOSではエラーは発生しません。問題はglibcにあると思います(backtrace
とbacktrace_symbols
はglibc拡張機能であるため)。
とを使用してGCCでコンパイルされたObjective-Cアプリでバックトレースを印刷するbacktrace
と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シンボルを表示させる方法はありますか?