2

Xcode (4.3.3 および llvm) を使用して、すべての例外にブレークポイントを設定しましたが、多くの場合、ブレークポイントに到達すると、スタックは次のようになります。

(lldb) bt
* thread #1: tid = 0x1c03, 0x31a891c4 libobjc.A.dylib`objc_exception_throw, stop reason = breakpoint 1.1
    frame #0: 0x31a891c4 libobjc.A.dylib`objc_exception_throw
    frame #1: 0x33a677b8 CoreFoundation`+[NSException raise:format:arguments:] + 100

の呼び出し元に関する情報はありませんNSException raise:format:arguments:。スタックはそこで停止します。

何かがレイズを呼び出したに違いないので、スタックに何が起こったのでしょうか? このような問題をデバッグするには、何を探す必要がありますか (たとえば、これは特定の種類のスタックの破損などを示していますか)?

更新:ここにゴミのあるコードがあります。

問題は、%@ のつもりで誤って %s と書いてしまったことです。それを適切に割り当てられた文字列と呼ぶには少し無理が​​あったかもしれませんが、llvm コンソールで「po imageName」を実行できました。最後にゴミがありました。

NSString *imageName = [NSString stringWithFormat:@"award_%s", award];
UIImage *image = [UIImage imageNamed:imageName];
[_awardIconMapping setObject:image forKey:award];

例外がヒットするまでにスレッド #0 はありませんでした。@try/@catch を使用すると、最後の行から適切な例外が発生します (申し訳ありませんが、前の image= 行だと思いました)。

2012-07-06 10:43:36.184 CallVille[834:707] ****** Hit exception ********
-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: wiseGuy)
4

1 に答える 1

0

この関数を使用して、NSExceptionからスタックトレースを出力します。

#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>

+ (void) printStackTrace: (NSException*) e
{
    NSArray * addresses = [e callStackReturnAddresses];
    if( [addresses count])
    {
        void * backtrace_frames[[addresses count]];
        int i = 0;
        for (NSNumber * address in addresses)
        {
            backtrace_frames[i] = (void *)[address unsignedLongValue];
            i++;
        }

        char **frameStrings = backtrace_symbols(&backtrace_frames[0], [addresses count]);

        if(frameStrings != NULL)
        {
            int x;
            for(x = 0; x < [addresses count]; x++)
            {
                NSString *frame_description = [NSString stringWithUTF8String:frameStrings[ x]];
                NSLog( @"------- %@", frame_description);
            }
            free( frameStrings);
            frameStrings = nil;
        }
    }
}
于 2012-08-06T06:17:36.033 に答える