簡體   English   中英

Atmel Studio:數據斷點如何觸發?

[英]Atmel Studio: How exacly do data breakpoints trigger?

好的,伙計們。 我在Atmel工作室(使用ICEmk2-JTag調試器)中設置了一個數據斷點,盡管地址值發生了變化,它也不會被擊中。 (我檢查了以下斷點)為什么會這樣?

數據斷點的全部目的是檢測地址值的變化,還是我誤會了什么?

更具體地說:我有一個指向值的指針A。 但是指針A被我試圖追查的錯誤所改變(而不是它指向的值!)。 因此,我創建了一個指針B,該指針B指向存儲指針A的地址,並在指針B上設置了數據斷點。這是初始化:

#define lastCMDRingBufferSIZE 255

volatile uint8_t lastCMDRingbuffer[lastCMDRingBufferSIZE]; //
volatile uint8_t*lastCMDRingstartPtr = lastCMDRingbuffer; // This is PtrA
volatile uint32_t*ptrToPtr = &lastCMDRingstartPtr; // PtrB

或另一種表達方式; 在以下情況下是否觸發數據斷點:

  1. 地址的內容是由數組溢出寫的嗎?
  2. 地址的內容被解釋為由惡意指針以某種方式寫入的較大數據結構的一部分? (示例:取消引用並寫入了64位指針,結果將覆蓋32位整數)

非常感謝您的懷疑和建議:)

您沒有以正確的方式解決這個問題。 如果指針A損壞,則需要直接在&A上設置數據斷點; 除非您可以將條件斷點設置為A != B否則創建輔助指針將無濟於事。

在以下情況下是否觸發數據斷點:

  1. 地址的內容是由數組溢出寫的嗎? 地址的內容被解釋為更大的數據結構的一部分,
  2. 是由流氓指針寫的嗎? (示例:取消引用並寫入了64位指針,結果將覆蓋32位整數)

當斷點地址的值改變時觸發它。 片上調試硬件沒有語言構造的概念; 因此&A您需要查看的地址是&A而不是AB

如果修改了lastCMDRingstartPtr則在您的實際代碼中, ptrToPtr也不會更改。 只需輸入&lastCMDRingstartPtr作為地址; 那么當lastCMDRingstartPtr的值更改時,您會休息一下。

我使用的支持中斷數據訪問的調試硬件並未像我認為大多數人期望的那樣實現。 硬件不監視該地址處的內存並在其發生更改時發出斷點,而是監視CPU的讀/寫總線,並在給定地址(或地址范圍)和正確寬度的訪問發生時中斷。 。

最終結果是您可能會有一些硬件無法捕獲的活動。 DMA訪問內存是您根本無法捕獲的大內存(除非您的SRAM / DRAM接口具有發出此類故障的能力)。 另外,如果您以未配置調試硬件的方式訪問地址(即,在查找字寫入時進行字節寫入),如果您具有非常幼稚的memset / memcpy進行字節訪問)

我的猜測是,您正在對指針之前聲明的數組進行一些字節訪問,並通過溢出數組踩踏指針。 即使您在指針上設置了字訪問硬件斷點,也不會被捕獲,因為您正在執行字節訪問。

暫無
暫無

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

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