Linux C 2——記憶體
阿新 • • 發佈:2019-01-06
gdb簡單指令
- 若要除錯一個程式,需要使用
“cc -g xx.c”
,使用 -g 編譯得到的.out程式才可以被除錯 - 使用
“gdb xx.out”
開始除錯一個程式 - l / list : 顯示原始碼(直接回車表示繼續執行上一個命令,下同)
- start : 啟動除錯,程式預設停留在main入口處,為單步除錯
- r / run :啟動除錯,直接執行到下一個斷點處
- b / break : 新增斷點
- n / next : 執行下一行,但是不進入被呼叫函式內部
- s / step :執行下一步,進入被呼叫函式內部
- p / print :列印某個變數的值
- x/nd :顯示記憶體中的n個值(預設4位元組為一個值),n為個數,d為顯示方式 ,此處d表示10進位制顯示
- bt :檢視函式堆疊
- f :切換函式棧中的函式,並不改變執行過程,但可以查詢另一個函式中的變數值
- q :退出除錯
記憶體規劃
C語言程式執行時會佔用如下圖的幾個分割槽:
其中系統核心區主要由作業系統所使用,暫不討論,其他分割槽的作用如下:
- 棧(stack):儲存被呼叫函式的區域性變數、函式引數等資訊,每次函式呼叫時,存放返回地址和呼叫者資訊,用於儲存/恢復現場,由編譯器管理,自上向下增長,可佔用自由分配區;
- 堆(heap):存放執行時被動態分配記憶體的變數,如使用malloc/free函式即分配此部分記憶體,程式設計師管理,可自下向上增長佔用自由分配區;
- 資料段(data segment):宣告的全域性變數,靜態變數以及常量會存放在資料段(如果細分,資料段之上還存在BSS段,BSS段存放未初始化的全域性變數,執行時被賦值0,資料段存放已初始化的全域性變數);
- 程式碼段(code/text segment):應用程式被編譯後生成機器碼(二進位制指令),在執行程式時,這些機器碼被存放在程式碼段,程式碼段內容通常只讀;此段也會存放常量字串;