1. 程式人生 > >Linux C 2——記憶體

Linux C 2——記憶體

gdb簡單指令

  1. 若要除錯一個程式,需要使用“cc -g xx.c”,使用 -g 編譯得到的.out程式才可以被除錯
  2. 使用“gdb xx.out”開始除錯一個程式
  3. l / list : 顯示原始碼(直接回車表示繼續執行上一個命令,下同)
  4. start : 啟動除錯,程式預設停留在main入口處,為單步除錯
  5. r / run :啟動除錯,直接執行到下一個斷點處
  6. b / break : 新增斷點
  7. n / next : 執行下一行,但是不進入被呼叫函式內部
  8. s / step :執行下一步,進入被呼叫函式內部
  9. p / print :列印某個變數的值
  10. x/nd :顯示記憶體中的n個值(預設4位元組為一個值),n為個數,d為顯示方式 ,此處d表示10進位制顯示
  11. bt :檢視函式堆疊
  12. f :切換函式棧中的函式,並不改變執行過程,但可以查詢另一個函式中的變數值
  13. q :退出除錯

記憶體規劃

C語言程式執行時會佔用如下圖的幾個分割槽:
記憶體分配圖
其中系統核心區主要由作業系統所使用,暫不討論,其他分割槽的作用如下:

  1. 棧(stack):儲存被呼叫函式的區域性變數、函式引數等資訊,每次函式呼叫時,存放返回地址和呼叫者資訊,用於儲存/恢復現場,由編譯器管理,自上向下增長,可佔用自由分配區;
  2. 堆(heap):存放執行時被動態分配記憶體的變數,如使用malloc/free函式即分配此部分記憶體,程式設計師管理,可自下向上增長佔用自由分配區;
  3. 資料段(data segment):宣告的全域性變數,靜態變數以及常量會存放在資料段(如果細分,資料段之上還存在BSS段,BSS段存放未初始化的全域性變數,執行時被賦值0,資料段存放已初始化的全域性變數);
  4. 程式碼段(code/text segment):應用程式被編譯後生成機器碼(二進位制指令),在執行程式時,這些機器碼被存放在程式碼段,程式碼段內容通常只讀;此段也會存放常量字串;