Lispと一緒(43) ラズパイPico2でもuLisp、breakとtrace、デバッグ

Joseph Halfmoon

今回は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 という関数は当方使用のバージョンでは使えないようでした。こんな感じ。no_backtrace

まあ、backtraceなくても前述の2つでなんとかなるかと、個人の感想です。

    • trace

trace関数は、以下のように指定した、ターゲット関数の呼び出しと関数から戻りのときに表示をしてくれる設定をするものです。

(trace sha256-rdy)

上記のように設定すれば sha256-rdy関数が呼び出される度、また戻る度に表示をしてくれます。ユーザー関数のコードに細工をする必要などないので、デバッグ対象のプログラムを走らせる前に (trace チョメチョメ)しておけば使用できます。またデバッグ終えたら

(untrace)

とすれば、トレース設定は消え去るのでお手軽。

    • break

一方、ブレークポイントを設置するbreak関数はデバッグ対象のソースを操作して「組み込む」必要があります。メンドクセーです。しかし、御利益はあらたか。関数の内部に踏み込んで「ブレーク」し、ローカル変数どもの値などを洗いざらい調べることができます。込み入った関数の内部動作が分からね~とかいう場合にはこっちかなと思います。当然ながら取り外す場合はbreakを手動で消さねばなりませぬ。組み込みエディタの出番か?

traceの使用例

前回のハードウエアSHA256計算機試用のプログラムを使って trace を行ってみました。まずは sha256-rdyという関数(ハードウエアSHA256計算機の入力レジスタであるWDATAというレジスタに書き込みレディになるまで待つという関数です。待っている間、自分で自分を呼び出してくるくる回ります。)にしかけたところが以下に。サンプルデータを食わせたところ、何度も sha256-rdyが呼び出されてます。trace_1start

最後の呼び出しと戻りの後、予定通りの値が返されてます。trace_1end

まあ、トレースできとるみたいね。

このトレースをかけられる関数の数には上限があり、手元の処理系では最大3個となってました(リファレンスマニュアルには書いてないような。)以下のように2関数を追加することはできます。more_trace

追加するたびに、トレース中の関数名のリストが返ってくるので確認もお楽。

しかし4関数目を追加しようとすると以下のようにはねられます。TRACE_MAX

まあね、3つもトレースできれば十分だろ~ということ?

上記3関数を同時トレースしたときの結果が以下に。trace_3endEC

ちゃんと待ちが入っていることも、値が返っていることも分かった。よかった。

breakの使用例

break機能を使う場合、break関数を目的の関数の所望の位置に組み込まないとなりませぬ。uLispのエディタを活用してもよいところですが、気力の無い老人は、ソースファイルをパソコン上のエディタで操作して再アップロードするというヘタレな方法で行いました。修正したソースファイルが以下に。break_src

上記の緑色のマーカ部分が組み込んだ breakです。

さて上記のようにループの内部に組み込んだ結果が以下に。初回のブレークポイント発生時が以下に。break1

Break!の掛け声?とともに、普段みない : 1> というプロンプトが出現。このプロンプトは関数内部のローカル変数もみることができるので、ループの制御変数のxを入力すればその値が見え、また結果格納リストの resをみればまだ何も入ってないことも分かります。break1a

プロンプトにたいして nil を入力すれば処理に戻ってくれます。

いれた場所がループ内部なので、ループを回る度にブレークされます。2回目は以下のように。break2a

3回目のブレークでは以下のように。break3a

ループを回る度に、リストが伸びてます。良かった。

まあ、こんだけあればデバッグは出来る。ホントか?

Lispと一緒(42) ラズパイPico2でもuLisp、SHA256ハードを試用 へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です