對於調查託管堆損壞,我想使用ba(斷開訪問)斷點。我可以在託管代碼中使用它們嗎?如果是,我怎樣才能以編程方式設置它們?以編程方式在託管代碼中設置ba(斷開訪問)斷點
UPDATE:這也將是好了,所以將它們設置在WinDbg中( - >爲類型XY的每個對象集BA)
對於調查託管堆損壞,我想使用ba(斷開訪問)斷點。我可以在託管代碼中使用它們嗎?如果是,我怎樣才能以編程方式設置它們?以編程方式在託管代碼中設置ba(斷開訪問)斷點
UPDATE:這也將是好了,所以將它們設置在WinDbg中( - >爲類型XY的每個對象集BA)
斷點由「BA」命令設置被稱作處理器或硬件斷點。
首先是好消息
這是很容易設置硬件斷點。您需要將處理器的調試寄存器(DR0,DR1,DR2或DR3)之一設置爲數據的地址,並將調試控制寄存器DR7設置爲字段以設置存儲器的大小和訪問類型。 (在64位彙編)指令是這樣的:
MOV RAX,DR0
顯然,你必須以某種方式從你選擇的語言執行此彙編指令,或互操作使用C++和內聯彙編,但這是比設置軟件斷點更容易。
現在的壞消息
首先,在SMP機器上,你將不得不爲可以觸摸你的代碼中所有的處理器做到這一點。如果您爲進程配置處理器親和性,或者在單處理器上進行調試,這可能是可以解決的。其次,英特爾架構上只有4個調試處理器。如果您嘗試使用WinDbg設置處理器斷點,則在第4步之後,如果您點擊g
,它將會投訴Too many data breakpoints for thread N
。
我認爲你所提到的關於自動化的全部目的是因爲有太多的對象來手工設置斷點。無論如何,由於你只限於4個ba
斷點,所以自動化這一點並沒有多大意義。