【发布时间】:2017-11-04 21:33:36
【问题描述】:
给定一个 C Python 帧指针,我如何查看任意评估堆栈条目? (一些特定的堆栈条目可以通过locals()找到,我说的是其他堆栈条目。)
前段时间我问了一个更广泛的问题:
getting the C python exec argument string or accessing the evaluation stack
但在这里我想专注于能够在运行时读取 CPython 堆栈条目。
我将采用适用于 CPython 2.7 或 Python 3.3 之后的任何 Python 的解决方案。但是,如果您有除此之外的工作,请分享,如果没有更好的解决方案,我会接受。
我不想修改 C Python 代码。 In Ruby, I have in fact done this 得到我想要的。我可以根据经验说,这可能不是我们想要的工作方式。但同样,如果没有更好的解决方案,我会接受的。 (我对 SO 点的理解是,无论哪种方式,我都会在赏金中失去它。所以我很高兴去看看那些表现出最好的精神和愿意看这个的人,假设它有效。)
更新:见user2357112 tldr的评论; 基本上这是很难做到的。 (不过,如果您认为自己有勇气尝试,请务必这样做。)
因此,让我将范围缩小到这个我认为可行的简单问题:
给定一个 Python 堆栈帧,例如 inspect.currentframe(),找到评估堆栈的开头。在结构的 C 版本中,这是f_valuestack。然后,我们需要一种在 Python 中从那里读取 Python 值/对象的方法。
更新 2 赏金的时间已经结束,没有人(包括我自己的总结答案)提供具体代码。我觉得这是一个好的开始,我现在比以前更了解情况。在强制性的“描述你为什么认为应该有赏金”中,我列出了“引起对这个问题的更多关注”的一种选择,并且在某种程度上,对前世的看法只有不到一打问题是,当我输入此内容时,它的浏览量略低于 190 次。所以这是成功的。不过……
如果将来有人决定进一步执行此操作,请与我联系,我将设置另一个赏金。
谢谢大家。
【问题讨论】:
-
Rocky,你能在问题中添加一些细节吗?您是否想要适用于原始 CPython 的纯 Python 解决方案,或者您可以修改 CPython?使用的 CPython 的确切版本是什么?如果出现异常或致命错误,CPython 中是否有回溯打印?您只想回溯(哪个函数被哪个调用)还是想查找和访问存储在堆栈中的局部变量?
-
@osgx 问题已修改。我怀疑如果你让回溯工作,你通常可以做到。但为简化起见,如果您有一个仅适用于当前框架指针以外的 Python 帧指针的解决方案,我会接受这一点,假设没有更好的解决方案。
-
Rocky,您能否提供更多关于您在概念上试图实现的目标以及上下文的信息?例如。您是否正在编写调试器,或者您想要从堆栈帧中获得什么信息?您在哪里/如何获得堆栈帧,作为异常的一部分,自定义调试器等?我(我们)不想回答很多可能不相关的代码。
-
@Abraham 查看讨论和聊天。如果这还不够,请告诉我。
标签: python reverse-engineering bytecode cpython disassembly