[问题] 有没有法子找出程式为何无法中止?

楼主: 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