<div dir="ltr"><div>Here are some examples of new versus old stacktrace.</div><div><br></div><div>"!" means the frame was in the java exception stacktrace, but are no</div><div>longer present because the exception was caught</div><div><br></div><div><span style="font-family:monospace,monospace">#### Generate error with: (#"new" 'bloh)</span><br></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">________________ New stacktrace </font></div><div><font face="monospace, monospace">Java exception 'java.lang.ClassNotFoundException: BLOH'.</font></div><div><font face="monospace, monospace">   [Condition of type java-exception]</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Restarts:</font></div><div><font face="monospace, monospace"> 0: [retry] Retry SLIME REPL evaluation request.</font></div><div><font face="monospace, monospace"> 1: [*abort] Return to SLIME's top level.</font></div><div><font face="monospace, monospace"> 2: [abort] Abort thread.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Backtrace:</font></div><div><font face="monospace, monospace">  0: (invoke-debugger #<java:java-exception java.lang.ClassNotFoundException: BLOH {5C19BF31}>)</font></div><div><font face="monospace, monospace">  1: org.armedbear.lisp.Lisp.error(Lisp.java:382)</font></div><div><font face="monospace, monospace">  2: ! java.net.URLClassLoader.findClass(URLClassLoader.java:381)</font></div><div><font face="monospace, monospace">  3: ! java.lang.ClassLoader.loadClass(ClassLoader.java:424)</font></div><div><font face="monospace, monospace">  4: ! org.armedbear.lisp.JavaClassLoader.loadClass(JavaClassLoader.java:60)</font></div><div><font face="monospace, monospace">  5: ! java.lang.Class.forName0(Native Method)</font></div><div><font face="monospace, monospace">  6: ! java.lang.Class.forName(Class.java:348)</font></div><div><font face="monospace, monospace">  7: ! java.lang.reflect.Method.invoke(Method.java:497)</font></div><div><font face="monospace, monospace">  8: (java:jstatic #<method public static java.lang.Class java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader) throws java.lang.ClassNotFoundException> "java.lang.Class" "BLOH" #<<a href="http://java.la">java.la</a>..</font></div><div><font face="monospace, monospace">  9: (jss:find-java-class "BLOH")</font></div><div><font face="monospace, monospace"> 10: (#"new" common-lisp-user::bloh)</font></div><div><font face="monospace, monospace"> 11: (#<anonymous-interpreted-function {7D30E302}> common-lisp-user::bloh)</font></div><div><font face="monospace, monospace"> 12: (system::%eval (#"new" 'common-lisp-user::bloh))</font></div><div><font face="monospace, monospace"> 13: (eval (#"new" 'common-lisp-user::bloh))</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">________________ Old stacktrace</font></div><div><font face="monospace, monospace">Java exception 'java.lang.ClassNotFoundException: BLOH'.</font></div><div><font face="monospace, monospace">   [Condition of type java-exception]</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Restarts:</font></div><div><font face="monospace, monospace"> 0: [retry] Retry SLIME REPL evaluation request.</font></div><div><font face="monospace, monospace"> 1: [*abort] Return to SLIME's top level.</font></div><div><font face="monospace, monospace"> 2: [abort] Abort thread.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Backtrace:</font></div><div><font face="monospace, monospace">  0: (system:backtrace)</font></div><div><font face="monospace, monospace">  1: (system::new-backtrace #<java:java-exception java.lang.ClassNotFoundException: BLOH {48D709DB}>)</font></div><div><font face="monospace, monospace">  2: (#<local-function in make-invoke-debugger-hook {FB48C75}> #<java:java-exception java.lang.ClassNotFoundException: BLOH {48D709DB}> #<local-function in make-invoke-debugger-hook {FB48C75}>)</font></div><div><font face="monospace, monospace">  3: (apply #<local-function in make-invoke-debugger-hook {FB48C75}> (#<java:java-exception java.lang.ClassNotFoundException: BLOH {48D709DB}> #<local-function in make-invoke-debugger-hook {FB48C75}>))</font></div><div><font face="monospace, monospace">  4: (system::run-hook system::*invoke-debugger-hook* #<java:java-exception java.lang.ClassNotFoundException: BLOH {48D709DB}> #<local-function in make-invoke-debugger-hook {FB48C75}>)</font></div><div><font face="monospace, monospace">  5: (invoke-debugger #<java:java-exception java.lang.ClassNotFoundException: BLOH {48D709DB}>)</font></div><div><font face="monospace, monospace">  6: org.armedbear.lisp.Lisp.error(Lisp.java:382)</font></div><div><font face="monospace, monospace">  7: org.armedbear.lisp.Java.jstatic(Java.java:484)</font></div><div><font face="monospace, monospace">  8: org.armedbear.lisp.Java$pf_jstatic.execute(Java.java:510)</font></div><div><font face="monospace, monospace">  9: org.armedbear.lisp.Primitive.execute(Primitive.java:163)</font></div><div><font face="monospace, monospace"> 10: (java:jstatic #<method public static java.lang.Class java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader) throws java.lang.ClassNotFoundException> "java.lang.Class" "BLOH" #<<a href="http://java.la">java.la</a>..</font></div><div><font face="monospace, monospace"> 11: (jss:find-java-class "BLOH")</font></div><div><font face="monospace, monospace"> 12: (#"new" common-lisp-user::bloh)</font></div><div><font face="monospace, monospace"> 13: (#<anonymous-interpreted-function {641792AC}> common-lisp-user::bloh)</font></div><div><font face="monospace, monospace"> 14: (system::%eval (#"new" 'common-lisp-user::bloh))</font></div><div><font face="monospace, monospace"> 15: (eval (#"new" 'common-lisp-user::bloh))</font></div><div><font face="monospace, monospace"><br></font></div><div><span style="font-family:monospace,monospace">################ Generate error with: (+ 1 nil)</span><br></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">________________ New stacktrace</font></div><div><font face="monospace, monospace">The value nil is not of type number.</font></div><div><font face="monospace, monospace">   [Condition of type type-error]</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Restarts:</font></div><div><font face="monospace, monospace"> 0: [retry] Retry SLIME REPL evaluation request.</font></div><div><font face="monospace, monospace"> 1: [*abort] Return to SLIME's top level.</font></div><div><font face="monospace, monospace"> 2: [abort] Abort thread.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Backtrace:</font></div><div><font face="monospace, monospace">  0: (invoke-debugger #<type-error {4848F05A}>)</font></div><div><font face="monospace, monospace">  1: org.armedbear.lisp.Lisp.error(Lisp.java:382)</font></div><div><font face="monospace, monospace">  2: org.armedbear.lisp.Lisp.type_error(Lisp.java:435)</font></div><div><font face="monospace, monospace">  3: (+ 1 nil)</font></div><div><font face="monospace, monospace">  4: (system::%eval (+ 1 nil))</font></div><div><font face="monospace, monospace">  5: (eval (+ 1 nil))</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">________________ Old stacktrace</font></div><div><font face="monospace, monospace">The value nil is not of type number.</font></div><div><font face="monospace, monospace">   [Condition of type type-error]</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Restarts:</font></div><div><font face="monospace, monospace"> 0: [retry] Retry SLIME REPL evaluation request.</font></div><div><font face="monospace, monospace"> 1: [*abort] Return to SLIME's top level.</font></div><div><font face="monospace, monospace"> 2: [abort] Abort thread.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Backtrace:</font></div><div><font face="monospace, monospace">  0: (system:backtrace)</font></div><div><font face="monospace, monospace">  1: (system::new-backtrace #<type-error {631F4DD}>)</font></div><div><font face="monospace, monospace">  2: (#<local-function in make-invoke-debugger-hook {FB48C75}> #<type-error {631F4DD}> #<local-function in make-invoke-debugger-hook {FB48C75}>)</font></div><div><font face="monospace, monospace">  3: (apply #<local-function in make-invoke-debugger-hook {FB48C75}> (#<type-error {631F4DD}> #<local-function in make-invoke-debugger-hook {FB48C75}>))</font></div><div><font face="monospace, monospace">  4: (system::run-hook system::*invoke-debugger-hook* #<type-error {631F4DD}> #<local-function in make-invoke-debugger-hook {FB48C75}>)</font></div><div><font face="monospace, monospace">  5: (invoke-debugger #<type-error {631F4DD}>)</font></div><div><font face="monospace, monospace">  6: org.armedbear.lisp.Lisp.error(Lisp.java:382)</font></div><div><font face="monospace, monospace">  7: org.armedbear.lisp.Lisp.type_error(Lisp.java:435)</font></div><div><font face="monospace, monospace">  8: org.armedbear.lisp.Fixnum.add(Fixnum.java:387)</font></div><div><font face="monospace, monospace">  9: org.armedbear.lisp.Primitives$pf_add.execute(Primitives.java:752)</font></div><div><font face="monospace, monospace"> 10: (+ 1 nil)</font></div><div><font face="monospace, monospace"> 11: (system::%eval (+ 1 nil))</font></div><div><font face="monospace, monospace"> 12: (eval (+ 1 nil))</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><span style="font-family:monospace,monospace">#### Generate error by typing #< then return into the slime repl</span><br></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">________________ New stacktrace</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Illegal # macro character: #\<</font></div><div><font face="monospace, monospace">   [Condition of type reader-error]</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Restarts:</font></div><div><font face="monospace, monospace"> 0: [retry] Retry SLIME REPL evaluation request.</font></div><div><font face="monospace, monospace"> 1: [*abort] Return to SLIME's top level.</font></div><div><font face="monospace, monospace"> 2: [abort] Abort thread.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Backtrace:</font></div><div><font face="monospace, monospace">  0: (invoke-debugger #<reader-error {25D021FB}>)</font></div><div><font face="monospace, monospace">  1: (error #<reader-error {25D021FB}>)</font></div><div><font face="monospace, monospace">  2: org.armedbear.lisp.Lisp.error(Lisp.java:382)</font></div><div><font face="monospace, monospace">  3: org.armedbear.lisp.LispReader$22.execute(LispReader.java:350) = #<function sharp-illegal {2EF7C108}></font></div><div><font face="monospace, monospace">  4: org.armedbear.lisp.Stream.readDispatchChar(Stream.java:813)</font></div><div><font face="monospace, monospace">  5: org.armedbear.lisp.LispReader$6.execute(LispReader.java:130) = #<function read-dispatch-char {153CFE29}></font></div><div><font face="monospace, monospace">  6: org.armedbear.lisp.Stream.processChar(Stream.java:588)</font></div><div><font face="monospace, monospace">  7: org.armedbear.lisp.Stream.readPreservingWhitespace(Stream.java:557)</font></div><div><font face="monospace, monospace">  8: org.armedbear.lisp.Stream.readPreservingWhitespace(Stream.java:566)</font></div><div><font face="monospace, monospace">  9: (read #S(system::string-input-stream) nil #S(system::string-input-stream))</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">________________ Old stacktrace</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Illegal # macro character: #\<</font></div><div><font face="monospace, monospace">   [Condition of type reader-error]</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Restarts:</font></div><div><font face="monospace, monospace"> 0: [retry] Retry SLIME REPL evaluation request.</font></div><div><font face="monospace, monospace"> 1: [*abort] Return to SLIME's top level.</font></div><div><font face="monospace, monospace"> 2: [abort] Abort thread.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Backtrace:</font></div><div><font face="monospace, monospace">  0: (system:backtrace)</font></div><div><font face="monospace, monospace">  1: (system::new-backtrace #<reader-error {35F15D9A}>)</font></div><div><font face="monospace, monospace">  2: (#<local-function in make-invoke-debugger-hook {FB48C75}> #<reader-error {35F15D9A}> #<local-function in make-invoke-debugger-hook {FB48C75}>)</font></div><div><font face="monospace, monospace">  3: (apply #<local-function in make-invoke-debugger-hook {FB48C75}> (#<reader-error {35F15D9A}> #<local-function in make-invoke-debugger-hook {FB48C75}>))</font></div><div><font face="monospace, monospace">  4: (system::run-hook system::*invoke-debugger-hook* #<reader-error {35F15D9A}> #<local-function in make-invoke-debugger-hook {FB48C75}>)</font></div><div><font face="monospace, monospace">  5: (invoke-debugger #<reader-error {35F15D9A}>)</font></div><div><font face="monospace, monospace">  6: (error #<reader-error {35F15D9A}>)</font></div><div><font face="monospace, monospace">  7: (#<local-function in eval-region {12C6FD1A}> #<reader-error {35F15D9A}>)</font></div><div><font face="monospace, monospace">  8: (signal #<reader-error {35F15D9A}>)</font></div><div><font face="monospace, monospace">  9: org.armedbear.lisp.Lisp.error(Lisp.java:382)</font></div><div><font face="monospace, monospace"> 10: org.armedbear.lisp.LispReader$22.execute(LispReader.java:350) = #<function sharp-illegal {2EF7C108}></font></div><div><font face="monospace, monospace"> 11: org.armedbear.lisp.Stream.readDispatchChar(Stream.java:813)</font></div><div><font face="monospace, monospace"> 12: org.armedbear.lisp.LispReader$6.execute(LispReader.java:130) = #<function read-dispatch-char {153CFE29}></font></div><div><font face="monospace, monospace"> 13: org.armedbear.lisp.Stream.processChar(Stream.java:588)</font></div><div><font face="monospace, monospace"> 14: org.armedbear.lisp.Stream.readPreservingWhitespace(Stream.java:557)</font></div><div><font face="monospace, monospace"> 15: org.armedbear.lisp.Stream.readPreservingWhitespace(Stream.java:566)</font></div><div><font face="monospace, monospace"> 16: org.armedbear.lisp.Stream.read(Stream.java:501)</font></div><div><font face="monospace, monospace"> 17: org.armedbear.lisp.Stream$16.execute(Stream.java:2436) = #<function read {7905182E}></font></div><div><font face="monospace, monospace"> 18: org.armedbear.lisp.Symbol.execute(Symbol.java:826)</font></div><div><font face="monospace, monospace"> 19: org.armedbear.lisp.LispThread.execute(LispThread.java:851)</font></div><div><font face="monospace, monospace"> 20: org.armedbear.lisp.swank_528.execute(swank.lisp:1732) = #<function eval-region {6A067578}></font></div><div><font face="monospace, monospace"> 21: org.armedbear.lisp.Symbol.execute(Symbol.java:803)</font></div><div><font face="monospace, monospace"> 22: org.armedbear.lisp.LispThread.execute(LispThread.java:814)</font></div><div><font face="monospace, monospace"> 23: org.armedbear.lisp.swank_repl_47.execute(swank-repl.lisp:270) = #<local-function in repl-eval {7AA59573}></font></div><div><font face="monospace, monospace"> 24: org.armedbear.lisp.LispThread.execute(LispThread.java:798)</font></div><div><font face="monospace, monospace"> 25: org.armedbear.lisp.swank_repl_48.execute(swank-repl.lisp:283) = #<function track-package {24491179}></font></div><div><font face="monospace, monospace"> 26: org.armedbear.lisp.Symbol.execute(Symbol.java:803)</font></div><div><font face="monospace, monospace"> 27: org.armedbear.lisp.LispThread.execute(LispThread.java:814)</font></div><div><font face="monospace, monospace"> 28: org.armedbear.lisp.swank_repl_46.execute(swank-repl.lisp:270) = #<local-function in repl-eval {6A4AF4AE}></font></div><div><font face="monospace, monospace"> 29: org.armedbear.lisp.LispThread.execute(LispThread.java:798)</font></div><div><font face="monospace, monospace"> 30: org.armedbear.lisp.swank_272.execute(swank.lisp:490) = #<function call-with-retry-restart {4E68726}></font></div><div><font face="monospace, monospace"> 31: org.armedbear.lisp.Symbol.execute(Symbol.java:814)</font></div><div><font face="monospace, monospace"> 32: org.armedbear.lisp.LispThread.execute(LispThread.java:832)</font></div><div><font face="monospace, monospace"> 33: org.armedbear.lisp.swank_repl_45.execute(swank-repl.lisp:270) = #<local-function in repl-eval {18F59278}></font></div><div><font face="monospace, monospace"> 34: org.armedbear.lisp.LispThread.execute(LispThread.java:798)</font></div><div><font face="monospace, monospace"> 35: abcl_027941ee_2c60_4fe0_8ae7_0a41efb34cac.execute(Unknown Source) = #<function call-with-syntax-hooks {16BB516F}></font></div><div><font face="monospace, monospace"> 36: org.armedbear.lisp.LispThread.execute(LispThread.java:814)</font></div><div><font face="monospace, monospace"> 37: org.armedbear.lisp.Lisp.funcall(Lisp.java:172)</font></div><div><font face="monospace, monospace"> 38: org.armedbear.lisp.Primitives$pf_apply.execute(Primitives.java:2827) = #<function apply {61157D6}></font></div><div><font face="monospace, monospace"> 39: (read #S(system::string-input-stream) nil #S(system::string-input-stream))</font></div><div><font face="monospace, monospace"> 40: (swank::eval-region "#<\n")</font></div><div><font face="monospace, monospace"> 41: (#<local-function in repl-eval {78DF6AB0}>)</font></div><div><font face="monospace, monospace"> 42: (swank-repl::track-package #<local-function in repl-eval {78DF6AB0}>)</font></div><div><font face="monospace, monospace"> 43: (#<local-function in repl-eval {5C2443A9}>)</font></div><div><font face="monospace, monospace"> 44: (swank::call-with-retry-restart "Retry SLIME REPL evaluation request." #<local-function in repl-eval {5C2443A9}>)</font></div><div><font face="monospace, monospace"> 45: (#<local-function in repl-eval {6386D83A}>)</font></div><div><font face="monospace, monospace"> 46: (swank/backend:call-with-syntax-hooks #<local-function in repl-eval {6386D83A}>)</font></div><div><font face="monospace, monospace"> 47: (apply #<function call-with-syntax-hooks {16BB516F}> #<local-function in repl-eval {6386D83A}> nil)</font></div><div><font face="monospace, monospace"> 48: (swank/backend:call-with-syntax-hooks #<local-function in repl-eval {6386D83A}>)</font></div><div><font face="monospace, monospace"> 49: (swank::call-with-buffer-syntax nil #<local-function in repl-eval {6386D83A}>)</font></div><div><font face="monospace, monospace"> 50: (swank-repl::repl-eval "#<\n")</font></div><div><font face="monospace, monospace"> 51: (swank-repl:listener-eval "#<\n")</font></div><div><font face="monospace, monospace"> 52: (system::%eval (swank-repl:listener-eval "#<\n"))</font></div><div><font face="monospace, monospace"> 53: (eval (swank-repl:listener-eval "#<\n"))</font></div><div><font face="monospace, monospace"> 54: (swank:eval-for-emacs (swank-repl:listener-eval "#<\n") "COMMON-LISP-USER" 418)</font></div><div><font face="monospace, monospace"> 55: (apply #<function eval-for-emacs {347BE911}> ((swank-repl:listener-eval "#<\n") "COMMON-LISP-USER" 418))</font></div><div><font face="monospace, monospace"> 56: (swank::process-requests nil)</font></div><div><font face="monospace, monospace"> 57: (#<local-function in handle-requests {468DC77D}>)</font></div><div><font face="monospace, monospace"> 58: (#<local-function in handle-requests {1FC34DCD}>)</font></div><div><font face="monospace, monospace"> 59: (swank/backend:call-with-debugger-hook #<function swank-debugger-hook {1C78BEE7}> #<local-function in handle-requests {1FC34DCD}>)</font></div><div><font face="monospace, monospace"> 60: (apply #<function call-with-debugger-hook {2F2A561F}> #<function swank-debugger-hook {1C78BEE7}> #<local-function in handle-requests {1FC34DCD}> nil)</font></div><div><font face="monospace, monospace"> 61: (swank/backend:call-with-debugger-hook #<function swank-debugger-hook {1C78BEE7}> #<local-function in handle-requests {1FC34DCD}>)</font></div><div><font face="monospace, monospace"> 62: (#<local-function in handle-requests {2E4ADDE3}>)</font></div><div><font face="monospace, monospace"> 63: (swank::call-with-bindings ((*standard-input* . #S(extensions:slime-input-stream)) (*standard-output* . #S(extensions:slime-output-stream)) (*trace-output* . #S(extensions:slime-output-stream)) ..) #<..</font></div><div><font face="monospace, monospace"> 64: (swank::handle-requests #<swank::multithreaded-connection {245DAD99}>)</font></div><div><font face="monospace, monospace"> 65: (swank-repl::repl-loop #<swank::multithreaded-connection {245DAD99}>)</font></div><div><font face="monospace, monospace"> 66: (#<local-function in spawn-repl-thread {376522E}>)</font></div><div><font face="monospace, monospace"> 67: (swank::call-with-bindings nil #<local-function in spawn-repl-thread {376522E}>)</font></div><div><font face="monospace, monospace"> 68: (#<local-function in spawn-repl-thread {5F73C8D9}>)</font></div><div><font face="monospace, monospace"> 69: (#<local-function in g27583 {7AC7193C}>)</font></div><div><font face="monospace, monospace"> 70: (threads::thread-function-wrapper #<local-function in g27583 {7AC7193C}>)</font></div><div><br></div><div><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jan 2, 2017 at 6:35 PM, Alan Ruttenberg <span dir="ltr"><<a href="mailto:alanruttenberg@gmail.com" target="_blank">alanruttenberg@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">Well, I've gone and made an attempt at a "less leaky"  version. (It became an obsession :( )<div><br><div>Some features:</div><div> - tries not to show internals of swank and abcl debugging calls</div><div> - shows top of exception trace for java exceptions, marked with "!" to indicate they were caught.</div><div> - names local functions, even if we only would see the java frame.</div><div> - And some other nuisances. Read the code?</div><div><br></div><div><br></div><div>I am soliciting beta testers - need to see whether it holds up under stress of use by other.</div><div>You will need to check out my branch of ABCL <a href="https://github.com/alanruttenberg/abcl.git" target="_blank">https://github.com/<wbr>alanruttenberg/abcl.git</a> - use branch "stage"</div><div>and you will need my branch of slime <a href="https://github.com/alanruttenberg/slime/" target="_blank">https://github.com/<wbr>alanruttenberg/slime/</a> - use branch "beta" </div><div><br></div><div>Build abcl with: ant abcl-aio.jar</div><div><br></div><div>There are a number of other debugging goodies here, also worth testing:</div><div>- Better inspectors for some things, like java classes</div><div>- View source and disassemble from debugger should work on every frame</div><div>- Most definition sources are recorded, including those compiled in a buffer. </div><div>  Try edit definitions 'print-object and  you will see all the methods and their source locations</div><div>- slime-edit-callers</div><span class="gmail-HOEnZb"><font color="#888888"><div><br></div><div>Alan</div></font></span><div><div class="gmail-h5"><div><br></div><div><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jan 1, 2017 at 6:11 AM, Mark Evenson <span dir="ltr"><<a href="mailto:evenson@panix.com" target="_blank">evenson@panix.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span><br>
<br>
On 12/31/16 20:37, Alan Ruttenberg wrote:<br>
> I'm getting backtraces that are noisy and therefore impede comprehension.<br>
><br>
> For example, in the following stack trace, frames 68-4 seem to<br>
> recapitulate, for the most part, the java stack corresponding to frames<br>
> 87-69<br>
<br>
</span>The ABCL backtrace abstraction is perhaps a little bit leaky and noisy<br>
with respect to its representation of Java calls, but it has been useful<br>
in improving the implementation in its present form since Tobias and I<br>
introduced it back in 2006-7 (?).<br>
<br>
My strong claim is that a user of ABCL never will see Java calls in the<br>
backtrace, as they only result in errors in the ABCL implementation<br>
which causes the "Lisp computation" to fail, thunking out into the<br>
surrounding Java Try/Catch/Exception mechanism.  So, "normally" (i.e.<br>
when there are more bugs in your code than the implementation), these<br>
verbose, confusing messages are not seen by the user.<br>
<br>
In your example, frames 87-69 show the Lisp-side computation which got<br>
to the error being signaled in the ABCL implmentation.  Then frames 4-68<br>
provide the trace of Java attempting to deal with the error signaled by<br>
the JVM when executing Primitives.java:2845.  Frames 0-2 show the error<br>
propagating back into the Lisp-side debugger machinery.<br>
<br>
I think the only real information I get as a developer here is that<br>
there is an error occuring in org.armedbear.lisp.Primitives:<wbr>2845; the<br>
rest of the Java calls don't need to be shown.  The backtrace from 4-67<br>
can confirm/deny hypothesis about what exacly caused the Java error on<br>
that line, but usually I would figure things out by starting ABCL under<br>
JPDA, setting a break point before Primitives:2845, replicating the<br>
error, and single-stepping through the JVM execution until I understand<br>
the problem.<br>
<br>
The "logic" of javaPushStackFrames() (my code) is trying to elide noisy<br>
frames.  Here it fails to elide frames in your example, as the entry<br>
point is in Primitive.java not Primitives.java, so this code should be<br>
changed.  I would go with a simpler implementation of<br>
javaPushStackFrames() that doesn't try to elide frames, and place such a<br>
mechanism on actually viewing the stack.  Perhaps we can get SLIME to<br>
"collapse" the Java portion of the backtrace (ala "the inspector") into<br>
a single statement of the source location that the Lisp computation<br>
enter the JVM error condition?<br>
<br>
Hopefully that provides some background for a proposal for a less noisy<br>
backtrace for your purposes to be possible.   Since I often get bug<br>
reports consisting of little or more reproduction instructions than: "I<br>
have a problem with ABCL:  it gave me this error." and a paste of the<br>
stack trace, it has been useful to have more information present than not.<br>
<br>
One could certainly somehow collapse frames 0-3 somehow into a single<br>
frame that represents the debugger invocation.<br>
<div class="gmail-m_-331489197534274775HOEnZb"><div class="gmail-m_-331489197534274775h5"><br>
<br>
<br>
<br>
<br>
<br>
><br>
> Thanks,<br>
> Alan<br>
><br>
><br>
> The value CL-UTILS::FORMS is not of type LIST.<br>
>    [Condition of type TYPE-ERROR]<br>
><br>
> Restarts:<br>
>  0: [RETRY] Retry compiling #<ASDF/LISP-ACTION:CL-SOURCE-F<wbr>ILE "jnil"<br>
> "cl-utils">.<br>
>  1: [ACCEPT] Continue, treating compiling #<ASDF/LISP-ACTION:CL-SOURCE-F<wbr>ILE<br>
> "jnil" "cl-utils"> as having been successful.<br>
>  2: [RETRY] Retry ASDF operation.<br>
>  3: [CLEAR-CONFIGURATION-AND-RETRY<wbr>] Retry ASDF operation after resetting<br>
> the configuration.<br>
>  4: [ABORT] Abort compilation.<br>
>  5: [*ABORT] Return to SLIME's top level.<br>
>  --more--<br>
><br>
> Backtrace:<br>
>   0: (#<LOCAL-FUNCTION IN MAKE-INVOKE-DEBUGGER-HOOK {5108C7A9}><br>
> #<TYPE-ERROR {D3CDE50}> #<LOCAL-FUNCTION IN MAKE-INVOKE-DEBUGGER-HOOK<br>
> {5108C7A9}>)<br>
>   1: (APPLY #<LOCAL-FUNCTION IN MAKE-INVOKE-DEBUGGER-HOOK {5108C7A9}><br>
> (#<TYPE-ERROR {D3CDE50}> #<LOCAL-FUNCTION IN MAKE-INVOKE-DEBUGGER-HOOK<br>
> {5108C7A9}>))<br>
>   2: (SYSTEM::RUN-HOOK SYSTEM::*INVOKE-DEBUGGER-HOOK* #<TYPE-ERROR<br>
> {D3CDE50}> #<LOCAL-FUNCTION IN MAKE-INVOKE-DEBUGGER-HOOK {5108C7A9}>)<br>
>   3: (INVOKE-DEBUGGER #<TYPE-ERROR {D3CDE50}>)<br>
>   4: org.armedbear.lisp.Lisp.error(<wbr>Lisp.java:382)<br>
>   5: org.armedbear.lisp.Lisp.type_e<wbr>rror(Lisp.java:435)<br>
>   6: org.armedbear.lisp.LispObject.<wbr>car(LispObject.java:165)<br>
>   7: org.armedbear.lisp.precompiler<wbr>_51.execute(precompiler.lisp:<wbr>381)<br>
>   8: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:803)<br>
>   9: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:814)<br>
>  10: org.armedbear.lisp.precompiler<wbr>_48.execute(precompiler.lisp:<wbr>350)<br>
>  11: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:803)<br>
>  12: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:814)<br>
>  13: org.armedbear.lisp.precompiler<wbr>_51.execute(precompiler.lisp:<wbr>381)<br>
>  14: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:803)<br>
>  15: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:814)<br>
>  16: org.armedbear.lisp.precompiler<wbr>_48.execute(precompiler.lisp:<wbr>350)<br>
>  17: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:803)<br>
>  18: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:814)<br>
>  19: org.armedbear.lisp.precompiler<wbr>_51.execute(precompiler.lisp:<wbr>381)<br>
>  20: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:803)<br>
>  21: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:814)<br>
>  22: org.armedbear.lisp.precompiler<wbr>_48.execute(precompiler.lisp:<wbr>350)<br>
>  23: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:803)<br>
>  24: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:814)<br>
>  25: org.armedbear.lisp.precompiler<wbr>_51.execute(precompiler.lisp:<wbr>381)<br>
>  26: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:803)<br>
>  27: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:814)<br>
>  28: org.armedbear.lisp.precompiler<wbr>_48.execute(precompiler.lisp:<wbr>350)<br>
>  29: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:803)<br>
>  30: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:814)<br>
>  31: org.armedbear.lisp.precompiler<wbr>_51.execute(precompiler.lisp:<wbr>381)<br>
>  32: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:803)<br>
>  33: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:814)<br>
>  34: org.armedbear.lisp.precompiler<wbr>_48.execute(precompiler.lisp:<wbr>350)<br>
>  35: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:803)<br>
>  36: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:814)<br>
>  37: org.armedbear.lisp.precompiler<wbr>_73.execute(precompiler.lisp:<wbr>643)<br>
>  38: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:803)<br>
>  39: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:814)<br>
>  40: org.armedbear.lisp.precompiler<wbr>_48.execute(precompiler.lisp:<wbr>350)<br>
>  41: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:803)<br>
>  42: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:814)<br>
>  43: org.armedbear.lisp.precompiler<wbr>_105.execute(precompiler.lisp:<wbr>988)<br>
>  44: org.armedbear.lisp.CompiledClo<wbr>sure.execute(CompiledClosure.<wbr>java:121)<br>
>  45: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:826)<br>
>  46: org.armedbear.lisp.compiler_pa<wbr>ss2_362.execute(compiler-pass2<wbr>.lisp:7380)<br>
>  47: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:867)<br>
>  48: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:918)<br>
>  49: org.armedbear.lisp.compile_fil<wbr>e_19.execute(compile-file.lisp<wbr>:175)<br>
>  50: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:814)<br>
>  51: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:832)<br>
>  52: org.armedbear.lisp.compile_fil<wbr>e_51.execute(compile-file.lisp<wbr>:655)<br>
>  53: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:826)<br>
>  54: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:851)<br>
>  55: org.armedbear.lisp.compile_fil<wbr>e_59.execute(compile-file.lisp<wbr>:780)<br>
>  56: org.armedbear.lisp.compiler_pa<wbr>ss2_370.execute(compiler-pass2<wbr>.lisp:7450)<br>
>  57: org.armedbear.lisp.CompiledClo<wbr>sure.execute(CompiledClosure.<wbr>java:98)<br>
>  58: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:803)<br>
>  59: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:814)<br>
>  60: org.armedbear.lisp.compile_fil<wbr>e_57.execute(compile-file.lisp<wbr>:780)<br>
>  61: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:914)<br>
>  62: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:986)<br>
>  63: org.armedbear.lisp.compile_fil<wbr>e_68.execute(compile-file.lisp<wbr>:962)<br>
>  64: org.armedbear.lisp.CompiledClo<wbr>sure.execute(CompiledClosure.<wbr>java:150)<br>
>  65: org.armedbear.lisp.Symbol.exec<wbr>ute(Symbol.java:852)<br>
>  66: org.armedbear.lisp.LispThread.<wbr>execute(LispThread.java:894)<br>
>  67: org.armedbear.lisp.Lisp.funcal<wbr>l(Lisp.java:180)<br>
>  68: org.armedbear.lisp.Primitives$<wbr>pf_apply.execute(Primitives.ja<wbr>va:2845)<br>
>  69: (PRECOMPILER::PRECOMPILE-FUNCT<wbr>ION-CALL (CL-UTILS::KEY .<br>
> CL-UTILS::FORMS))<br>
>  70: (PRECOMPILER::PRECOMPILE1 (CL-UTILS::KEY . CL-UTILS::FORMS))<br>
>  71: (PRECOMPILER::PRECOMPILE-FUNCT<wbr>ION-CALL (CL-UTILS::LOOP CL-UTILS::FOR<br>
> (CL-UTILS::KEY . CL-UTILS::FORMS) CL-UTILS::IN CL-UTILS::CLAUSES<br>
> CL-UTILS::DO ...))<br>
>  72: (PRECOMPILER::PRECOMPILE1 (CL-UTILS::LOOP CL-UTILS::FOR (CL-UTILS::KEY<br>
> . CL-UTILS::FORMS) CL-UTILS::IN CL-UTILS::CLAUSES CL-UTILS::DO ...))<br>
>  73: (PRECOMPILER::PRECOMPILE-FUNCT<wbr>ION-CALL (CL-UTILS::LET<br>
> ((CL-UTILS::CLAUSE-COLLECTION (CL-UTILS::LIST))) ..))<br>
>  74: (PRECOMPILER::PRECOMPILE1 (CL-UTILS::LET ((CL-UTILS::CLAUSE-COLLECTION<br>
> (CL-UTILS::LIST))) ..))<br>
>  75: (PRECOMPILER::PRECOMPILE-FUNCT<wbr>ION-CALL (CL-UTILS::WITH-GENSYMS<br>
> (CL-UTILS::TEST) ..))<br>
>  76: (PRECOMPILER::PRECOMPILE1 (CL-UTILS::WITH-GENSYMS (CL-UTILS::TEST) ..))<br>
>  77: (PRECOMPILER::PRECOMPILE-FUNCT<wbr>ION-CALL (CL-UTILS::DEFMACRO<br>
> CL-UTILS::CASE* (CL-UTILS::KEYFORM CL-UTILS::&REST CL-UTILS::CLAUSES) ..))<br>
>  78: (PRECOMPILER::PRECOMPILE1 (CL-UTILS::DEFMACRO CL-UTILS::CASE*<br>
> (CL-UTILS::KEYFORM CL-UTILS::&REST CL-UTILS::CLAUSES) ..))<br>
>  79: (PRECOMPILER::PRECOMPILE-LAMBD<wbr>A (LAMBDA NIL ..))<br>
>  80: (PRECOMPILER::PRECOMPILE1 (LAMBDA NIL (CL-UTILS::DEFMACRO<br>
> CL-UTILS::CASE* (CL-UTILS::KEYFORM CL-UTILS::&REST CL-UTILS::CLAUSES)<br>
> (CL-UTILS::WITH-GENSYMS (CL-UTILS::TEST) (CL-UTILS::LET # # #)))))<br>
>  81: (JVM:COMPILE-DEFUN NIL (LAMBDA NIL (CL-UTILS::DEFMACRO CL-UTILS::CASE*<br>
> (CL-UTILS::KEYFORM CL-UTILS::&REST CL-UTILS::CLAUSES)<br>
> (CL-UTILS::WITH-GENSYMS (CL-UTILS::TEST) (CL-UTILS::LET # # #)))) NIL<br>
> #P"/U..<br>
>  82: (SYSTEM::CONVERT-TOPLEVEL-FORM (CL-UTILS::DEFMACRO CL-UTILS::CASE*<br>
> (CL-UTILS::KEYFORM CL-UTILS::&REST CL-UTILS::CLAUSES) ..) NIL)<br>
>  83: (SYSTEM::PROCESS-TOPLEVEL-FORM (CL-UTILS::DEFMACRO CL-UTILS::CASE*<br>
> (CL-UTILS::KEYFORM CL-UTILS::&REST CL-UTILS::CLAUSES) ..) #<FILE-STREAM<br>
> {1773B7E}> NIL)<br>
>  84: (JVM::%WITH-COMPILATION-UNIT #<LOCAL-FUNCTION IN COMPILE-FROM-STREAM<br>
> {1FEBE62E}>)<br>
>  85: (SYSTEM::COMPILE-FROM-STREAM #<FILE-STREAM {744E75DD}><br>
> #P"/Users/lori/.cache/common-l<wbr>isp/abcl-1.5.0-dev-fasl43-maco<wbr>sx-x64/Volumes/upstairs/repos/<wbr>jnil/lisp/jnil/cl-utils-tmpUYP<wbr>FRO0B.abcl"<br>
> #P"/Users/lor..<br>
>  86: (COMPILE-FILE #P"/Volumes/upstairs/repos/jni<wbr>l/lisp/jnil/cl-utils.lisp"<br>
> :OUTPUT-FILE<br>
> #P"/Users/lori/.cache/common-l<wbr>isp/abcl-1.5.0-dev-fasl43-maco<wbr>sx-x64/Volumes/upstairs/repos/<wbr>jnil/lisp/jnil/cl-utils-tm..<br>
>  87: (APPLY COMPILE-FILE<br>
> #P"/Volumes/upstairs/repos/jni<wbr>l/lisp/jnil/cl-utils.lisp" :OUTPUT-FILE<br>
> #P"/Users/lori/.cache/common-l<wbr>isp/abcl-1.5.0-dev-fasl43-maco<wbr>sx-x64/Volumes/upstairs/repos/<wbr>jnil/lisp/jnil/cl-ut..<br>
><br>
><br>
><br>
><br>
><br>
>   private static final void pushJavaStackFrames()<br>
>   {<br>
>       final LispThread thread = LispThread.currentThread();<br>
>       final StackTraceElement[] frames = thread.getJavaStackTrace();<br>
><br>
>       // frames[0] java.lang.Thread.getStackTrace<br>
>       // frames[1] org.armedbear.lisp.LispThread.<wbr>getJavaStackTrace<br>
>       // frames[2] org.armedbear.lisp.Lisp.pushJa<wbr>vaStackFrames<br>
><br>
>       if (frames.length > 5<br>
>         && frames[3].getClassName().equal<wbr>s("org.armedbear.lisp.Lisp")<br>
>         && frames[3].getMethodName().equa<wbr>ls("error")<br>
>         && frames[4].getClassName().start<wbr>sWith("org.armedbear.lisp.<wbr>Lisp")<br>
>         && frames[4].getMethodName().equa<wbr>ls("eval")) {<br>
>           // Error condition arising from within Lisp.eval(), so no<br>
>           // Java stack frames should be visible to the consumer of the<br>
> stack abstraction<br>
>           return;<br>
>       }<br>
>       // Search for last Primitive in the StackTrace; that was the<br>
>       // last entry point from Lisp.<br>
>       int last = frames.length - 1;<br>
>       for (int i = 0; i<= last; i++) {<br>
>           if<br>
> (frames[i].getClassName().star<wbr>tsWith("org.armedbear.lisp.<wbr>Primitive"))<br>
>             last = i;<br>
>       }<br>
>       // Do not include the first three frames which, as noted above,<br>
> constitute<br>
>       // the invocation of this method.<br>
>       while (last > 2) {<br>
>         thread.pushStackFrame(new JavaStackFrame(frames[last]));<br>
>         last--;<br>
>       }<br>
>   }<br>
><br>
<br>
</div></div><span class="gmail-m_-331489197534274775HOEnZb"><font color="#888888">--<br>
"A screaming comes across the sky.  It has happened before, but there<br>
is nothing to compare to it now."<br>
<br>
</font></span></blockquote></div><br></div></div></div></div></div>
</blockquote></div><br></div></div>