2012-09-24 56 views
2

我只是想知道是否可以在變量值更改(在任何編程語言和工具)上設置斷點?設置可變值更改的斷點

例如,我想說:「停止任何地方,當變量的值'a'將被改變」。

我知道有能力設置條件斷點並在變量具有某個特定值時停止執行,但我沒有聽說關於觀察變量的變化。

如果不可能,爲什麼?

+0

在某些層次上,如果您可以實現「在變量取值特定時停止」,則可以通過檢測變量的所有更改並檢查它是否爲所需值來執行此操作。所以,是的,確實存在可以做到這一點的調試器。 –

+0

據我所知,有些dubugger可以實現「在變量在這行代碼中佔用特定值時停止」,但是我不知道是否有調試器可以實現「當變量在任何代碼行中具有特定值時停止」 .... – demas

回答

2

根據我的經驗,您可以通過「內存斷點」或「內存觀察點」來實現此目的。例如GDB做它像這樣:Can I set a breakpoint on 'memory access' in GDB?

至於我已經看到了寫觀察點,破發竟觸發時a寫入,無論新值是否等於舊值。所以如果通過「改變」你真的意思是「改變」,那麼在那裏的例子就少了。可能甚至沒有,我不確定,儘管我認爲假設你正在實施寫作觀察點,那麼在技術上難以實施只更改觀察點。

對於某些語言,它會產生變化a是什麼類型的變量。例如,在啓用優化時,在C或C++中,變量可以「提升」到寄存器中,在這種情況下,變量地址上的硬件內存觀察點不一定會捕獲每個變化。

堆棧上的變量也有一個限制,即如果你的函數退出但觀察點仍然被設置,那麼它可以獲得對同一個地址的訪問,現在正在使用另一個函數中的另一個變量。如果您的函數稍後(或遞歸)被再次調用,它不一定從相同的堆棧位置開始,如果不是,那麼您的觀察點將無法訪問在不同位置的「相同」變量。

在我的經驗中稱爲「有條件的斷點」時,「在某個特定行的特定條件成立時停止」。它通常使用不同的機制 - 調試器很可能會在該行代碼處放置斷點指令。每次觸發調試器時都會檢查條件並在錯誤情況下繼續執行。

1

某些處理器支持在讀取或寫入地址時會斷開的硬件斷點。例如,如果我在地址0x10005060有一個4字節的變量,那麼我可以像這樣設置一個硬件斷點(使用windbg):ba w4 0x10005060。如果寫入4個字節中的任何一個,處理器將中斷。當讀取或寫入任何4個字節時,以下命令指示處理器中斷:ba r4 0x10005060。