私が提供している情報は非常に限られていますが、おそらくそれで十分です。
システム仕様:それぞれ 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++ を使用してユーザーランド アプリケーションを実行している場合は、気にする必要はありません。
ご意見をいただければ幸いです。