2012-09-14 7 views
1

Как узнать полный стек ошибки?Objective-C: Можно ли увидеть полный путь ошибки?

Я хочу знать, если возможно, увидеть полный набор функций, которые были вызваны.

У меня есть иерархия функций, которые имеют иерархию «общий» -> «очень специализированный».

Предположим, что у меня 5-уровневая иерархия.

Каждая функция имеет завершающие ошибки-блок, который определяется следующим образом:

typedef (^ErrorBlock)(NSError*error) 

FunctionWithManyParams:(Param1Type*)param1.... onError:(ErrorBlock)ErrorBlock; 

И каждая функция в иерархии имеют ту же часть кода:

onError(NSError*error){ 
    ErrorBlock(error); 
} 

Так что, если я назвал функцию от высокий уровень (предположим n), он будет вызывать функцию от (n-1) уровень и т. Д.

И если функция от 1-уровневая имеет ошибку, она будет обращена к очень высокоуровневой функции (очень специализированной), которая ее вызывает.

Возможно ли узнать полный путь этого звонка? (или какая-то техника для него)?

Я хочу, чтобы иметь полный след функции вызовов, поэтому, мне нужно что-то добавил, как это:

onError(NSError*error){ 
     NSString*errorDescription = [self getNameOfFunction]; 
     NSMutableDictionary * errorDictionary = [NSMutableDictionary dictionary]; 
     NSString*previousErrorDescription = [error description]; 

     [errorDictionary setValue:[NSString stringWithFormat:@"%@ >> %@",previousErrorDescription,errorDescription ] forKey:NSLocalizedDescriptionKey]; 
      NSError * errorNew = [NSError errorWithDomain:vkDomain 
                code:errorCode 
               userInfo:errorDictionary 
           ]; 
     ErrorBlock(errorNew); 
    } 

ответ

2

Возможно, вам необходимо:

NSLog(@"%@",[NSThread callStackSymbols]); 
+0

Это круто! Я не знал, что был простой вызов Objective-C, до сих пор я играл с вызовами backtrace() 'C, когда я хотел видеть стек вызовов ... – Guillaume

+0

Могу ли я узнать полное имя функции в нем тело как-то? например '[self nameOfCurrentFunction]' – gaussblurinc

+0

@loldop, возможно, вам стоит попробовать 'NSStringFromSelector (_cmd)', если вы хотите имя метода для контекста. – ZhangChn

Смежные вопросы