我的堆栈跟踪中的行号怎么会出错?
How can the line numbers in my stack traces be wrong?
我有一个 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 行的代码),但它是错误的行。
有谁知道我的堆栈跟踪是如何发生这种情况的?
注意:此特定任务每晚运行,并且已经运行了一段时间。它通常成功完成,但之前失败并给出了正常的堆栈跟踪。昨晚,它一直失败,并且一直给出相同的错误堆栈跟踪。
当您在代码 运行 之后更改源文件时会发生这种情况。编译后的源代码引用了源代码的行号,但堆栈回溯通过重新加载源文件填充了实际的源文本。我认为也有某种缓存,但这与这里无关。
所以这里的问题只是源文件不再匹配实际上是 运行 的(编译)程序,可能是因为它在程序启动后被更改,或者它们可能变得不同步一些更复杂的诡计...
我有一个 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 行的代码),但它是错误的行。
有谁知道我的堆栈跟踪是如何发生这种情况的?
注意:此特定任务每晚运行,并且已经运行了一段时间。它通常成功完成,但之前失败并给出了正常的堆栈跟踪。昨晚,它一直失败,并且一直给出相同的错误堆栈跟踪。
当您在代码 运行 之后更改源文件时会发生这种情况。编译后的源代码引用了源代码的行号,但堆栈回溯通过重新加载源文件填充了实际的源文本。我认为也有某种缓存,但这与这里无关。
所以这里的问题只是源文件不再匹配实际上是 运行 的(编译)程序,可能是因为它在程序启动后被更改,或者它们可能变得不同步一些更复杂的诡计...