2010-02-17 10 views
5

Şu anda Xcode'da benim önerilerimden biri tetiklendiğinde, bende yanıltıcı mesaj ve yığının bir dökümü var, ki bu da benim için çok anlamlı olmayan sayılarla dolu.Xcode - Çağrı yığını izi açık mı?

Çağrı yığınının bir izini elde etmek için, uygulamanın hata ayıklamasını ve işlemin gerçekleştiği noktaya kadar çalıştırmamı ve tekrar gösterilmesini ummamı gerektirir. % 100 tekrarlanabilir hatalar için, bu çok büyük bir sorun değildir, ancak hala zaman kaybıdır.

Her assert vurulduğunda bir çağrı yığını izlemesi varsa çok daha iyi olurdu.

Xcode'ta bir çağrı yığını izlemesini bırakacak bir assert makrosu nasıl tanımlarsınız?

cevap

5

NSThread, callStackSymbols adlı bir sınıf yöntemine sahiptir (ve NSException, aynı ada sahip bir örnek yöntemine sahiptir). Özür dilerim, düzenli olarak istisnalar kullanmıyorum ve düzenli olarak (ya da gerçeğiyle gurur duymadan) iddiaları kullanmıyorum, bu yüzden onaylama makrosunun ne yapması gerektiğinden emin değilim. KennyTM nazik belirttiği gibi

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

Ya da, backtrace_symbols kullanabilirsiniz. Sembolleri doğrudan bir dosya tanıtıcıya (backtrace_symbols_fd) veren bir yöntem bile vardır.

#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) 
+0

Oh, unutmayalım: 'callStackSymbols' yöntemi yalnızca Mac OS X 10.6'da kullanılabilir. – dreamlax

+1

OS X 10.5 ve iPhoneOS'ta 'backtrace_symbols (3)' kullanabilirsiniz. – kennytm

1

iOS 4.x'te [NSThread callStackSymbols] öğesini kullanabilirsiniz.