CPython源码学习:2、使用GDB调试Python
发布网友
发布时间:2024-10-01 20:11
我来回答
共1个回答
热心网友
时间:2024-11-12 17:41
在深入探究CPython源码的过程中,首先要编译出Python的Debug版本,以便后续使用gdb进行调试。
安装gcc、g++、cmake等工具后,可参考Python开发者文档(Python Developer’s Guide)了解编译Python Debug版本的方法。
了解GDB的基本用法是进行调试的先决条件。在终端输入特定命令即可启动Python,并进入监控状态。
在此状态下,GDB会读取Python的符号表,但程序尚未执行。可在main函数设置断点,例如:
通过这种方式,程序会在python.c的第14行暂停。断点也可以通过(文件名:行号)的形式设置。
输入特定命令开始执行程序,程序将在设定的断点处暂停。此时,可以使用命令查看代码,或进入tui模式查看。
使用tui模式可以更清晰地看到断点位置,并通过输入tui获取更多使用方法。继续执行程序,Python将进入正常指令模式。
在GDB中,可以使用Python脚本文件进行调试。例如,创建一个名为test.py的Python脚本文件,内容为一个简单的赋值语句。
在GDB中监控Python执行,并给main函数配置输入参数。argc和argv是main函数的参数,与执行python时携带的参数类似。
配置参数后,在main函数中设置断点,并执行至main函数。此时,argc的参数将显示为2。
通过步进,可以观察到Python实际执行的函数是pymain_main。该函数分为两步:初始化系统参数和执行脚本。
继续步进,将到达pymain_run_python。在约610行,有一个分支判断,表示Python可以从命令行、module、import、文件和stdin执行。
使用test.py文件时,将进入pymain_run_file,并最终到达_PyRun__AnyFileObject函数。Python将从该函数开始解析test.py文件内容。
使用特定指令可以查看当前函数调用情况。从_PyRun__AnyFileObject进入后,Python将开始读取文件内容,并使用语法解析器解析文件,建立语法树,最终执行程序。
后续将继续研究Python语法解析器、语法树、符号表、编译器等内容,并通过GDB调试方式研究其原理,与大家共同交流。