1.在某处添加一个断点。放置断点的有趣地方是main()函数或求值循环(一个巨大的switch语句that looks at the opcode),它们将位于generated_cases. c. h中(它不在源代码中),或者对于我的30858 + 7示例,_PyLong_Add()是实现加法的。 1.按F5键运行命令 此时,您应该已经命中断点,并且能够看到C代码中的执行位置。要查看当前汇编指令,请按Cmd+Shift+P并执行“LLDB:显示反汇编...”命令并选择“总是”,则可以通过再次运行该命令并选择“自动”返回到C视图。您可以在左上角的“寄存器”下拉菜单下看到寄存器值,在当前变量值的下面。 下面的机器指令将30858(十六进制的788A)相加,存储在寄存器x20中,然后将7存储在寄存器x 0中,最后将结果存储在寄存器x 0中(我对代码做了一些修改,将加法放在单独的一行中,以便更容易地将断点精确地设置在add指令处):
2条答案
按热度按时间ukqbszuj1#
在Linux上使用
strace
,它会显示任何程序(包括python)所做的每个系统调用。在Windows上,你必须使用类似wt或Logger.exe的东西来跟踪所有的库调用(不仅仅是系统调用)。你可以使用
gdb
这样的调试器来实时查看机器码,既然你有CPython源代码,一个更好的选择是用调试符号编译它,然后在C调试器中运行它,这可以给予你一个高级调用栈,这将更容易理解。carvr3hs2#
以下是我在ARM CPU(macOS 13运行在Apple silicon上)上使用
lldb
(类似于gdb
)到VS Code时,查看CPython的CPU指令的过程:1.安装CodeLLDB VS代码扩展
git clone https://github.com/python/cpython.git
cd cpython
git checkout 20cf32e761
(因为最新的代码可能被破坏)1.编译CPython(请参阅README文件或他们如何构建它以进行测试,以了解详细信息),这将生成一个名为“python.exe”的可执行文件:
1.在VS Code(
code .
)中打开CPython源代码目录,并添加一个. vscode/launch.json文件,该文件包含以下内容(将args
设置为要传递给python
可执行文件的参数,在本例中我运行的是python -c '30858 + 7'
,它只让Python添加30858 + 7并退出,而不打印任何内容):1.在某处添加一个断点。放置断点的有趣地方是
main()
函数或求值循环(一个巨大的switch
语句that looks at the opcode),它们将位于generated_cases. c. h中(它不在源代码中),或者对于我的30858 + 7
示例,_PyLong_Add()
是实现加法的。1.按F5键运行命令
此时,您应该已经命中断点,并且能够看到C代码中的执行位置。要查看当前汇编指令,请按Cmd+Shift+P并执行“LLDB:显示反汇编...”命令并选择“总是”,则可以通过再次运行该命令并选择“自动”返回到C视图。您可以在左上角的“寄存器”下拉菜单下看到寄存器值,在当前变量值的下面。
下面的机器指令将
30858
(十六进制的788A
)相加,存储在寄存器x20中,然后将7
存储在寄存器x 0中,最后将结果存储在寄存器x 0中(我对代码做了一些修改,将加法放在单独的一行中,以便更容易地将断点精确地设置在add
指令处):