1. 程式人生 > >用GDB除錯程式(五)

用GDB除錯程式(五)

在GDB中,你可以隨時檢視以下三種變數的值:
1、全域性變數(所有檔案可見的)
2、靜態全域性變數(當前檔案可見的)
3、區域性變數(當前Scope可見的)

如果你的區域性變數和全域性變數發生衝突(也就是重名),一般情況下是區域性變數會隱藏全域性變數,也就是說,如果一個全域性變數和一個函式中的區域性變數同名時,如果當前停止點在函式中,用print顯示出的變數的值會是函式中的區域性變數的值。如果此時你想檢視全域性變數的值時,你可以使用“::”操作符:

file::variable
function::variable
可以通過這種形式指定你所想檢視的變數,是哪個檔案中的或是哪個函式中的。例如,檢視檔案f2.c中的全域性變數x的值:

gdb) p 'f2.c'::x

當然,“::”操作符會和C++中的發生衝突,GDB能自動識別“::” 是否C++的操作符,所以你不必擔心在除錯C++程式時會出現異常。

另外,需要注意的是,如果你的程式編譯時開啟了優化選項,那麼在用GDB除錯被優化過的程式時,可能會發生某些變數不能訪問,或是取值錯誤碼的情況。這個是很正常的,因為優化程式會刪改你的程式,整理你程式的語句順序,剔除一些無意義的變數等,所以在GDB除錯這種程式時,執行時的指令和你所編寫指令就有不一樣,也就會出現你所想象不到的結果。對付這種情況時,需要在編譯程式時關閉編譯優化。一般來說,幾乎所有的編譯器都支援編譯優化的開關,例如,GNU的C/C++編譯器GCC,你可以使用“-gstabs”選項來解決這個問題。關於編譯器的引數,還請檢視編譯器的使用說明文件。