2011-12-15 54 views
2

好吧,這是一個複雜的問題,我一直試圖在過去4個月內在相當大的代碼庫中查找一個錯誤,只發生在valgrind不可用的平臺上。查找所有類/結構的所有成員從類/結構的起始處偏移了N個字節?

發生了什麼是一個單字節0x01正在寫入一個奇怪的地方(隨機發生,但它似乎總是寫在一小堆可能的地方,不管調試/釋放或哪個編譯器被使用)。我發現錯誤字節始終離開它破壞的對象的起始位置80個字節。

無論如何,有什麼工具或技巧或Visual Studio的插件,可以掃描整個代碼庫,並列出所有成員的80字節偏離他們的類的開始?

+0

它不一定是80字節偏移量的成員。它可能很容易(也可能是)寫入該字節的緩衝區溢出。想想`struct foo {char arr [10]; void bar(){arr [80] = 1; }};`。 – Xeo 2011-12-15 00:38:05

+0

它的80個字節從一個類的開始不是從一個數組的開始,如果它是一個數組溢出或堆棧溢出,我期望損壞的字節前後的字節也是破壞的 – TylerGlaiel 2011-12-15 00:46:51

回答

0

如果它總是處於一致的地方,即在結構的特定實例中,則可以在該實例已初始化後放置一個斷點,然後在內存發生更改時觸發的特定地址設置斷點我忘記了VS中那些斷點的實際名稱)。

這是一個非常方便的技術,用於發現寫入到它不應該的位置的難以捉摸的扭曲操作!