カーネルでクラッシュしたユーザー空間プロセスをバックトレースする機能を実装しようとしています。私はカーネルで作業しているため、ライブラリの贅沢はなく、提供されたバックトレース機能は MIPS アーキテクチャをサポートしていません。GDBの機能をエミュレートできるかどうか疑問に思っています。カーネルのバージョンは 2.6.21 です。
2 に答える
コア ファイルはELF 形式です。これは標準であり、Google で検索するだけで多くの Web サイトで利用できます。
ただし、このファイル形式は自明ではありません。たくさんの癖とビット。合理的な人は、サードパーティのライブラリを使用する必要があります。本当にやりたい場合は、libelf と readelf から始めてください。幸運を祈ります。
oprofileの実装を参照できると思います。
Oprofile はフレーム ポインターを使用してバック トレース情報を取得するため、フレーム ポインターを有効にしてビルドされたユーザー空間アプリケーションとその関連ライブラリが必要です ("-fno-omit-frame-pointer" オプション)。
もう 1 つの方法は、ユーザー アプリケーションにデバッグ情報が含まれている場合、ユーザー アプリケーションのDWARF情報を確認する必要がある場合があります。DWARF 呼び出しフレーム情報は、関数の呼び出し方法に関する十分な情報をデバッガーに提供します。関数、現在の呼び出しフレームを見つけ、呼び出し情報のための呼び出しフレームを見つけます。
"frame-pointer" をサポートせずにバック トレース情報を単純にクロールしたい場合、またはデバッグ情報を使用しない場合は、ユーザー アプリケーションの mips 命令を確認し、子のコンテキスト (SP、IP、RP) をループして親コンテキストを取得する必要があります。 (SP,IP,RP) mips ABI 仕様では、メモリ内の多くの命令を逆アセンブルする必要があるため、これは少し複雑で時間がかかりますが、動作は悪くありません。たとえば、多くのルーチンでは、開始時に「add sp, sp, -32」のような命令があり、親の sp が現在の sp に 32 を加えたものであることがわかります。
2 番目と 3 番目の方法は、カーネルで作業しているため、自分で実装する必要があります。