全域性變數記憶體莫名被破壞的解決之路

2021-10-03 07:25:22 字數 956 閱讀 5837

c++中全域性變數是先於main函式初始化的而且全域性變數的初始化順序未知,由於這個特點的的原因。全域性變數記憶體別破壞的問題比較難以查詢,首先記憶體被破壞 大部分情況是因為別的變數且這個變數含有指標,出現了記憶體越界,覆蓋了後面變數記憶體空間,從而使後面的變數被破壞。順著這個思路我就開始了bug定位之路。

1檢視別破壞的全域性變數位址對應的記憶體,發現此變數初始化後是正常值,但是執行到main函式的開頭時發現他已經被破壞,說明這個變數應該是被乙個全域性變數破壞的,從記憶體的變化來看,應該離此變數不遠,先於此變數初始化,於是我就把整個專案的所有全域性變數的初始化處打上斷點,並沒有找到乙個符合位址的變數。到這裡我意識到這個問題的嚴重性了,不好找了。

首先在命令列輸入:bu all_in_rest!g_commanage  這是告訴windbg在g_commanage  處中斷,因為我發現g_commanage  這個全域性物件在啟動之初遭到了破壞所以我先找到它的位址。

接著發現確實能夠中斷,雖然沒有直接跳到對應的**,然後在memory物件輸入&g_commanage找到他的位址

然後呢再輸入乙個神奇的命令:ba w4 00007ff6`874af5f0

上圖 breakpoint 2 就是我打的記憶體修改斷點,看下圖。

c語言 全域性變數莫名其妙被修改

之前寫乙個程式的時候,設定了乙個全域性變數的標誌,但是在程式執行的過程中這個全域性變數的值總是莫名其妙的被改變 定義 int plug n n int global plug 0 最後發現是因為在程式中對plug使用的是 1,n 可能是因為定義的時候,global與plug挨著,所以其 實際的物理儲...

解決Ajax全域性變數賦值的問題

在做專案的過程中,以下 在1處a為0。然後通過乙個ajax請求乙個值為1的data賦予a,在2處a為1。然後來到3這裡的時候,a還是為0。通過查詢網路,得出原因是ajax預設的是非同步傳輸資料,在2處的a的scope只在ajax方法內部。1 var a 0 ajaxsetup get a.actio...

解決golang 關於全域性變數的坑

學習golang不久,在定義全域性變數的時候遇見了坑。寫個小例子,增強記憶。var p int func main func test i int int,error 編譯一直不通過,p declared and not used。後來查了查資料,看見這種其實是在main裡邊又重新定義了p,所以一直...