鱼C论坛

 找回密码
 立即注册
查看: 305|回复: 0

[库/模块档案] dis — Python 字节码反汇编器

[复制链接]
发表于 2024-6-23 15:50:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
dis — Python 字节码反汇编器


快速入门

Python 提供了 dis 模块,该模块支持通过反汇编以分析 CPython 字节码。

该模块接收的 CPython 字节码被定义在文件 Include/opcode.h 中,并由编译器和解释器所使用。

CPython 实现细节:

字节码是 CPython 解释器的实现细节。

不能保证字节码在 Python 不同版本之间不会有添加、删除或更改。

因此,大家不应该认为该模块能跨 Python 虚拟机或 Python 版本而正常工作(讲人话就是不同环境及不同版本之间它是有区别的,这在本文档的注释中会有详细提示)。

版本 3.6 中的变更:每条指令使用 2 个字节,以前每条指令的字节数不同。

版本 3.10 中的变更:跳转、异常处理和循环指令的参数现在是指令偏移量而不是字节偏移量。

版本 3.11 中的变更:某些指令伴有一个或多个内联缓存条目,这些缓存条目以 CACHE 指令的形式存在。默认情况下,这些指令是隐藏的,但可以通过传递 show_caches=True 给任何 dis 工具来显示。此外,解释器现在会根据不同的运行时条件调整字节码。可以通过传递 adaptive=True 来显示自适应字节码。

版本 3.12 中的变更:跳转指令的参数是相对于跳转指令后立即出现的 CACHE 条目的目标指令的偏移量。因此,CACHE 指令的存在对于前向跳转是透明的,但在推理后向跳转时需要考虑。


示例

给定函数 myfunc() 如下:
def myfunc(alist):
    return len(alist)
我们可以使用以下命令,显示 myfunc() 的反汇编结果:
>>> dis.dis(myfunc)
  2           0 RESUME                   0

  3           2 LOAD_GLOBAL              1 (NULL + len)
             12 LOAD_FAST                0 (alist)
             14 CALL                     1
             22 RETURN_VALUE
(“2” 是行号)


命令行界面

我们可以通过命令行脚本调用 dis 模块:
python -m dis [-h] [infile]
接受以下选项:

  • -h, --help:显示使用说明并退出。

如果指定了 infile,其反汇编代码将写入标准输出;否则,将对从标准输入接收的编译源代码进行反汇编。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-18 15:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表