SIGSEGV
プログラムが終了する前に、バック トレースをキャッチしてログに出力したいと考えています。これは、後でクラッシュを分析するためです。複数のプラットフォームで動作するソフトウェアに取り組んでいます。backtrace()
x86 プラットフォームでは、glibc関数を使用してこれを簡単に実行できます。ただし、MIPS および ARC プラットフォームでは同じことができません。ここで説明されているように、MIPS アーキテクチャのバック トレースを出力できます。
ARCプラットフォームでも同様のことをしたいと思っています。同様の詳細をどこで取得できるかについて、誰かがいくつかのデータポイントを提供できれば、非常に役立ちます.
編集:
いくつかの調査の結果、関数呼び出し用の ARC プラットフォームでは、スタックが一度に割り当てられるのではなく、部分的に割り当てられることがわかりました。(間違っていたら訂正してください。私はオブジェクト ダンプを調べて、これを理解しました。) したがって、この場合、MIPS とは対照的に、バイナリ コードの解析を行うのは難しいと思います。
別の方法として、インライン アセンブリを Cで記述し、スタック ポインター、フレーム ポインター、分岐リンク レジスタの内容 (点滅) を取得してから、スタックとフレーム サイズを使用してスタックをアンワインドし、各フレームで点滅の値を出力する方法があります。しかし、私はフレームサイズを見つけることができません。
FP、SP、BLINK を取得するサンプル コードを次に示します。
int func2(int func2_arg)
{
unsigned long *stack2_addr;
unsigned long *frame2_addr;
unsigned long *blink2_addr;
printf("\nFunc : %s\n",__FUNCTION__);
__asm__ __volatile__ ("st sp,[sp,4]");
printf("Stack pointer: %d\n",stack2_addr);
__asm__ __volatile__ ("st blink,[sp,12]");
printf("Blink: %d \n",blink2_addr);
__asm__ __volatile__ ("st fp,[sp,8]");
printf("Frame pointer2: %d, %d\n",frame2_addr,*frame2_addr);
return 0;
}
はい、これは良いコーディングではありません! 私は多くの仮定を立てました。しかし、私にとっては、私のボードで動作している限り問題ありません。:)
どんな助けでも大歓迎です。ARC gcc に関する別のリファレンスを次に示します。