OSX 相当于 SymGetLineFromAddr 或 SymGetLineFromAddr64
OSX equivalent of SymGetLineFromAddr or SymGetLineFromAddr64
我想将源文件和行号添加到我的回溯中,在 Windows 上有一个很好的函数 SymGetLineFromAddr64 可以提供此类信息(如果可用)。我在 mac 上找不到类似的东西。
dladdr 只输出符号名,不输出文件信息。
在 OS X 上没有 public 等同于 SymGetLineFromAddr64
,但是您可以使用 atos(1) 开发人员工具获取源文件和行号。
这里是一些示例代码,用于获取完全符号化的回溯。
#import <Foundation/Foundation.h>
static NSArray * Backtrace(NSArray *callStackReturnAddresses)
{
NSMutableArray *backtrace = [NSMutableArray new];
for (NSNumber *address in callStackReturnAddresses)
{
NSString *hexadecimalAddress = [NSString stringWithFormat:@"0x%0*lx", (int)sizeof(void*) * 2, address.unsignedIntegerValue];
NSTask *task = [NSTask new];
NSPipe *pipe = [NSPipe pipe];
task.launchPath = @"/usr/bin/xcrun";
task.arguments = @[ @"atos", @"-d", @"-p", @(getpid()).description, hexadecimalAddress ];
task.standardOutput = pipe;
NSString *symbol = @"???";
@try
{
[task launch];
NSData *data = [pipe.fileHandleForReading readDataToEndOfFile];
symbol = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
symbol = [symbol stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
[task waitUntilExit];
}
@catch (NSException *exception) {}
[backtrace addObject:[NSString stringWithFormat:@"%@ %@", hexadecimalAddress, symbol]];
}
return [backtrace copy];
}
static void test(void)
{
NSLog(@"%@", Backtrace([NSThread callStackReturnAddresses]));
}
int main(int argc, const char * argv[])
{
test();
return 0;
}
运行 此代码将产生以下输出:
0x000000010000134e test (in a.out) (main.m:31)
0x000000010000131b main (in a.out) (main.m:36)
0x00007fff8c0935fd start (in libdyld.dylib) + 1
我想将源文件和行号添加到我的回溯中,在 Windows 上有一个很好的函数 SymGetLineFromAddr64 可以提供此类信息(如果可用)。我在 mac 上找不到类似的东西。 dladdr 只输出符号名,不输出文件信息。
在 OS X 上没有 public 等同于 SymGetLineFromAddr64
,但是您可以使用 atos(1) 开发人员工具获取源文件和行号。
这里是一些示例代码,用于获取完全符号化的回溯。
#import <Foundation/Foundation.h>
static NSArray * Backtrace(NSArray *callStackReturnAddresses)
{
NSMutableArray *backtrace = [NSMutableArray new];
for (NSNumber *address in callStackReturnAddresses)
{
NSString *hexadecimalAddress = [NSString stringWithFormat:@"0x%0*lx", (int)sizeof(void*) * 2, address.unsignedIntegerValue];
NSTask *task = [NSTask new];
NSPipe *pipe = [NSPipe pipe];
task.launchPath = @"/usr/bin/xcrun";
task.arguments = @[ @"atos", @"-d", @"-p", @(getpid()).description, hexadecimalAddress ];
task.standardOutput = pipe;
NSString *symbol = @"???";
@try
{
[task launch];
NSData *data = [pipe.fileHandleForReading readDataToEndOfFile];
symbol = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
symbol = [symbol stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
[task waitUntilExit];
}
@catch (NSException *exception) {}
[backtrace addObject:[NSString stringWithFormat:@"%@ %@", hexadecimalAddress, symbol]];
}
return [backtrace copy];
}
static void test(void)
{
NSLog(@"%@", Backtrace([NSThread callStackReturnAddresses]));
}
int main(int argc, const char * argv[])
{
test();
return 0;
}
运行 此代码将产生以下输出:
0x000000010000134e test (in a.out) (main.m:31)
0x000000010000131b main (in a.out) (main.m:36)
0x00007fff8c0935fd start (in libdyld.dylib) + 1