16.7.2.3 单步执行程序
除了程序暂停时在调用栈中上下导航处,还可以在进入调试工具那一点之后单步执行程序。
#!/usr/bin/env python3
# encoding: utf-8
#
# Copyright (c) 2019 Iglesias. All rights reserved.
#
import pdb
def f(n):
for i in range(n):
j = i * n
print(i,j)
return
if __name__ == '__main__':
pdb.set_trace()
f(5)
使用step(缩写为s)执行当前行,然后在下一个执行点停止,这可能是所调用函数中的第一条语句,也可能是当前函数的下一行语句。
解释器会在set_trace()调用处暂停,并将控制交给调试工具。第一个step会执行进入f()。
下一个step会执行到f()的第一行,并开始循环。
执行下一步会移动到循环中的第一行,这里定义了j。
i的值为0,所以再执行一步后,j的值应当也是0。
像这样一次执行一步,如果在出现错误那一点之前需要执行大量代码,或者如果需要反复调用相同的函数,那么这会变得很麻烦。
#!/usr/bin/env python3
# encoding: utf-8
#
# Copyright (c) 2019 Iglesias. All rights reserved.
#
import pdb
def calc(i,n):
j = i * n
return j
def f(n):
for i in range(n):
j = calc(i,n)
print(i,j)
return
if __name__ == '__main__':
pdb.set_trace()
f(5)
在这个例子中,calc()没有错误,所以如果每次在f()的循环中调用这个函数时都进行单步跟踪,那么执行时会显示calc()的所有代码行,这就对真正有用的输出造成了干扰。
next命令(缩写为n)有些类似step,不过不会从正在执行的语句进入所调用的函数。实际上,它会用一个操作完成整个函数调用,直接进入当前函数的下一条语句。
until命令类似于next,只不过它会继续执行,甚至执行到同一个函数中行号大于当前值的一行。这说明,可以用until跳过循环末尾。
运行until命令之前,当前行为18,即循环的最后一行。运行until之后,位于第19行,并且循环已经退出。
要想一直执行到一个特定的行,可以把这个行号传递给until命令。与设置断点时不同,传入until的行号必须大于当前行号,所以这个命令对于通过跳过很长的代码块来在函数中导航而言最为有用。
return命令也是绕开函数部分的一个捷径。它会继续执行,直至函数准备执行return语句,然后会暂停,使得在函数返回之前有时间查看返回值。