XCode - Трассировка стека вызовов на утверждает?

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

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

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

Как Вы определяете утверждать макрос, который выведет трассировку стека вызовов в XCode?

5
задан Alex Rozanski 17 February 2010 в 20:05
поделиться

1 ответ

Необходимо перезаписать содержимое argv [0] на языке C в Linux. Теперь, как это сделать с Эрланга... Ну, возможно, вам нужно начать процесс erlang из C обертки.. Только мои 2 цента

-121--4067219-

Также не устанавливайте заголовок длины содержимого. Java сделает это для вас.

-121--3665223-

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

#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)
5
ответ дан 14 December 2019 в 13:34
поделиться