1. 程式人生 > >GDB除錯release程式

GDB除錯release程式

方法1:  如果現在有同一個工程構建出的Debug版和Release版可執行檔案projectD和projectR,如下的命令可以幫助你把Debug版中的符號表加到Release版中,實現對Release版的除錯。用釋出時的原始碼,在原有的編譯選項上(不要改變任何編譯引數,即使有"-O2"引數,也不要動),只加上"-g"選項,編譯出對應的debug程式。

  1、objcopy --only-keep-debug projectD projectsymbol.dbg #生成符號表;

  2、gdb -q --symbol=projectsymbol.dbg -exec=projectR #載入符號表;

  這下在gdb中就可以看到原始碼了。

方法2: 在編譯釋出版本時加上"-g -O2",  這樣就有符號表了, 而且不影響效能。

程式執行過程中發生異常退出時,系統會把程式當前的記憶體情況儲存在一個core檔案中。由於沒有足夠的現場日誌,異常發生的原因通常難於查詢。這種情況可以用core檔案配合gdb來解決。
造成 segment fault,產生 core dump 的可能原因 , 
1、記憶體訪問越界 、 a) 由於使用錯誤的下標,導致陣列訪問越界 b) 搜尋字串時,依靠字串結束符來判斷字串是否結束,但是字串沒有正常的使用 結束符 c) 使用 strcpy, strcat, sprintf, strcmp, strcasecmp 等字串操作函式,將目標字串讀/寫 爆。應該使用 strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp 等函式防止 讀寫越界。 
2、多執行緒程式使用了執行緒不安全的函式。 、多執行緒程式使用了執行緒不安全的函式。 
3、多執行緒讀寫的資料未加鎖保護。 、多執行緒讀寫的資料未加鎖保護。 對於會被多個執行緒同時訪問的全域性資料,應該注意加鎖保護,否則很容易造成 core dump 
4、非法指標 、 a) 使用空指標 b) 隨意使用指標轉換。一個指向一段記憶體的指標,除非確定這段記憶體原先就分配為某種結 構或型別,或者這種結構或型別的陣列,否則不要將它轉換為這種結構或型別的指標,而應 該將這段記憶體拷貝到一個這種結構或型別中, 再訪問這個結構或型別。 這是因為如果這段內 存的開始地址不是按照這種結構或型別對齊的,那麼訪問它時就很容易因為 bus error 而 core dump. 
5、堆疊溢位 、 不要使用大的區域性變數(因為區域性變數都分配在棧上),這樣容易造成堆疊溢位,破壞系統 的棧和堆結構,導致出現莫名其妙的錯誤。


gdb檢視記憶體地址和棧中的值

gdb檢視指定地址的記憶體地址的值:examine 簡寫 x-----使用gdb> help x 來檢視使用方式
     x/ (n,f,u為可選引數)
n: 需要顯示的記憶體單元個數,也就是從當前地址向後顯示幾個記憶體單元的內容,一個記憶體單元的大小由後面的u定義
f:顯示格式
               x(hex) 按十六進位制格式顯示變數。
               d(decimal) 按十進位制格式顯示變數。
               u(unsigned decimal) 按十進位制格式顯示無符號整型。
               o(octal) 按八進位制格式顯示變數。
               t(binary) 按二進位制格式顯示變數。
               a(address) 按十六進位制格式顯示變數。
               c(char) 按字元格式顯示變數。
               f(float) 按浮點數格式顯示變數
u:每個單元的大小,按位元組數來計算。
預設是4 bytes。GDB會從指定記憶體地址開始讀取指定位元組,並把其當作一個值取出來,並使用格式f來顯示
               b:1 byte     h:2 bytes     w:4 bytes g:8 bytes
     比如x/3uh 0x54320表示從記憶體地址0x54320讀取內容,h表示以雙位元組為單位,3表示輸出3個單位,u表示按照十六進位制顯示。
    from http://www.cnblogs.com/super119/archive/2011/03/26/1996125.html

gdb打印表達式的值:print/f 表示式

f是輸出的格式,x/d/u/o/t/a/c/f

表示式可以是當前程式的const常量,變數,函式等內容,但是GDB不能使用程式中所定義的巨集
檢視當前程式棧的內容: x/10x $sp-->列印stack的前10個元素
檢視當前程式棧的資訊: info frame----list general info about the frame
檢視當前程式棧的引數: info args---lists arguments to the function
檢視當前程式棧的區域性變數: info locals---list variables stored in the frame
檢視當前暫存器的值:info registers(不包括浮點暫存器) info all-registers(包括浮點暫存器)
檢視當前棧幀中的異常處理器:info catch(exception handlers)
from http://blog.chinaunix.net/uid-29062294-id-4255572.html