2013-02-28 47 views
3

經過長時間的調試工作,我發現我的應用程序可能寫了一個錯誤的值來解決0x5b81730。我想知道我的代碼的哪一部分執行此操作。如何強制操作系統(Windows)爲每個調試會話的程序分配相同的地址?

前段時間,當我使用Windows XP時,這將非常容易。我會在調試器(MS Visual Studio 2005)中重新啓動我的應用程序,在該地址設置一個數據斷點,調試器將指向我的違規代碼。

現在,我切換到Windows 7後,這似乎是不可能的(或至少非常困難)。當我運行我的應用程序時,我發現每次堆中同一對象的地址稍有不同時(例如,一次運行時爲0x53b71b4,而另一次運行時爲0x55471b4)。

我聽說Windows 7有ASLR,這可能是我看到這些地址變化的原因。

那麼我能做些什麼來繼續使用我的調試技術?

我應該關閉ASLR嗎? (我相信這是可能的,但無法找到如何去做)

或者是我的問題是由別的東西造成的而不是ASLR?

或者我應該忘記使用數據斷點的方便性,並使用其他一些技術?

+0

你試過這個http://msdn.microsoft.com/en-us/library/f7f5138s(v=vs.80).aspx? – 2013-02-28 14:02:35

+0

這似乎是由ASLR引起的(這是正確的縮寫?)。你不應該拒絕它,而應該忍受它。最後,如果你不使用它,它可能會混亂不堪。 – 2013-02-28 14:03:04

+0

@ bash.d [引用需要]!你能否證明禁用ASLR可能會導致問題(或「混亂」)?我很確定它不能,並且在調試一個孤立的問題時關閉它是個好主意。 (當然,由於安全原因,爲了發佈版本而重新啓用它可能是個好主意。) – us2012 2013-02-28 14:05:47

回答

3

如果您使用的是UB之類的東西,那麼絕對不能保證地址是什麼。你不能依靠它每次都是一樣的。

但是,您可以嘗試在鏈接器設置中禁用ASLR-其中一個屬性是「隨機基地址」。

0

我會嘗試使用Application Verifier。這是調試內存泄漏問題的好方法。當存在內存損壞問題時,它會中斷代碼的執行。

相關問題