なんとかなるさね

マイコンをネタにブログを始めてみました


RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (2) 

前のエントリでreturn文に細工するマクロを書いてどこから飛んで来たのか(どのあたりまで正常に実行されて
いたのか)あたりを付けられるようにしてみたのですが、今度は別のマクロを書いてCS+(旧CubeSuite+)の
コールスタックウィンドウやローカル変数ウィンドウと組み合わせてみました。(実地でも思惑通りに行くか
どうかは後で考えることにして。それとコードサイズや実行クロック数についても後で考えることにして。)

コールスタックウィンドウというのはスタック上のデータを調べて以下のように関数呼び出しの階層を表示
するデバッガの機能ですが、スタック上のデータが破壊されていなければ原理的にはPCとHL/SPの値を復元
すれば機能します。(なお、この機能の呼び方ですが、デバッガによって微妙に違う呼び方だったりします。)




今回書いたマクロは以下の通りです。

#define SP (*(volatile uint16_t *)0xffff8)
__far void (*cp_s_pc_val)(void);
__near void *cp_s_sp_val;
__far void (*cp_e_pc_val)(void);
__near void *cp_e_sp_val;
__far void * __far getPC(void);
#define CHECKPOINT_S() {cp_s_pc_val = getPC(); cp_s_sp_val = (__near void *)SP; cp_e_pc_val = 0; cp_e_sp_val = 0;}
#define CHECKPOINT_E() {cp_e_pc_val = getPC(); cp_e_sp_val = (__near void *)SP;}


試したプログラムは関数ポインタfnpを使用していますが、意図的に配列varの上限を超えて書き込んでいます
ので、関数ポインタfnpの内容が破壊されるようにしてあります。ですので、プログラムを実行すると以下の
ように変なところでブレークします。そして、ブレークした時にはコールスタックウィンドウやローカル変数
ウィンドウの内容が空になります。



ですが、変数cp_s_pc_valと変数cp_s_sp_valには正常に実行されていた時のPCとSPの値が格納されています
ので、Pythonコンソール上で以下のコマンドを実行してPCとHL/SPの値を復元してやると、コールスタック
ウィンドウやローカル変数ウィンドウに正常に実行されていた時点の内容が表示されるようになります。(実地
でも思惑通りに行くかどうかは後で考えることにします。それとコードサイズや実行クロック数についても
後で考えることにします。まずは、試してみました、というところです。)

debugger.Register.SetValue("PC", debugger.Watch.GetValue("cp_s_pc_val"))
debugger.Register.SetValue("HL", debugger.Watch.GetValue("cp_s_sp_val"))
debugger.Register.SetValue("SP", debugger.Watch.GetValue("cp_s_sp_val"))
debugger.Jump.Address(JumpType.Source, debugger.GetPC())



追記 : 補足

関数ポインタによる呼び出しが正常に行われたことを確認する為にCHECKPOINT_S()とCHECKPOINT_E()で
サンドイッチしたのですが、CHECKPOINT_E()は呼び出される各関数の先頭に配置した方が良かったかも、、、
(呼び出された関数の実行中に変なところへ飛ぶこともある訳ですし、、、)

あと、CHECKPOINT_S()とCHECKPOINT_E()の両方通過している場合、CHECKPOINT_S()を置いた関数が
リターンした後に別の関数の呼び出しでスタック上のデータが書き換えられてしまいますので、PCとHL/SPの
値を復元してやっても期待した表示にはならないです。

追記 : メモ

ちなみに、コールスタックウィンドウですが、もともと常に正確な値を表示する訳ではないようです。以下の
ように、最初正しく表示されていたfunc1の表示も呼び出しの階層が増えていくと間違った表示になりました。
(もっとも、その場合にはfunc1が淡色表示になりましたので、正しくないかもしれないことは分かりました。)













関連記事

2015/02/03   blog-entry-565   category: RL78 /* 16bit,8bit CISC */

go page top