SBCL多线程调试技巧


SBCL manual中对多线程的debug其实有说明,线程有3个状态:foreground、background、stopped。当background线程出现了异常停止运行时,一般会打印错误信息,但是没有位置信息和调用栈,无法直接分析。此时在forground线程中调用(sb-thread:release-foreground)即可将后台停止的线程变成前台线程,可以正常使用各种调试命令。


例子:

* (sb-thread:make-thread (lambda () (funcall 'foo-func 0)))
#<#<SB-THREAD:THREAD RUNNING {245E39F1}>

debugger invoked on a UNDEFINED-FUNCTION in thread
* #<THREAD RUNNING {245E39F1}>:
  The function COMMON-LISP-USER::FOO-FUNC is undefined.

(+ 1 2) 
3
* (sb-thread:release-foreground)


Resuming thread #<THREAD RUNNING {245E39F1}>

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

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] abort thread (#<THREAD RUNNING {245E39F1}>)

("undefined function")
0] backtrace

Backtrace for: #<SB-THREAD:THREAD RUNNING {245E39F1}>
0: ("undefined function")
1: ((FLET #:WITHOUT-INTERRUPTS-BODY-1138 :IN SB-THREAD::INITIAL-THREAD-FUNCTION-TRAMPOLINE))
2: ((FLET SB-THREAD::WITH-MUTEX-THUNK :IN SB-THREAD::INITIAL-THREAD-FUNCTION-TRAMPOLINE))
3: ((FLET #:WITHOUT-INTERRUPTS-BODY-618 :IN SB-THREAD::CALL-WITH-MUTEX))
4: (SB-THREAD::CALL-WITH-MUTEX #<CLOSURE (FLET SB-THREAD::WITH-MUTEX-THUNK :IN SB-THREAD::INITIAL-TH
READ-FUNCTION-TRAMPOLINE) {5AEFDA5}> #<SB-THREAD:MUTEX "thread result lock" owner: #<SB-THREAD:THREA
D RUNNING {245E39F1}>> NIL T NIL)
5: (SB-THREAD::INITIAL-THREAD-FUNCTION-TRAMPOLINE #<SB-THREAD:THREAD RUNNING {245E39F1}> NIL #<FUNCT
ION (LAMBDA NIL) {245E34E5}> (#<SB-THREAD:THREAD RUNNING {245E39F1}> #<SB-THREAD:THREAD "main thread
" RUNNING {24582809}>) NIL NIL NIL NIL)
6: ("foreign function: #x42C0D0")
7: ("foreign function: #x4033D7")
8: ("foreign function: #x416A2D")
9: ("foreign function: #x422F7F")
10: ("foreign function: #x4238EE")

0]



你可能感兴趣的:(SBCL多线程调试技巧)