2009-04-07 78 views
2

我想了解如何使用Win32 Debugging API實現代碼覆蓋工具。如何使用Win32實現代碼覆蓋工具調試API

我的想法一直利用Win32 Debugging API啓動在調試模式下的過程 - 並跟蹤已執行了什麼CPU指令。在跟蹤完所有CPU指令後,我會使用映射文件將其映射到執行的源代碼行。

據我瞭解,將有知道指令已被執行什麼CPU的兩種方式。

  1. 將推出在調試模式下的過程 - 設置在單步模式中的所有線程,並讓調試應用筆記已被執行

  2. 會做出更聰明的做法都說明,你將更多地瞭解x86指令,並基本用斷點替換下一個分支指令。然後跟蹤兩個斷點之間的增量指令。 -

更新由邁克爾的迴應引發了新的建議方案:

與映射文件
  • 開始,插入斷點每行的開頭,讓每次出現斷點時都會通知調試框架。

  • 開始與地圖文件 - 二進制指令插入一個「鉤」是被調用在每個源線的入口 - 避免通過調試框架回調。

  • 使用VM技術 - 如VMware找出特定過程的指令被執行的 - 我不完全理解這種方法...

  • 可能有人驗證方法之一或者可能會提出一個替代方案 - 請注意,用例是逐行代碼覆蓋而不是性能分析 - 因此我們需要知道每個單一源代碼行是否被訪問過。

    我的主要目標(雖然沒有特別的計劃到位......)將是主要創建德爾福簡單的代碼覆蓋工具。

    謝謝!

    +0

    使用Visual Studio Profiler是不可能的?它可以測試你的二進制文件並提供代碼覆蓋。 – 2009-04-07 16:06:45

    +0

    謝謝 - 但不幸的是,對於Delphi應用程序來說,這是個問題... :) – 2009-04-07 16:10:56

    回答

    2

    一種方法是掛鉤所有的API調用和函數調用從源發表比較。因此你發現了什麼被覆蓋。
    有很多的API掛鉤,一個是Trappola API hooking

    +0

    我從未聽說過特拉波拉。看起來很有趣。 – Mick 2009-04-07 17:47:46

    1

    這可能是工作 - 每一步事件將創建一個例外,你可以在你執行的代碼行的圖錄命中IP地址。

    不幸的是,我想這將是冰河時代的緩慢。這會非常低效,因爲每一行代碼都會導致1000倍的工作量,因爲會產生異常,被困,發送到調試器的消息,以及在記錄命中後返回。嘗試爲每條覆蓋線設置斷點,並在命中後清除它們可能會更好。這會更快,但最有可能仍然很慢。

    核心問題是您正在嘗試使用調試器作爲代碼覆蓋率工具,它並不適用於此。快速搜索在Internet上顯示了Delphi的幾個代碼覆蓋工具。

    1

    我會建議,而不是鉤住每行代碼,你可以去爲每個塊。我的意思是說代碼塊的鉤子。它會更快,您可以從塊數中獲得線數。