簡體   English   中英

在gdb中跟蹤對類實例/內存范圍的寫訪問

[英]Tracing write access to class instance/memory range in gdb

我正在嘗試調試我在C ++大學課程中編寫的小型操作系統。 在運行時某處我的一個對象被破壞了。 這似乎是由於意外寫入錯誤的內存地址而發生的。 由於我無法從純粹的代碼中找到發生這種情況的地方,我需要另一種方式。

由於這是一個操作系統,我無法附加像valgrind這樣的工具,但我可以在附加了gdb的模擬器(bochs / qemu)中運行它。

在gdb中是否有一種方法可以跟蹤對類實例的寫訪問,或者更一般的特定內存范圍? 我想在寫入訪問發生后立即中斷,因此我可以驗證這是否有效。

你可以把觀察點:

watch x

x被修改時,這將中斷。 x可以是任何類型的變量。 如果你有:

class A;
A x;

每當修改x時,gdb就會中斷。

實際上,你可以在任何表達式上放置一個觀察點,當表達式發生變化時,gdb就會中斷。 但是要小心,因為如果表達式不是底層硬件支持的,那么gdb必須在每條指令之后對它進行評估,這會導致糟糕的性能。 例如,如果上面的A是一個有很多成員的類,那么gdb 可以監視整個實例x ,但它的工作方式是:

  • 執行指令
  • 跳轉到調試斷點
  • 檢查x是否已更改
  • 回到程序

當然,這慢。 如果xint那么gdb可以使用硬件斷點。

如果您有特定的內存地址,也可以觀看它:

watch *0x1234

當[0x1234]的內容發生變化時,這將中斷。

您還可以使用rwatch設置讀取斷點,或使用awatch設置讀/寫斷點。

如果您至少知道它發生的位置,您也可以使用“顯示”而不是手表並逐行手動逐步,直到您看到更改發生的時間。 使用“手表”觀看地址的過程非常緩慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM