今回はuLispのデバッグ機能。この機能はエディタ同様uLisp処理系そのものに組み込まれており、外部プログラムなど必要とはしません。ただし機能を顕現させるには事前の準備が必要です。まずはユーザープログラムの書き換え不要な trace が第1チョイスかと。関数内部の奥深くに探りを入れる場合は breakすかね。
※Lispと一緒 投稿順 index はこちら
※実機確認は Raspberry Pi Pico2で行ってます。
※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。
traceとbreakは使える、backtraceは不在
Lisp素人老人の推しの trace と、はらわたの中に踏み込める break の2つは当方使用のuLispバージョン上で使えます。しかし、uLispのLanguage referenceに記載のある backtrace という関数は当方使用のバージョンでは使えないようでした。こんな感じ。
まあ、backtraceなくても前述の2つでなんとかなるかと、個人の感想です。
-
- trace
trace関数は、以下のように指定した、ターゲット関数の呼び出しと関数から戻りのときに表示をしてくれる設定をするものです。
(trace sha256-rdy)
上記のように設定すれば sha256-rdy関数が呼び出される度、また戻る度に表示をしてくれます。ユーザー関数のコードに細工をする必要などないので、デバッグ対象のプログラムを走らせる前に (trace チョメチョメ)しておけば使用できます。またデバッグ終えたら
(untrace)
とすれば、トレース設定は消え去るのでお手軽。
-
- break
一方、ブレークポイントを設置するbreak関数はデバッグ対象のソースを操作して「組み込む」必要があります。メンドクセーです。しかし、御利益はあらたか。関数の内部に踏み込んで「ブレーク」し、ローカル変数どもの値などを洗いざらい調べることができます。込み入った関数の内部動作が分からね~とかいう場合にはこっちかなと思います。当然ながら取り外す場合はbreakを手動で消さねばなりませぬ。組み込みエディタの出番か?
traceの使用例
前回のハードウエアSHA256計算機試用のプログラムを使って trace を行ってみました。まずは sha256-rdyという関数(ハードウエアSHA256計算機の入力レジスタであるWDATAというレジスタに書き込みレディになるまで待つという関数です。待っている間、自分で自分を呼び出してくるくる回ります。)にしかけたところが以下に。サンプルデータを食わせたところ、何度も sha256-rdyが呼び出されてます。
まあ、トレースできとるみたいね。
このトレースをかけられる関数の数には上限があり、手元の処理系では最大3個となってました(リファレンスマニュアルには書いてないような。)以下のように2関数を追加することはできます。
追加するたびに、トレース中の関数名のリストが返ってくるので確認もお楽。
しかし4関数目を追加しようとすると以下のようにはねられます。
まあね、3つもトレースできれば十分だろ~ということ?
ちゃんと待ちが入っていることも、値が返っていることも分かった。よかった。
breakの使用例
break機能を使う場合、break関数を目的の関数の所望の位置に組み込まないとなりませぬ。uLispのエディタを活用してもよいところですが、気力の無い老人は、ソースファイルをパソコン上のエディタで操作して再アップロードするというヘタレな方法で行いました。修正したソースファイルが以下に。
上記の緑色のマーカ部分が組み込んだ breakです。
さて上記のようにループの内部に組み込んだ結果が以下に。初回のブレークポイント発生時が以下に。
Break!の掛け声?とともに、普段みない : 1> というプロンプトが出現。このプロンプトは関数内部のローカル変数もみることができるので、ループの制御変数のxを入力すればその値が見え、また結果格納リストの resをみればまだ何も入ってないことも分かります。
プロンプトにたいして nil を入力すれば処理に戻ってくれます。
いれた場所がループ内部なので、ループを回る度にブレークされます。2回目は以下のように。
ループを回る度に、リストが伸びてます。良かった。
まあ、こんだけあればデバッグは出来る。ホントか?