・現在、SH3(SH7709S)を使ったシステムで、数か月に1回、不定期にCPUの例外処理が発生しています。
例外が発生した場合 spc等の情報をログに残すようにしています。その情報をもとに
原因や例外の発生場所を探しているのですが、メモリダンプして下記SPCのアドレスを検索しても
ヒットしません。(メモリマップ上に存在しないアドレスのため)
・このあと、どのように調査や対策をしたらよいのか途方に暮れている状況です。
どなたか少しでも参考になる方法がありましたら教えて下さい。
(例外は工場現場でしか発生しないため、デバッガを接続して調査することができません)
(メモリマップ)
ROM(FMEM) 0000_0000~0007_FFFF
SRAM 0C00_0000~0C0F_FFFF
(例外事例)
spc=3A5D3869,ssr=0100,evnt=00E0 (命令アドレスエラー)
spc=07070707,ssr=0101,evnt=00E0(命令アドレスエラー)
spc=06060870,ssr=0100,evnt=0180(一般不当命令)
(参考)
ソースコードの解析ではスタックや配列のオーバーフローが起きそうな箇所は見つかりませんでした。
各種測定器でノイズを測るとほかの正常なシステムと同等レベルでした。
他に必要な情報がありましたらご連絡ください。
バッファオーバーランで関数からの戻り番地をぶっ壊してどっか変なところ飛んでるか、スタックオーバーフローでスタックポインタが変なところ指した状態で関数呼び出しをして復帰に失敗してどっか変なところ飛んでるか、RAM上に配置した関数テーブルをバッファオーバーランかなんかでぶっ壊した結果変なところ飛んでるか、関数テーブルを範囲外で参照してしまいどっか変なところ飛んでる辺りがこの手の問題ではありがちですね。
> ソースコードの解析ではスタックや配列のオーバーフローが起きそうな箇所は見つかりませんでした。
見つかりませんでした=絶対に問題はありません ではない筈で問題の原因は疑われた箇所にある可能性は高いと思います。
貴重なアドバイスありがとうございます。
・オーバーフロー等の可能性のあるソースコードに、オーバーフローしないよう条件文を追加することとしました。
すでに条件文は実装されていますが見落としがあるかもしれませんので、総点検中です。
・例外発生時にSPCを保存していますが、どこの関数から飛んできたかがわからないため、バグの発見がいまだにできない状況です。例外時にどこの関数から飛んできたかある程度推定できる方法がありましたら、アドバイスいただけないでしょうか?
(現場で不定期にしか発生しないため、残念ながらデバッガが使えません)
よろしくお願いします。