C語言——gdb除錯

歡歡喜歡歡歡喜喜發表於2018-12-17

一、gdb基礎

前提:在gcc編譯時,要輸入-g選項;

步驟:

1.gdb進入GDB除錯模式
2.file 可執行檔名 
3.pwd顯示當前目錄
4.l列出原始碼(前提是編譯時選擇了-g選項)
5.b 行號:設定斷點;
  tb 行號 :設定臨時性斷點,與斷點不同,臨時斷點只在第一次執行時起作用
6.r:開始執行
單步執行:n(TIPs1:可以按回車重複上一次操作,在單步除錯時這個feature很有用)。
單步進入:s
繼續執行:c(走到下一個斷點處)
7.bt:檢視當前函式執行的堆疊
8.info 引數:檢視相關的資訊:例如:info break,info watchpoints
9.watch 變數名:檢視變數值
10.finish :退出當前函式
11.quit:退出除錯
12.delete breakpoints 2:刪除第二個斷點
13.disable/enable breakpoints 3 :禁用/啟用第三個斷點
14.frame:顯示當前棧及其變數

core dump:Coredump叫做核心轉儲,它是程式執行時在突然崩潰的那一刻的一個記憶體快照。作業系統在程式發生異常而異常在程式內部又沒有被捕獲的情況下,會把程式此刻記憶體、暫存器狀態、執行堆疊等資訊轉儲儲存在一個檔案裡。

二、開啟core dump模式:

1.在shell命令列設定:ulimit -c unlimited

2.自定義core檔案的命名格式:echo ./core_%e_%t_%p > /proc/sys/kernel/core_pattern

3.進入core檔案除錯:gdb 程式名 core檔名 

三、文章分享

以下內容為轉載:
 

/**********************************************************************************
gcc -g  main.c                      //在目標檔案加入原始碼的資訊
gdb a.out       

(gdb) start                         //開始除錯
(gdb) n                             //一條一條執行
(gdb) step/s                        //執行下一條,如果函式進入函式
(gdb) backtrace/bt                  //檢視函式呼叫棧幀
(gdb) info/i locals                 //檢視當前棧幀區域性變數
(gdb) frame/f                       //選擇棧幀,再檢視區域性變數
(gdb) print/p                       //列印變數的值
(gdb) finish                        //執行到當前函式返回
(gdb) set var sum=0                 //修改變數值
(gdb) list/l 行號或函式名             //列出原始碼
(gdb) display/undisplay sum         //每次停下顯示變數的值/取消跟蹤
(gdb) break/b  行號或函式名           //設定斷點
(gdb) continue/c                    //連續執行
(gdb) info/i breakpoints            //檢視已經設定的斷點
(gdb) delete breakpoints 2          //刪除某個斷點
(gdb) disable/enable breakpoints 3  //禁用/啟用某個斷點
(gdb) break 9 if sum != 0           //滿足條件才啟用斷點
(gdb) run/r                         //重新從程式開頭連續執行
(gdb) watch input[4]                //設定觀察點
(gdb) info/i watchpoints            //檢視設定的觀察點
(gdb) x/7b input                    //列印儲存器內容,b--每個位元組一組,7--7組
(gdb) disassemble                   //反彙編當前函式或指定函式
(gdb) si                            // 一條指令一條指令除錯 而 s 是一行一行程式碼
(gdb) info registers                // 顯示所有暫存器的當前值
(gdb) x/20 $esp                    //檢視記憶體中開始的20個數
*********************************************************************************/

還有兩篇實操文:

https://www.cnblogs.com/life2refuel/p/5396538.html

core dump使用:

https://blog.csdn.net/sunxiaopengsun/article/details/72974548

 

 

相關文章