SBCL多執行緒除錯技巧

2021-07-03 16:24:27 字數 1420 閱讀 9990

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]

多執行緒死鎖除錯小技巧

據說再高的高手在寫多執行緒程式的時候都難確保不會產生死鎖,死鎖的除錯也就成為乙個比較常見的問題,假設有下面這樣乙個問題 乙個正在生產環境下執行的程序死鎖了,或者你只是在跑乙個程式,並沒有在偵錯程式裡面開啟它,然後發現沒有響應,日誌輸出也停止了。由於你是乙個有經驗的程式設計師,會想到 我剛剛加上了新的...

多執行緒死鎖除錯小技巧

據說再高的高手在寫多執行緒程式的時候都難確保不會產生死鎖,死鎖的除錯也就成為乙個比較常見的問題,假設有下面這樣乙個問題 乙個正在生產環境下執行的程序死鎖了,或者你只是在跑乙個程式,並沒有在偵錯程式裡面開啟它,然後發現沒有響應,日誌輸出也停止了。由於你是乙個有經驗的程式設計師,會想到 我剛剛加上了新的...

多執行緒死鎖除錯小技巧

據說再高的高手在寫多執行緒程式的時候都難確保不會產生死鎖,死鎖的除錯也就成為乙個比較常見的問題,假設有下面這樣乙個問題 乙個正在生產環境下執行的程序死鎖了,或者你只是在跑乙個程式,並沒有在偵錯程式裡面開啟它,然後發現沒有響應,日誌輸出也停止了。由於你是乙個有經驗的程式設計師,會想到 我剛剛加上了新的...