5

現在、アサートの 1 つが Xcode でトリガーされると、アサート メッセージとスタックのダンプが表示されます。これは、あまり意味のない数値でいっぱいです。

コール スタックのトレースを取得するには、アプリケーションをデバッグし、アサートが発生したポイントまで実行して、再度アサートされることを期待する必要があります。100% 再現可能なバグの場合、これはそれほど大きな問題ではありませんが、それでも時間の無駄です。

アサートがヒットするたびにコール スタック トレースを取得できれば、はるかに良いでしょう。

Xcode でコール スタック トレースをダンプする assert マクロをどのように定義しますか?

4

2 に答える 2

5

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)
于 2010-02-17T23:21:49.617 に答える
1

iOS 4.x では [NSThread callStackSymbols] を使用できます。

于 2010-11-15T08:30:55.803 に答える