3

私が提供している情報は非常に限られていますが、おそらくそれで十分です。

システム仕様:それぞれ 4 つの仮想 CPU を実行する 8 つのコアを備えた MIPS 64 ビット プロセッサ。

OS: 2.6.32.9 カーネルに基づく一部の専用 Linux

プロセス: 7 つの posix スレッドを実行する単純なユーザーランド プロセス。この特定のアプリケーションはコア 0 で実行されており、どのプロセスも CPU アフィニティを持っていません。

クラッシュを再現することはほとんど不可能です。特定のシナリオはありません。アプリケーションで小さなアクティビティを実行すると、1 日に 1 回クラッシュする可能性があることがわかっています。

クラッシュしている特定のスレッドが 5 ミリ秒ごとにウェイクアップし、1 つの共有メモリ領域から情報を読み取り、別の共有メモリ領域を更新します。それでおしまい。

活動はあまりありません。プロセスはそれほど難しくありません。

現在: コアを開いてアプリケーションのシンボルなしのイメージをロードすると、gdb は命令 100661e0 を指します。命令 100661e0 は次のようになります (ストリップされていないイメージの objdump ビューで表示):

void class::foo(uint8_t factor)
{
    100661d8:   ffbf0018        sd      ra,24(sp)
    100661dc:   0080802d        move    s0,a0
    bar(factor, shared_memory_a->profiles[PROFILE_1]);
    100661e0:   0c019852        jal     10066148 <_ZN28class35barEhR30profile_t>
    100661e4:   64c673c8        daddiu  a2,a2,29640
    bar(factor, shared_memory_a->profiles[PROFILE_2]);
    100661e8:   de060010        ld      a2,16(s0)

例外行として表示される行は

100661e0:   0c019852        jal     10066148 <_ZN28class35barEhR30profile_t>

10066148 は有効な命令であることに注意してください。

Bad レジスタには次のアドレスが含まれています。これはアラインされていますが、命令アドレス空間に関する限り、有効に見えません: c0000003ddc5dd90

原因レジスタには次の値が含まれます: 0000000000800014

命令が有効な命令を明確に示している場合に、Bad レジスタが値を表示する理由がわかりません。分岐遅延スロットの問題が少し気になりますが、単純な C++ を使用してユーザーランド アプリケーションを実行している場合は、気にする必要はありません。

ご意見をいただければ幸いです。

4

0 に答える 0