【发布时间】:2019-01-19 04:51:13
【问题描述】:
我一直在关注 Philip Guo 的 excellent series 关于 CPython 的内部结构,并一直在使用 GDB 浏览解释器的代码。不幸的是,当我单步执行代码时,GDB 似乎跳过了很多,乱序执行指令(例如一系列赋值操作,没什么特别的)。
据我了解,这是因为编译器优化。事实上,CPython 的configure 文件似乎默认为-O2。使用./configure 和make 编译Python 2.7.15 时就是这种情况:
gcc -pthread -c -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -DPy_BUILD_CORE -o Modules/python.o ./Modules/python.c
gcc -pthread -c -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -DPy_BUILD_CORE -o Parser/acceler.o Parser/acceler.c
gcc -pthread -c -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -DPy_BUILD_CORE -o Parser/grammar1.o Parser/grammar1.c
gcc -pthread -c -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -DPy_BUILD_CORE -o Parser/listnode.o Parser/listnode.c
...
我尝试通过./configure CFLAGS="-g -O0" 配置不优化并再次使用make 编译来解决此问题(注意每行从-fno-strict-aliasing -g -O2 到-fno-strict-aliasing -g -O0 的更改):
gcc -pthread -c -fno-strict-aliasing -g -O0 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -DPy_BUILD_CORE -o Modules/python.o ./Modules/python.c
gcc -pthread -c -fno-strict-aliasing -g -O0 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -DPy_BUILD_CORE -o Parser/acceler.o Parser/acceler.c
gcc -pthread -c -fno-strict-aliasing -g -O0 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -DPy_BUILD_CORE -o Parser/grammar1.o Parser/grammar1.c
gcc -pthread -c -fno-strict-aliasing -g -O0 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -DPy_BUILD_CORE -o Parser/listnode.o Parser/listnode.c
...
不幸的是,当我单步执行代码时,GDB 仍然会跳来跳去。为了完整起见,这是我使用 GDB 运行的命令:
gdb --args ./python test.py
test.py 的内容只是一些基本的算术和打印函数,并不真正相关。
我对其中至少一个步骤的理解一定是不完整的。我是否错误地设置了优化标志? GDB 是否由于其他原因在指令之间跳转?任何建议将不胜感激。谢谢!
【问题讨论】: