gdb 常用命令
1,啟動程序
- r(un):執行程序,如果沒有設置斷點,則直接把程序都執行完
- start:執行程序到main函數后,停住。
2,常用命令
- n(ext):下一條指令(不進入函數)
- s(tep):進入函數
- 回車:執行上一條命令
- c:執行到下一個斷點停住,如果后面沒有斷點,程序執行結束。
- q:退出gdb
3,設置斷點
-
b(reak):設置斷點,b后面指定行號。
- 指定行號
- 指定文件名:行號
- 指定 函數
- 指定文件名:函數
-
設置條件斷點
-
有個循環,當只想在循環變量i=2的時候,程序停住:【b 行號 if i == 2】
(gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x0000555555554748 in main at main.c:10 stop only if i == 2
-
-
設置臨時斷點:tbreak args
設置一個只中斷一次的斷點。args 和break 命令里的參數一樣,斷點設置也一樣,但斷點在第一次程序中斷后自動 刪除。 -
用正則表達式設置斷電:rbreak regex
在所有匹配正則表達式regex 的函數上設置斷點。這個命令會在所有匹配的函數上設置無條件的斷點,也打印設置的斷點列表
正則表達式的語法是標准的,就如grep
工具用的一樣。注意,和shell用的不一樣,例如foo匹配開頭是fo,接下來有0 或者多個o 的函數。在你的正則表達式的開頭和結尾有個隱含的.,所以要想只匹配foo 開頭的函數,用^foo.在調試C++程序,在非特定類的成員函數的重載函數的設置斷點上,rbreak 很有用。
直接運行rbreak:在所有函數上設置斷點。
4,查看源文件
- l(list):查看源文件
- 指定行號
- 指定文件名:行號
- 指定 函數
- 指定文件名:函數
5,查看設置了哪些斷點
- info b
6,刪除斷點
- d (el)斷點的號碼
例子:先用info b查看有哪些斷點,注意Num列,如果想刪除【src/add.c:4】處的斷點,就執行【d 2】
(gdb) info b
Num Type Disp Enb Address What
2 breakpoint keep y 0x0000555555554667 in add at src/add.c:4
3 breakpoint keep y 0x000055555555468b in main at main.c:5
刪除3號(src/add.c:4處的)斷點:
(gdb) d 2
再用info b看看,發現2號斷點沒有了。
(gdb) info b
Num Type Disp Enb Address What
3 breakpoint keep y 0x000055555555468b in main at main.c:5
7,查看變量的值和變量的類型
- 查看任何東西(變量/函數等)的值:p
- 查看任何東西(變量/函數等)的類型:ptype
8,設置程序的啟動參數
- 先執行【set args 參數1],然后【r】
- 直接執行【r 參數1】
9,修改變量的值
- set var 變量=newValue
10,查看幫助
- help 命令名字:比如查看set命令的具體用法,可以使用【help set】
11,每次單步執行都想觀察變量的值,請使用【display】,不想看了,就用【undisplay】加Num的號碼
- display 變量的名字
- undisplay Num(號碼)
- info display:可以查看display的Num(號碼)
12,調試core文件,當出現:段錯誤(核心已轉儲)[Segmentation fault (core dumped)]時,可以使用【gdb 程序名 core文件名】后,就能直接看到在哪行出錯,如果沒有顯示,可以輸入【where】,也可以定位到哪行出錯。
但是core文件默認是不被生成的,如何讓它生成呢,
- 首先確認當前狀態:【ulimit -c】,如果結果為0,說明不能生成core文件
- 那么就設置core文件的允許大小:【ulimit -c unlimited】,也就是core文件大小沒有限制,這樣設置的好處是當core文件特別大的時候也能夠被生成。當然也可以指定具體的大小【ulimit -c 1024000】等。
之后就有了下面的問題:
程序第一次執行出了[Segmentation fault]錯誤后,就會在當前目錄生成一個名字為【core】的文件,問題來了,如果又執行了一次,又出了[Segmentation fault]錯誤后,又會生成一個【core】,這次的【core】就會覆蓋掉上次的【core】,所以就需要設置如何生成【core】的文件名,達到每次生成的【core】的名字都不相同,就不會覆蓋掉上次的core文件了。
選項如下:
%p:insert pid into filename 添加pid
%u:insert current uid into filename 添加當前的uid
%g:insert current gid into filename 添加當前的gid
%s:insert signal that caused the coredump into the filename 添加導致產生core的信號
%t:insert UNIX time that the coredump occurred into filename 添加core文件生成時間的unix時間
%h:insert hostname where the coredump happened into filename 添加主機名字
%e:insert coredumping executable name into filename 添加程序名
修改辦法:
-
切換到root用戶
sudo su
-
編輯/proc/sys/kernel/core_pattern文件,只能用下面的方法
echo "core-%e-%t" > /proc/sys/kernel/core_pattern
然后生成的core文件的名字就變為:【core-app-1555987945】,注意程序的名字為app。