7

私は Common Lisp を使って開発を始めて 1 年近くになりますが、これには本当に神経質になり始めています。CLISP を使用して CL のプログラミングを開始しましたが、後でスピードのために SBCL に切り替えました。私はかなり低レベルのことをたくさんしているので、多くの C コードとのインターフェースが必要です。私は CL のインクリメンタルな開発の側面が本当に好きです (私は Emacs を使用していません - Vim で SLIMV を実行しています) が、Python、Perl、C、さらには NASM よりも開発が遅いことに気づきました。問題の根本は、SBCL のエラー メッセージにあります。SBCL が私にERROR: Invalid number of arguments on foreign function #< some memory address >. どの関数が呼び出されたかの指定も、行番号も何もありません。最近では、私は得る喜びを持っていましたThe loaded code expects an incompatible layout for class SB-PRETTY:PRETTY-STREAM.無作為に。このコードは CLISP では正常に実行されますが、SBCL では不明なエラーで失敗します。これらのメッセージをもう少し有益なものにする方法はありますか? 私は C とアセンブリをほぼ 6 年間書いてきましたが、行番号も教えてくれます。私が見た中途半端な SBCL エラーはリーダー エラーだけでした。これらは通常、括弧の欠落につながるため、ほとんど役に立ちません。繰り返しますが、これを変更するために使用できる宣言/コマンド ライン スイッチはありますか? この時点で、独自のエラー プリンターを作成してもかまいません。

編集:(sb-ext:restrict-compiler-policy 'debug 3)私の ~/.sbclrc の例 (.sbclrc がロードされるように --script ではなく --load を使用)

debugger invoked on a SB-INT:SIMPLE-PROGRAM-ERROR in thread
#<THREAD "main thread" RUNNING {AB09931}>:
  invalid number of arguments: 0

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(SB-KERNEL::INVALID-ARG-COUNT-ERROR-HANDLER
 #<unavailable argument>
 #.(SB-SYS:INT-SAP #XB78CDAE0)
 #<SB-ALIEN-INTERNALS:ALIEN-VALUE :SAP #XB78CD7DC :TYPE (*
                                                         (STRUCT
                                                          SB-VM::OS-CONTEXT-T-STRUCT))>
 (79))
0] print
(SB-KERNEL::INVALID-ARG-COUNT-ERROR-HANDLER
    #<unavailable argument>
    #.(SB-SYS:INT-SAP #XB78CDAE0)
    #<SB-ALIEN-INTERNALS:ALIEN-VALUE :SAP #XB78CD7DC :TYPE (*
                                                            (STRUCT
                                                             SB-VM::OS-CONTEXT-T-STRUCT))>
    (79))
0] down
(SB-KERNEL:INTERNAL-ERROR
    #.(SB-SYS:INT-SAP #XB78CD7DC)
    #<unavailable argument>)
1] down
("foreign function: #x805FCBB")
2] down

Bottom of stack.

正確には有益ではありません。

4

5 に答える 5

4

私はあなたが探していると思います:(sb-ext:restrict-compiler-policy 'debug 3)

~/.sbclrcこれを自分の REPL や REPL に入れることができ、SBCL のデバッガ (特に SLIME の場合) はより有用な結果を生成します。

于 2012-12-23T18:49:51.243 に答える
2

私が最近学んだもう1つのこと、そしてこれはあなたの状況で役立つかもしれません:

  1. 十分なデバッグレベルですべてをコンパイルしてください。
  2. 疑わしいコードを(step ...)フォームにラップします。そこから、再起動をたどることができます。これは、GDBや他のステップデバッガー(step-next、step-into、step-out、step-countinueが可能)と非常によく似ていることがわかります。必要な関数を取得するのは少し面倒かもしれませんが、それがどこから来ているのかまったくわからない場合は、それを方法論として使用し、小さなコードをテストすると役立ちます。

詳細:http ://www.sbcl.org/manual/#Single-Stepping

于 2012-12-23T20:19:11.880 に答える
1

実行時エラーが発生した場合 (invalid number of argumentsそのカテゴリに分類されると思われます)、デバッガーにドロップする必要があります (明示的に無効にしていない限り)。 .

loaded code expects a different layout...、異なる時点でコンパイルされた 2 つのコンパイル済みコード、または内部に深く入り込みすぎているコードを見ていることを示します。まず、すべてのコードを強制的に再コンパイルし、警告が消えるかどうかを確認します。

于 2012-12-23T18:45:39.353 に答える