从另一个线程启动后,如何将pystrace处理程序添加到python线程?

时间:2011-07-08 23:05:32

标签: python multithreading debugging

我正在为python组装一个小调试器,所以我基本上可以在程序中间附加并暂停代码或在某些变量更改或步骤一行时中断等等...基本上是pdb但附加(所以更多像gdb假设pystack不工作)。

对于单个线程,可以为sys.settrace()执行多线程程序,假设没有线程已启动,可以执行threading.settrace(),但问题是您无法调试整个事情(或据我所知,在特定线程中的特定点执行此操作。

我想知道是否有办法在python中针对已经启动的特定不同线程执行类似sys.settrace()的操作?

1 个答案:

答案 0 :(得分:2)

好的,这似乎不太可能。

我得到的最接近的是听到线程2(可填充的线程),它调用PyThreadState_SetAsyncExc,它引发异常,而构造函数在另一个线程中被调用,这是无用的。

我的解决方案根本不会使用sys.settrace,而只是使用sys.setcheckinterval将其设置为1,以便在我离开调试线程时返回到一些巨大的数字({ {1}}}当我进入调试线程时(同时抓住GIL)。同时查看sys.maxint

这几乎与sys.settrace一样好,可能更慢,但可以随时对任何线程运行。

修改

首先 - 我发现使用setcheckinterval不足以阻止其他线程,虽然可以通过设置全局_Py_Ticker(在ceval.c而不是静态全局,因此你可以在某种程度上为特定的python版本完成)可以使用ctypes)并确保不在代码中释放GIL。

w.r.t。原始问题,我通过CPython中的c代码查找并找到了一种遍历线程状态对象并调整它们以包含tracefunc和traceobj的方法;你可以在我的调试器中看到我是如何做到的 - https://github.com/bobfrank/pydebug/blob/master/debug.py#L291