Visual C ++ 2015调试器的STEP OVER跳转到源代码中的奇怪位置

时间:2015-09-20 12:30:20

标签: python debugging visual-c++

我对CPython实现感兴趣,并希望阅读CPython的源代码。因此,我下载了CPython 3.5.0源代码并使用Visual C ++ 2015调试器来逐步完成代码。

但是,当我使用调试器来遍历代码时,会出现一个非常奇怪的问题。当调试器进入Python / ceval.c中的函数PyObject * PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)时,调试器的下一个指令指针开始跳转到奇怪的位置。

例如,我使用断点在Python / ceval.c的第1218行停止 Before I click STEP OVER

然后我单击STEP OVER,期望调试器转到Python / ceval.c的第1221行,但它转到Python / ceval.c的第3501行。 After I click STEP OVER

看起来编译器重新排列了指令顺序,但是我很确定我处于调试模式并且所有优化都已关闭。

1 个答案:

答案 0 :(得分:1)

我终于找到了原因。

python的源代码在代码中使用了一些#pragma optimize。即使我在调试模式下编译它,优化也会自动打开。

我无法理解为什么python的作者决定这样做,这很容易引起新来者的混淆。

相关问题