【问题标题】:How to log CPU instructions executed by a Python program?如何记录 Python 程序执行的 CPU 指令?
【发布时间】:2019-03-01 07:23:51
【问题描述】:

我知道 Python 源代码被编译成字节码,然后由 Python VM(比如说 CPython)解释。如果我理解正确,这意味着 VM 会解析字节码指令并决定(在运行时)相应地执行哪些 CPU 指令。

我的问题:

  • 是否可以记录在您的机器上执行的实际 CPU 指令作为对特定 Python 文件 (.py) 的解释的结果?我知道在 .py 文件和 CPU 指令之间获得 1-1 对应关系可能并不简单(甚至不可行),但你能得到最接近的是什么?
  • 更进一步:是否甚至可以记录对应于特定进程的执行指令?

【问题讨论】:

  • 我可能不明白你想看到什么,但如果它是沿着这些思路并且你不知道模块:dis 是否让你更接近什么您正在寻找?显然它不是实时登录的。
  • 免责声明:我的问题主要是出于好奇。我怀疑查看 CPU 实际指令对于解释代码可能是不切实际的。我只是想知道这是否可能。
  • 欢迎在reverseengineering.stackexchange.com提出逆向工程问题

标签: python assembly reverse-engineering


【解决方案1】:

在 linux 上使用 strace,它会显示任何程序(包括 python)进行的每个系统调用。在 Windows 上,您必须使用 wtLogger.exe 之类的东西来跟踪所有库调用(不仅仅是系统调用)。

您可以使用像gdb 这样的调试器来实时查看机器代码,并且由于您有 CPython 源代码,更好的选择是使用调试符号编译它,然后在 C 调试器中运行它,这样可以给你一个高层次的调用栈,理解起来会容易很多。

【讨论】:

  • 只是让系统调用尽你所能吗?不能更详细地观察CPU指令吗?
  • @81rect 我以为你要求系统调用。编辑了我的答案。 gdb 就是你想要的
  • gdb 是一款很棒的软件。它可以生成指令日志。哎呀,它可以记录和回放执行,并支持倒带!
  • 这个旧的wiki页面wiki.python.org/moin/DebuggingWithGdb专门处理使用gdb调试python。也许能给你一些正确方向的指点?
  • @81rect: 你不是使用gdb在python代码上,你是在python的x86机器码上使用它interpreter,它本身就是一个程序。解释 Python + 运算符涉及运行大量指令,而不仅仅是 add rax, rcx。你只能从 JIT 编译器中得到它。但是,是的,您可以调试任何用户空间进程,一切都只是最低级别的机器代码。
猜你喜欢
  • 2020-09-13
  • 1970-01-01
  • 2013-06-19
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 2016-12-27
相关资源
最近更新 更多