2010-04-09 56 views
1

我正在考慮如何做自動錯誤跟蹤和作爲一部分,我想知道什麼是可用於匹配源代碼行號(或更準確的數字映射從指令指針通過類似addr2line)在一個版本的程序到另一個版本的同一行。 (假設一切都在某種源代碼控制中,並且可用於我的代碼)跨版本行匹配

最簡單的方法是在文件上使用diff工具/ lib並對行號範圍進行一些數學運算,但這有一些限制:

  • 它不處理跨文件議案。
  • 它可能不適合用於更改的行
  • 它沒有查看中間版本中可用的信息。
  • 當diff工具出錯時,它無法手動修補線條。
  • 它有點笨重

之前,我開始深入到開發更好的東西:

  • 已經存在的東西要做到這一點?
  • 類似的系統有什麼功能我沒有想到?

回答

0

爲什麼你需要這樣做?如果您使用體面的源代碼版本控制,您應該可以訪問舊版本的代碼,您可以簡單地提供一個鏈接,以便人們可以在原始位置查看錯誤。事實上,我在這個系統中看到的主要問題是,該錯誤可能已經被修復,但是您的自動線路跟蹤代碼將指向一條線,並說有一個錯誤。看起來這個系統會很痛苦,並且在實踐中不會提供很多幫助。

+1

我在想的並不是那麼多的按行數來跟蹤特定的錯誤(棘手的錯誤有多少次*有一行代碼),但更多的是跟蹤統計信息關於事情發生的地方檢測。例如;什麼主張最常被擊中?斷言行程時,堆棧上最常見的代碼行是什麼?那種事情。能夠將這種東西從一個版本組合到另一個版本會很好。 – BCS 2010-04-09 17:18:58

0

我的建議是:不要試圖追蹤行號,因爲您觀察到的行數可能隨軟件更改而快速失去同步,您應該用唯一標識符修飾每個斷言(或其他感興趣的行)。

假設你使用C,在斷言的情況下,這可能就像將assert(x == 42);改爲assert(("check_x", x == 42));一樣簡單 - 這在功能上是相同的,因爲C中的逗號操作符的語義以及一個字符串文字將始終評估爲true。

當然這意味着您需要確定先驗您希望跟蹤的項目。但是鑑於沒有一種可靠的方法來匹配不同版本的源代碼行數(我的意思是說,對於您可以提出的任何機制,我相信我可以提出這種機制做錯事情的情況),我認爲這是是你能做的最好的。

另一個想法:如果你使用C++,你可以使用RAII非常優雅地跟蹤動態範圍。基本上,你有一個Track類,它的構造函數接受一個描述範圍的字符串,並將其添加到當前活動作用域的全局堆棧中。析構函數彈出堆棧頂部的元素。最終的組成部分是一個靜態函數Track::getState(),它簡單地返回所有當前活動作用域的列表 - 這可以從異常處理程序或其他錯誤處理機制中調用。