2011-11-15 19 views
3

を印刷し、私は私のObjective-CプログラムのObjective-C - コマンドライン(打ち鳴らす) - スタックトレース

のスタックトレースを印刷したいと思います私が打ち鳴らす(自動参照カウント)

を使用して、コマンドラインからコンパイルしています

私は次のことを知っていただきたいと思います:

  1. は、私はコンパイル時に任意のパラメータを追加する必要がありますか?
  2. トレースを開始してトレースを印刷するためのコードを追加する必要がありますか?下記の

は、私は、スタックトレースを印刷するように持っているため、サンプル・プログラムである:

#import<Foundation/Foundation.h> 

@interface Car : NSObject 
@property (weak) NSNumber* doors; 
@end 

@implementation Car 
@synthesize doors; 
@end 

int main() 
{ 
    system("clear"); 

    Car *car1 = [[Car alloc] init]; 

    NSNumber *d1 = [[NSNumber alloc] initWithInteger: 4]; 

    //I want to start printing the stack trace from this point on 
    car1.doors = d1; 

    printf("---- end\n"); 

    return(0); 
} 

コマンドをコンパイルするために使用:

clang -fobjc-arc test.m -framework Foundation -o test 

答えて

2
#include <execinfo.h> 

void printStackTrace() { 
    void *returnAddresses[500]; 
    int depth = backtrace(returnAddresses, sizeof returnAddresses/sizeof *returnAddresses); 
    printf("stack depth = %d\n", depth); 
    char **symbols = backtrace_symbols(returnAddresses, depth); 
    for (int i = 0; i < depth; ++i) { 
     printf("%s\n", symbols[i]); 
    } 
    free(symbols); 
} 
+0

おかげで、私は、疑問を持っていますcar1.doors = d1;という文が実行されたときに私が以前にペーストしたプログラムでは、セグメンテーションフォルトが発生するので、どのようにセグメンテーションフォルトを引き起こすのかを知ることができます。セグメント化フォルトを引き起こすステートメントの前に関数 'printStackTrace()'を呼び出すと、セグメント化フォルトの原因となるステートメントの後にトレースを呼び出すとトレースがあまり表示されません。 – user1046037

+1

私はそれを行うには1つ以上の方法があると仮定し、以下のリンクはそれを行うためのオプションを示しています:http://stackoverflow.com/questions/8125530/objective-c-arc-nsnumber-segmentation-fault – user1046037

関連する問題