mirror of
https://github.com/yuzu-emu/breakpad.git
synced 2024-11-28 05:34:16 +01:00
Change the symbol table parsing so that it will only use symbols that are from the __TEXT/__text section.
Fixes issue #127 tbr=mmentovai. git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@121 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
parent
baff938211
commit
83befb1cb4
@ -58,6 +58,10 @@ static NSString *kHeaderIs64BitKey = @"is64";
|
|||||||
static NSString *kHeaderCPUTypeKey = @"cpuType";
|
static NSString *kHeaderCPUTypeKey = @"cpuType";
|
||||||
static NSString *kUnknownSymbol = @"???";
|
static NSString *kUnknownSymbol = @"???";
|
||||||
|
|
||||||
|
// The section for __TEXT, __text seems to be always 1. This is useful
|
||||||
|
// for pruning out extraneous non-function symbols.
|
||||||
|
static const int kTextSection = 1;
|
||||||
|
|
||||||
@interface DumpSymbols(PrivateMethods)
|
@interface DumpSymbols(PrivateMethods)
|
||||||
- (NSString *)stringFromTask:(NSString *)action args:(NSArray *)args
|
- (NSString *)stringFromTask:(NSString *)action args:(NSArray *)args
|
||||||
standardIn:(NSFileHandle *)standardIn;
|
standardIn:(NSFileHandle *)standardIn;
|
||||||
@ -71,7 +75,6 @@ static NSString *kUnknownSymbol = @"???";
|
|||||||
- (BOOL)loadHeader:(void *)base offset:(uint32_t)offset;
|
- (BOOL)loadHeader:(void *)base offset:(uint32_t)offset;
|
||||||
- (BOOL)loadHeader64:(void *)base offset:(uint32_t)offset;
|
- (BOOL)loadHeader64:(void *)base offset:(uint32_t)offset;
|
||||||
- (BOOL)loadModuleInfo;
|
- (BOOL)loadModuleInfo;
|
||||||
- (NSMutableString *)generateSymbolFileString;
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
static BOOL StringHeadMatches(NSString *str, NSString *head) {
|
static BOOL StringHeadMatches(NSString *str, NSString *head) {
|
||||||
@ -283,6 +286,10 @@ static BOOL StringTailMatches(NSString *str, NSString *tail) {
|
|||||||
uint32_t n_strx = list->n_un.n_strx;
|
uint32_t n_strx = list->n_un.n_strx;
|
||||||
BOOL result = NO;
|
BOOL result = NO;
|
||||||
|
|
||||||
|
// We only care about symbols in the __text sect
|
||||||
|
if (list->n_sect != kTextSection)
|
||||||
|
return NO;
|
||||||
|
|
||||||
// Extract debugging information:
|
// Extract debugging information:
|
||||||
// Doc: http://developer.apple.com/documentation/DeveloperTools/gdb/stabs/stabs_toc.html
|
// Doc: http://developer.apple.com/documentation/DeveloperTools/gdb/stabs/stabs_toc.html
|
||||||
// Header: /usr/include/mach-o/stab.h:
|
// Header: /usr/include/mach-o/stab.h:
|
||||||
@ -316,21 +323,22 @@ static BOOL StringTailMatches(NSString *str, NSString *tail) {
|
|||||||
} else if (list->n_type == N_SLINE) {
|
} else if (list->n_type == N_SLINE) {
|
||||||
[self addFunction:nil line:list->n_desc address:list->n_value];
|
[self addFunction:nil line:list->n_desc address:list->n_value];
|
||||||
result = YES;
|
result = YES;
|
||||||
} else if ((list->n_type & N_TYPE) == N_SECT &&
|
} else if (((list->n_type & N_TYPE) == N_SECT) && !(list->n_type & N_STAB)) {
|
||||||
!(list->n_type & N_STAB)) {
|
|
||||||
// Regular symbols or ones that are external
|
// Regular symbols or ones that are external
|
||||||
NSString *fn = [NSString stringWithUTF8String:&table[n_strx]];
|
NSString *fn = [NSString stringWithUTF8String:&table[n_strx]];
|
||||||
[self addFunction:fn line:0 address:list->n_value];
|
[self addFunction:fn line:0 address:list->n_value];
|
||||||
result = YES;
|
result = YES;
|
||||||
} else if (list->n_type == N_ENSYM) {
|
} else if (list->n_type == N_ENSYM) {
|
||||||
// End of symbols for current function
|
|
||||||
if (lastFunctionStart_) {
|
if (lastFunctionStart_) {
|
||||||
unsigned long long start = [lastFunctionStart_ unsignedLongLongValue];
|
unsigned long long start = [lastFunctionStart_ unsignedLongLongValue];
|
||||||
unsigned long long size = list->n_value - start;
|
unsigned long long size = list->n_value - start;
|
||||||
NSMutableDictionary *dict = [addresses_ objectForKey:lastFunctionStart_];
|
NSMutableDictionary *dict = [addresses_ objectForKey:lastFunctionStart_];
|
||||||
assert(dict);
|
assert(dict);
|
||||||
|
assert(list->n_value > start);
|
||||||
|
|
||||||
[dict setObject:[NSNumber numberWithUnsignedLongLong:size]
|
[dict setObject:[NSNumber numberWithUnsignedLongLong:size]
|
||||||
forKey:kFunctionSizeKey];
|
forKey:kFunctionSizeKey];
|
||||||
|
lastFunctionStart_ = nil;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -509,6 +517,7 @@ static BOOL StringTailMatches(NSString *str, NSString *tail) {
|
|||||||
[NSNumber numberWithUnsignedLongLong:size], kHeaderSizeKey,
|
[NSNumber numberWithUnsignedLongLong:size], kHeaderSizeKey,
|
||||||
[NSNumber numberWithUnsignedLong:offset], kHeaderOffsetKey,
|
[NSNumber numberWithUnsignedLong:offset], kHeaderOffsetKey,
|
||||||
[NSNumber numberWithBool:YES], kHeaderIs64BitKey,
|
[NSNumber numberWithBool:YES], kHeaderIs64BitKey,
|
||||||
|
[NSNumber numberWithUnsignedLong:cpu], kHeaderCPUTypeKey,
|
||||||
nil] forKey:cpuStr];
|
nil] forKey:cpuStr];
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user