在我的python 调试器中,我有一种将字符串重新映射到文件名的方法,这样当您在调试器中单步执行 exec'd 函数时,您可以列出 pygmentized 行,或者通过realgud在 Emacs 等编辑器中查看它们。
因此,我希望能够在 CPython 在内部评估中停止时提取 exec 语句中的字符串。
我已经有了一种机制,可以在调用框架中回顾调用者是否为 anEXEC_STMT
,并且我可以回顾一条指令以查看前一条指令是否为 say DUP_TOP
。因此,如果我能想出一种方法来在调用时读取堆栈条目并给出评估的字符串,那么我就可以回家了。可能有一种方法可以进入 C 来获得这个,但我对 CPython 内部知识缺乏了解,并且不希望这样做。如果那里有一个包,也许我可以选择包含它。
CPython 已经提供了对函数参数和局部变量的访问,但当然,因为这是一个内置函数,所以它不会被记录为函数参数。
如果在如何做同样的事情上有其他想法,那也没关系。我觉得一个不太好的解决方案是以某种方式尝试重载或替换exec
,因为调试器可以在游戏后期引入。
我知道 CPython2 和 CPython3 在这里可能会有些不同,但是从任何一个开始都可以。