2011-02-28 8 views
0

機能の一部は、このようなものです:関数呼び出しでは、入口ログの数は出口のログの数よりはるかに少なくなります。何故ですか?

JNIEXPORT jint JNICALL functionCall() { 
    // Entrance 
    printf("Time: %d\tFile: %s\tFunc: %s\tLine: %d\n", clock(), __FILE__, __FUNCTION__, __LINE); 

    // other codes 
    ... 

    // Exit 
    printf("Time: %d\tFile: %s\tFunc: %s\tLine: %d\n", clock(), __FILE__, __FUNCTION__, __LINE); 
} 

総事業がいくつかのAndroidアプリでJavaコードによって呼び出されたファイルを、xxx.soするようにコンパイルされます。 今、私はアプリをデバッグしています、それは最後にクラッシュします。ログによると、入口のログナンバープリントはわずか14ですが、出口のログナンバーは200以上です。 これはどうやって出てきますか?

+0

「ログ番号」とは何ですか? 「時間」? –

+0

彼は '__LINE__'について質問していると思います。 –

答えて

1

printf形式の引数が対応する引数と正しく並んでいない場合、ほとんどすべての実装で悪いことが起こります。例えば、32ビットの値が期待される64ビットの値が与えられた場合、ほとんどの実装は64ビットの値から上位32ビットを出力します。 print(あなたの場合%s/FILE)の次の引数は、64ビット値の次の32ビットから始まります。あなたの例では、このデータは文字列(別名c文字列)へのポインタのように扱われます。値の下位32ビットは何も指していないので、悪いことが起こる可能性があります。

ここで、%dとは、32ビット整数(そのプラットフォームに依存します)を意味します。 clock()は "clock_t"を返します。クロックティックを返すので、clock_tは32ビットよりも大きいことがあります。これにより、上記の条件が発生します。

このナンセンスをすべて避けて、std::coutを使用することをお勧めします。

+0

ありがとうございますが、これはポイントではないかもしれないと思います。私はログを見てきましたが、clock_tの単位は秒です。これは32ビットの整数を超える可能性は低いです。 – pengdu

0

また、このメソッドは値を返す関数です。最終的なロギング行の上にreturn文がある場合は、もちろん実行されません。 Cでは、最終ロギングが常に行われるように配置するのは非常に困難です。 C++では、デストラクタを使ってローカルクラスを書くだけです。

0

通常のリターンポイントをすべて取得したと仮定すると、例外条件が発生する可能性はありますか? この場合も、デストラクタを持つクラスを使うと助けになるでしょう。

関連する問題