sbcl manual中對多執行緒的debug其實有說明,執行緒有3個狀態:foreground、background、stopped。當background執行緒出現了異常停止執行時,一般會列印錯誤資訊,但是沒有位置資訊和呼叫棧,無法直接分析。此時在forground執行緒中呼叫(sb-thread:release-foreground)即可將後台停止的執行緒變成前台執行緒,可以正常使用各種除錯命令。
例子:
* (sb-thread:make-thread (lambda () (funcall 'foo-func 0)))
#<#
debugger invoked on a undefined-function in thread
* #:
the function common-lisp-user::foo-func is undefined.
(+ 1 2)
3* (sb-thread:release-foreground)
resuming thread #
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 (#)
("undefined function")
0] backtrace
backtrace for: #
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 # #> nil t nil)
5: (sb-thread::initial-thread-function-trampoline #nil # (##) 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]
多執行緒死鎖除錯小技巧
據說再高的高手在寫多執行緒程式的時候都難確保不會產生死鎖,死鎖的除錯也就成為乙個比較常見的問題,假設有下面這樣乙個問題 乙個正在生產環境下執行的程序死鎖了,或者你只是在跑乙個程式,並沒有在偵錯程式裡面開啟它,然後發現沒有響應,日誌輸出也停止了。由於你是乙個有經驗的程式設計師,會想到 我剛剛加上了新的...
多執行緒死鎖除錯小技巧
據說再高的高手在寫多執行緒程式的時候都難確保不會產生死鎖,死鎖的除錯也就成為乙個比較常見的問題,假設有下面這樣乙個問題 乙個正在生產環境下執行的程序死鎖了,或者你只是在跑乙個程式,並沒有在偵錯程式裡面開啟它,然後發現沒有響應,日誌輸出也停止了。由於你是乙個有經驗的程式設計師,會想到 我剛剛加上了新的...
多執行緒死鎖除錯小技巧
據說再高的高手在寫多執行緒程式的時候都難確保不會產生死鎖,死鎖的除錯也就成為乙個比較常見的問題,假設有下面這樣乙個問題 乙個正在生產環境下執行的程序死鎖了,或者你只是在跑乙個程式,並沒有在偵錯程式裡面開啟它,然後發現沒有響應,日誌輸出也停止了。由於你是乙個有經驗的程式設計師,會想到 我剛剛加上了新的...