7
votes

Messages d'erreur SBCL: Toute façon d'améliorer?

Je développe avec des LISP communes depuis presque un an maintenant, et cela commence vraiment à me nerfs. J'ai démarré la programmation de CL à l'aide de Clisp, mais j'ai ensuite été commutée vers SBCl pour la vitesse. Je fais beaucoup de choses plutôt basse niveau, alors j'ai besoin d'interfacer avec beaucoup de code C. J'aime beaucoup l'aspect de développement incrémental de CL (je n'utilise pas Emacs cependant - je suis en train de courir SlimV dans Vim), mais je me trouve plus lentement que je ne le ferais plus lentement que dans Python, Perl, C ou même Nasm. La racine du problème réside dans les messages d'erreur de SBCL. Une fois, j'ai été obligé de rechercher à travers près de 500 lignes de code car SBCL a décidé de me donner une erreur : Nombre non valide d'arguments sur la fonction étranger # code>. Aucune désignation de quelle fonction a été appelée, aucun numéro de ligne, rien. Plus récemment, j'ai eu le plaisir d'obtenir le code chargé attend une mise en page incompatible pour la classe SB-jolie: joli-flux. Code> au hasard. Le code fonctionne bien sur Clisp, mais échoue simplement avec des erreurs obscures sur SBCl. Y a-t-il un moyen de rendre ces messages un peu plus informatif? J'ai écrit C et l'Assemblée depuis près de 6 ans maintenant, et même ils vous donneront un numéro de ligne. Les erreurs SBCL raisonnables à mi-chemin que j'ai constatées ont été des erreurs de lecture, qui sont presque inutiles car elles constituent généralement une parenthèse manquante. Encore une fois, existe-t-il un commutateur de déclaration / ligne de commande qui peut être utilisé pour changer cela? J'avais même d'accord avec l'écriture de ma propre imprimante d'erreur à ce stade.

EDIT: Un exemple, avec (SB-EXT: restreindre-compiler-stratégie 'Débogu 3) code> dans mon ~ / .sbclrc (à l'aide de --load plutôt que --Script SO .SBCLRC est chargé) P >

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.


3 commentaires

Ces questions sont mieux posées sur la liste de diffusion SBCL. Avec code exemple, lorsque possible. Les personnes qui maintiennent le compilateur SBCL n'écoutent là-bas.


Avez-vous essayé Clozure et leur pont d'objectif C? Je n'ai pas eu trop de problème avec les messages d'erreur générés dans la mise en œuvre du LISP lors de la communication avec des routines d'objectif C. Ce que je sais n'est pas c, mais vous pourriez trouver une inspiration là-bas.


De plus, avec SlimV, vous obtenez le tampon de débogueur Oui, qui montre la backtrage, que vous pouvez naviguer autour et voir l'état variable, etc.?


5 Réponses :


1
votes

Si vous obtenez une erreur d'exécution (je soupçonne que le numéro non valide d'arguments tombe dans cette catégorie), vous devez tomber dans un débogueur (sauf si vous avez explicitement désactivé cela) et un dos -Trace serait probablement vous montrer exactement où l'appel a été fait.

Le code chargé attend une mise en page différente ... indique que vous examinez deux morceaux de code compilé, compilé à un moment différent, ou code qui accroche un peu trop profondément dans les internes . Tout d'abord, forcez une recompilation de tout votre code et voyez si l'avertissement disparaît.


1 commentaires

Oui, cela me tombe dans un débogueur, mais le problème est que le nombre d'arguments invalide est dans un appel de fonction étranger, de sorte que la piqûre ait seulement 3 profondes, dont le plus bas est .



4
votes

Je pense que vous recherchez: (SB-EXT: restreindre-compiler-stratégie 'Débogu 3)

Vous pouvez le mettre dans votre ~ / .sbclrc ou dans votre réplique, et le débogueur de SBCL (surtout en SLIMe) produira des résultats beaucoup plus utiles.


0 commentaires

2
votes

Une dernière chose que j'ai apprise récemment, et ce peut être utile dans votre situation:

  1. Assurez-vous de tout compiler avec un niveau de débogage suffisant.
  2. enveloppez le code que vous soupçonnez dans (étape ...) formulaire. À partir de là, vous pouvez suivre des redémarrages, que vous reconnaîtrez comme étant très similaires à GDB et à d'autres steps-Debuggers (vous pouvez passer à l'étape suivante, étape, pas à pas) à partir de là. Il peut être un peu fastidieux d'arriver à la fonction dont vous avez besoin, si vous n'avez absolument aucune idée de l'endroit où elle vient, mais si vous l'utilisez comme une méthodologie, testez des pièces de code plus petites, cela aide.

    Plus d'info: http://www.sbcl.org/manual/#single-stepping


0 commentaires

4
votes

Ceci est un problème courant avec les distributions qui "personnaliser" le script de construction; Arch Linux est un délinquant régulier. L'installation de binaires de SBCL.org est la méthode la plus fiable. C'est assez facile à construire à partir de la source si l'on veut le plus récent et le plus grand.


0 commentaires

2
votes

J'ai presque 7 ans de retard, mais je vais ajouter des conseils utiles. Après avoir marqué de voir des erreurs en train de faire des erreurs et ne sachant que quelle fonction ils étaient dans, mais aucun numéro de ligne ou quoi que ce soit, j'ai trouvé cette question de dépassement de pile. Cela n'a pas beaucoup aidé, alors j'ai enfin lu le manuel SLIME. https://common-lisp.net/project/slime/#documentation << / p>

Je ne sais pas si cela aurait aidé l'affiche originale, mais lorsqu'une erreur apparaît et que vous êtes dans le débogueur SLIMe, frappez "V '(dans EMACS, pas sûr de VIM) vous montrera le code source où l'erreur est en cours. Vous pouvez également parcourir d'autres entrées dans la trace de la pile et cliquez sur "V".

Il y a d'autres conseils utiles dans le manuel de la SLIME dans la section de débogage. C'est vraiment agréable de pouvoir évaluer les expressions dans le même cadre de pile où l'erreur est originaire.


0 commentaires