2015-10-16 107 views
3

我有一個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." 

在我的堆棧跟蹤,「在... 「部分是合理的,因爲它們描述的路徑實際上可以到達我的代碼中具有CustomFailureException的部分。行號和它顯示的代碼是一致的(即它表示第9行,並且代碼位於第9行),但它是錯誤的行。

有沒有人有任何線索如何可能發生在我的堆棧跟蹤?

注意:這個特殊的任務每天晚上都會運行一段時間。它通常成功完成,但之前失敗並給出正常的堆棧跟蹤。昨天晚上,它始終失敗,始終給出相同的錯誤堆棧跟蹤。

回答

4

在代碼運行後更改源文件時會發生這種情況。編譯後的源代碼具有對源代碼的行號引用,但堆棧回溯通過重新加載源文件來填充實際的源文本。我認爲也有某種緩存,但這不是相關的。

所以這裏的問題只是源文件不再與實際運行的(編譯的)程序相匹配,可能是因爲程序啓動後它被更改了,或者它們可能由於一些更復雜的欺騙而變得不同步。 ..

+0

看看最近對我的文件所做的更改(謝謝Git!),並且減少了之前在文件中添加的行數,我找到了正確的路線。我想我更新代碼後忘了實際重新啓動我的程序。無論如何,我希望對這種奇怪的行爲有一個相對簡單的解釋。 –

+0

有沒有這個現象的名稱或谷歌更多的方式?儘管重新運行Python,但我有一個相關的bug(使用舊版本)。或許問題出在你說的緩存上,但不知道如何去谷歌它 – Gilly

+0

你沒有給我足夠的信息來認識你的問題,但我嚴重懷疑任何連接 – strubbly

相關問題