我正在为 python 组装一个小型调试器,所以我基本上可以在程序中间附加并暂停代码或在某些变量更改或单行等时中断......基本上是 pdb 但附加(所以更像是 gdb 假设pystack 不起作用)。
对于单线程,可以做 sys.settrace()
, 对于多线程程序,假设没有线程启动,可以做 threading.settrace()
,但问题是据我所知,您一直在调试整个事情(或在特定线程中的特定点进行)。
我想知道是否有办法做类似 sys.settrace()
的事情在 python 中用于已经启动的特定不同线程?
最佳答案
好吧,这似乎不太可能。
我最接近的是听说 thread2(可终止线程),它调用了 PyThreadState_SetAsyncExc
, 引发异常,在另一个线程中调用构造函数,这是相当无用的。
我的解决方案根本不使用 sys.settrace,而是使用 sys.setcheckinterval
将其设置为 1
因为当我离开我的调试线程时,当我进入调试线程(以及抓取 GIL)时,返回到一些巨大的数字(sys.maxint
可能)。一起看着sys._current_frames()
.
这几乎和 sys.settrace 一样好,可能更慢,但可以在任何时间针对任何线程运行任何持续时间。
编辑 :
首先 - 我发现执行 setcheckinterval 不足以停止其他线程,尽管可以通过设置全局 _Py_Ticker(在 ceval.c 中而不是静态全局中,因此您可以使用 ctypes)在某种程度上为特定的 python 版本完成) 并确保您没有在代码中释放 GIL。
w.r.t.最初的问题,我查看了 CPython 中的 c 代码,找到了一种遍历线程状态对象并调整它们以包含 tracefunc 和 traceobj 的方法;你可以在这里看到我在我的调试器中是如何做的 -- https://github.com/bobfrank/pydebug/blob/master/debug.py#L291
关于python - python - 从另一个线程启动后将systrace处理程序添加到python线程的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6631443/