Xcode - трассировка стека вызовов на assert? - PullRequest
5 голосов
/ 17 февраля 2010

Прямо сейчас, когда один из моих утверждений запускается в Xcode, я получаю сообщение об утверждении и дамп стека, который полон чисел, которые не очень значимы для меня.

Чтобы получить трассировку стека вызовов, мне необходимо отладить приложение и запустить его до момента, когда произошло утверждение, и надеяться, что оно подтвердится снова. Для ошибок, которые воспроизводятся на 100%, это не слишком большая проблема, но все же это пустая трата времени.

Было бы намного лучше, если бы я получал трассировку стека вызовов каждый раз, когда вызывается утверждение.

Как вы определяете макрос assert, который будет выгружать трассировку стека вызовов в Xcode?

Ответы [ 2 ]

5 голосов
/ 18 февраля 2010

NSThread имеет метод класса с именем callStackSymbolsNSException имеет метод экземпляра с тем же именем). Извините, я не использую регулярно исключения и не использую также утверждения (не горжусь ни одним из фактов), поэтому я не уверен, что должен делать макрос утверждения.

#define AssertWithStackSymbols(x) \
do { \
    if (!(x)) { \
        NSLog (@"%s failed assertion\n%@", #x, [NSThread callStackSymbols]); \
        abort(); \
    } \
} while(0) 

Или, как любезно указал KennyTM, вы можете использовать backtrace_symbols. Существует даже метод, который выводит символы непосредственно в файловый дескриптор, backtrace_symbols_fd.

#define AssertWithStackSymbols(x) \
do { \
    if (!(x)) { \
        void *stack[128]; \
        int count; \
        fputs (#x " failed assertion.\n", stderr); \
        count = backtrace (stack, sizeof stack / sizeof (void *)); \
        backtrace_symbols_fd (stack, count, STDERR_FILENO); \
    } \
while (0)
1 голос
/ 15 ноября 2010

В iOS 4.x вы можете использовать [NSThread callStackSymbols], поэтому.

...