Прямо сейчас то, когда один из моего утверждает, инициировано в XCode, я получаю утверждать сообщение и дамп стека, который полон чисел, которые не очень значимы для меня.
Для получения трассировки стека вызовов это требует, чтобы я отладил приложение и увеличил его до такой степени, когда, утверждение произошло, и надежда, что это утверждает снова. Для ошибок, которые на 100% восстанавливаемы, это не слишком огромно из проблемы, но является все еще пустой тратой времени.
Было бы намного лучше, если бы я получил трассировку стека вызовов каждый раз, когда утверждение поражено.
Как Вы определяете утверждать макрос, который выведет трассировку стека вызовов в XCode?
Необходимо перезаписать содержимое 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)