堆栈跟踪中的行号如何出错?

时间:2015-10-16 16:25:09

标签: python-2.7 stack-trace

我有一个python(版本2.7.6)程序,它在昨晚报告了一些错误时运行了一两天。但是,堆栈跟踪显然是错误的。假装我的代码是这样的:

def do_A():
    do_some_stuff()
    do_B()

def do_B():
    do_some_IO_that_could_fail()

def do_C():
    if len('abc'):
        do_D()

def do_D():
    do_other_stuff()

if __name__ == '__main__':
    do_A()

可能失败的任务确实失败了,但是我的堆栈跟踪就像这样

Traceback (most recent call last):
  File "myfile.py", line 16, in <module>
    do_A()
  File "myfile.py", line 9, in do_A
    if len('abc'):
  File "myfile.py", line 13, in do_B
    do_other_stuff()
  CustomFailureException: "The thing that can fail? It failed."

在我的堆栈跟踪中,“in ...”部分是合理的,因为它们描述的路径实际上可以到达具有CustomFailureException的代码部分。行号和它显示的代码是一致的(即它表示第9行并且代码位于第9行),但这是错误的行。

有没有人知道我的堆栈跟踪会如何发生这种情况?

注意:此特定任务每晚都会运行,并且已经持续了一段时间。它通常会成功完成,但之前已经失败并且给出了正常的堆栈跟踪。昨晚,它始终失败并始终如一地给出了不正确的堆栈跟踪。

1 个答案:

答案 0 :(得分:4)

在代码运行后更改源文件时会发生这种情况。已编译的源具有对源代码的行号引用,但堆栈回溯通过重新加载源文件来填充实际的源文本。我认为还有某种缓存,但这里没有相关性。

所以这里的问题只是源文件不再匹配实际运行的(已编译的)程序,可能是因为它在程序启动后被更改了,或者它们可能因某些更复杂的技巧而变得不同步。