[問題] 有沒有法子找出程式為何無法中止?

作者: HuangJC (吹笛牧童)   2023-04-01 05:44:17
今天改的版本,突然間陷入 while loop 無法中止
強迫中止時錯誤訊息是
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/
threading.py", line 1388, in _shutdown
lock.acquire()
這種訊息有和沒有差不多
有 lock 沒有釋放?
於是我寫了個 MyLock 取代 threading.Lock
開始記錄到底是哪個 Lock 有進入而沒有退出
全都有退出!根本查不到
最後是透過 git 不斷捲回舊版,找到十二小時前的版本還可以正常退出程式
一查,重點不在程式,在資料!
某一種資料格式,我會啟動 Timer, 而 Timer 時間到後,我會再重啟 Timer
(其實就是連續脈衝波,每隔幾秒一次的意思)
因為我預約了下一次的執行需求,所以程式無法釋放
只要 cancel timer, 就解掉這個 bug 了
(bug 是一直存在的,只是一直沒鍵入這種資料凸顯 bug)
還真是忘了,在 Python 的 Timer 是以 Thread 來實現
而骨子裡可能設了個 lock
那我問題來了:這次是幸運在 git 裡保存夠多細節,且能捲回一定能釋放的舊版
假設沒這樣的環境,只能靠我自己抓,而錯誤訊息又只說有 lock 沒釋放
我能回溯知道是哪一行程式產生的 lock 鎖住了嗎?
有什麼參數,什麼 debug tool 能用嗎?
謝謝
作者: robert09080 (Aspettarei)   2023-04-01 11:21:00
Rlock 試試?
作者: lycantrope (阿寬)   2023-04-01 12:27:00
gdb
作者: b0920075 (Void)   2023-04-02 17:33:00
c/c++ 的話有 sanitizer valgrind 之類的工具可以看
作者: poototo (poototo)   2023-04-03 20:03:00
有考慮...print嗎?cc
作者: lycantrope (阿寬)   2023-04-03 20:16:00
cc
作者: leolarrel (真.粽子無雙)   2023-04-05 17:35:00
我猜二樓其實是要說pdb??
作者: andy19960407 (258698)   2023-04-06 23:27:00
為什麼一般感覺不太會遇到這種問題,你的需求是特別刁鑽還是你的寫法有可以再優化的地方?
作者: Hsins (翔)   2023-04-07 18:10:00
這些資訊不夠去找,複現的情境也不夠清楚,能夠複現的話就多埋幾個點去 logging 吧樹莓派那段看不是很懂,你敘述了你的做法,但沒有敘述為什麼要這樣做。這也是為什麼前面會說一般不會遇到,他想了解的是你的「需求」跟你現在的「問題」之間是不是存在 X-Y 問題
作者: leolarrel (真.粽子無雙)   2023-04-07 18:28:00
Hsins,建議你可以a他id參考一下
作者: Hsins (翔)   2023-04-07 19:42:00
~ " ~ 不是很能讀懂問題...
作者: Sunal (SSSSSSSSSSSSSSSSSSSSSSS)   2023-04-08 09:54:00
建議問問題可以把完整脈絡寫出來(包含範例、使用情境、需求),而不是大量的類似內心os的口語文字。簡單說就是文字要精煉一點另外,寫python其實不需刻意del變數的,用不到gc自然就收走了(simple is better)
作者: andy19960407 (258698)   2023-04-08 11:10:00
Sunal懂我 哈哈哈
作者: Sunal (SSSSSSSSSSSSSSSSSSSSSSS)   2023-04-08 11:50:00
threading.py", line 1388, in _shutdown光這一行就可以從 python threading.py source code 知道class Timer(Thread): 這件事情...(而且文件也有寫)source code 中也有用到 lock 如果你看到錯有去看 code 就知道了另外,你也可以debug時hack python source 去達到你的目的
作者: lycantrope (阿寬)   2023-04-09 14:51:00
很難救
作者: Hsins (翔)   2023-04-09 15:54:00
既然都在處理 thread 跟 lock 問題,去把 OS 裡這部分的概念補齊滿合理的……
作者: leolarrel (真.粽子無雙)   2023-04-10 11:31:00
就跟你們說那邊有馬蜂窩了,你們...
作者: s9041200 (小明阿)   2023-04-10 21:25:00
樓上+1如果可以穩定重現又有行數其實蠻幸福的,對準點直接打log就好。之前寫mit 6.824有deadlock都是這樣找的。
作者: Hsins (翔)   2023-04-10 22:00:00
我覺得這篇敘述的思考方向很怪……對我來說,應該是試圖找到問題點,而不是去找一個或者是造出一個專門的除錯工具…能夠複現當然是最好,不能夠複現會去找相關日誌,如果日誌不足以判斷,那說明日誌輸出的埋設點不足;以你的例子來說,我不會想著要怎麼在強制退出後列出 thread 狀態這件事,而是紀錄 thread 切換不同狀態,以及他的初始化和結束。另外,你是不是曲解邯鄲學步的意思了?建議回去補足作業系統知識,我認為有其必要性;至於學習的好不好,那是學習者策略跟方向上可能有錯誤,不代表這個建議是錯誤的呀。 我反倒覺得如果有資深工程師說從業十幾年,沒讀過作業系統;而有人聽信去效法,卻落得基礎不扎實,資深只與從業時間長短而無關能力,那才真的是在邯鄲學步…不過我很支持你打造自己的除錯工具,但如果你有時間壓力,多埋一些日誌會比較適合
作者: s860134 (s860134)   2023-04-16 12:48:00
又是不讀完文件搞自幹python 都能step by step debugging 你還在插扣
作者: wuyiulin (龍破壞劍士-巴斯達布雷達)   2023-04-16 15:32:00
pdb會推 pdb 是因為可以同時查多個變數 比 step by step還有效率然後也推看到什麼學什麼,目測要重看OS是對的xD
作者: s860134 (s860134)   2023-04-23 17:25:00
笑死 還查多個變數 又是不會用 debugging 的在搞笑https://bit.ly/2kVHaP7如果你只會 pdb 還是乖乖插code 好嗎? 中斷點有用過?如果這些都不會 還是回去寫 C++, python 的功能對你雞肋
作者: wuyiulin (龍破壞劍士-巴斯達布雷達)   2023-04-23 19:22:00
原來叫只會 pdb,閣下開發的時候都有IDE輔助 484寫網頁的 484?如果你是講 breakpoint() 那東西我印象等效 pdb但是我目前 maintain 的專案版本沒有 breakpoint() 可以用 所以也沒用過 就不妄評VSCode 的中斷點的話(燦笑)
作者: s860134 (s860134)   2023-04-23 19:46:00
ㄜ..... 沒用過就沒用過,pdb 跟你插扣沒兩樣我還建議你用 IPython.embed() 至少還有自動補完真的是不懂裝懂的一個樣,還以為你會說出用 GBD attach也是拉 反正都嘛看看 built in 和 for loop 怎麼寫就上工能寫 if else for loop 就算會 python 了https://wiki.python.org/moin/DebuggingWithGdb怎麼 debugging cpython 自己跑一次看看吧 號稱寫C十幾年的應該會用? gdb?
作者: wuyiulin (龍破壞劍士-巴斯達布雷達)   2023-04-23 20:03:00
我在跟你討論中斷點還有 pdb,這樣也可以拉 gdb 救援?g維拉
作者: s860134 (s860134)   2023-04-23 20:04:00
我在跟你說怎麼 debugging ,你啥都不會 pdb?拜託 當你要加一行 pdb 進 code 裡就 lowwwww 掉了更何況 pdb 提供的功能如此原始,你這樣效率怎麼上工?
作者: wuyiulin (龍破壞劍士-巴斯達布雷達)   2023-04-23 20:05:00
還好我上工的時候早就熟悉其他更 efficient 替代 for loop 的方式,感謝你這麼關心別人的職涯欸。
作者: s860134 (s860134)   2023-04-23 20:06:00
就是說你的方法沒效率 土炮 沒看文件 就這樣

Links booklink

Contact Us: admin [ a t ] ucptt.com