c/c++ gdb 2024-09-07

編譯器 GCC
IDE vscode pycharm
調(diào)試器 GDB (GCC的模型編譯器)

GDB官網(wǎng)
一個(gè)中文教程
gdb 命令
在終端中使用 man gdb可以看到gdb有那些命令

list 列出 讀取的代碼  每次list的顯示的有限愿卒,可以繼續(xù)list
run 運(yùn)行程序  簡(jiǎn)寫(xiě)為r
next 一步一步調(diào)試 簡(jiǎn)寫(xiě)為n
quit 退出gdb模式
break 打斷點(diǎn) 簡(jiǎn)寫(xiě)為b
通過(guò)前面加shell 可以使用本身終端的功能
shell ls 可以查看當(dāng)前路徑下有那些文件
shell cat 具體文件名缚去,可以像在終端用 cat命令查看文件一樣
image.png
info b #看在哪里打了斷點(diǎn) (查看斷點(diǎn)的情況)

gdb 打了斷點(diǎn)后如何去看變量的信息

print 簡(jiǎn)稱(chēng) p
image.png

也可以打印地址

p &arr[0]

step 步入

step步入 簡(jiǎn)寫(xiě)為s
image.png

設(shè)置日志模式

set logging on #舊
set logging enabled on #新

可以記錄你進(jìn)行了那些gdb調(diào)試
只會(huì)記錄你開(kāi)啟之后的,敲這個(gè)命令前的操作是不會(huì)有記錄的琼开。
并且其針對(duì)的是這次調(diào)試易结,下次調(diào)試需要你再次使用這個(gè)命令。


image.png

并且下次開(kāi)啟是繼續(xù)在gdb.txt中記錄柜候,不會(huì)刪除以前的記錄

watchpoint

wathchpoint和breakpoint是同一級(jí)別的

可以用來(lái)觀察一個(gè)值有沒(méi)有變
監(jiān)控一個(gè)地址下的值

watch *地址
info wathpoint   或 info watchpoints

但我實(shí)操?zèng)]記錄

(gdb) set logging enabled on
Copying output to gdb.txt.
Copying debug output to gdb.txt.
(gdb) list
1       #include <main.h>
2       #include <hello.h>
3
4       using namespace std;
5       int main(){
6           // cout<<"hello"<<endl;
7
8           int arr[4]={1,2,3,4};
9           int i=0;
10          for (i=0;i<4;i++){
(gdb) b 9
Breakpoint 1 at 0x1200: file /home/aaa/workspace/Git_learn/Git_Attempt_001/src/ main.cpp, line 9.
(gdb) r
Starting program: /home/aaa/workspace/Git_learn/Git_Attempt_001/output/Git_Attempt_001 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main () at /home/aaa/workspace/Git_learn/Git_Attempt_001/src/ main.cpp:9
9           int i=0;
(gdb) p &i
$1 = (int *) 0x7fffffffd94c
(gdb) watch *0x7fffffffd94c
Hardware watchpoint 2: *0x7fffffffd94c
(gdb) info watchpoints
Num     Type           Disp Enb Address            What
2       hw watchpoint  keep y                      *0x7fffffffd94c
(gdb) n
10          for (i=0;i<4;i++){
(gdb) n
11              printf("輸出 %d\n",arr[i]);
(gdb) n
輸出 1
10          for (i=0;i<4;i++){
(gdb) n
11              printf("輸出 %d\n",arr[i]);
(gdb) n
輸出 2
10          for (i=0;i<4;i++){
(gdb)

去看i的值 也沒(méi)有提示變化搞动,母雞啊

(gdb) watch i
Hardware watchpoint 2: i
(gdb) info watchpoints
Num     Type           Disp Enb Address            What
2       hw watchpoint  keep y                      i
(gdb) n
10          for (i=0;i<4;i++){
(gdb) n
11              printf("輸出 %d\n",arr[i]);
(gdb) n
輸出 1
10          for (i=0;i<4;i++){
(gdb) n
11              printf("輸出 %d\n",arr[i]);
(gdb) n
輸出 2
10          for (i=0;i<4;i++){
(gdb) 

調(diào)試一個(gè)core文件

Core 文件是系統(tǒng)在程序崩潰時(shí)生成的內(nèi)存轉(zhuǎn)儲(chǔ)文件。它捕獲了程序在崩潰時(shí)的內(nèi)存狀態(tài)渣刷,包括寄存器內(nèi)容鹦肿、堆棧內(nèi)容、活動(dòng)內(nèi)存區(qū)域和其它相關(guān)的調(diào)試信息辅柴。這些文件通常用于調(diào)試狮惜,幫助開(kāi)發(fā)者確定程序崩潰的原因和所在的位置。

這個(gè)調(diào)試錯(cuò)誤文件在linux中不是默認(rèn)有的碌识,要進(jìn)行設(shè)置
在終端中ulimit -a

設(shè)置前.png

可以看到 core file size哪一項(xiàng)為0

    -a  顯示目前資源限制的設(shè)定碾篡。
    -c <core文件上限>  設(shè)定core文件的最大值,單位為區(qū)塊筏餐。
    -d <數(shù)據(jù)節(jié)區(qū)大小>  程序數(shù)據(jù)節(jié)區(qū)的最大值开泽,單位為KB。
    -f <文件大小>  shell所能建立的最大文件魁瞪,單位為區(qū)塊穆律。
    -H  設(shè)定資源的硬性限制惠呼,也就是管理員所設(shè)下的限制。
    -m <內(nèi)存大小>  指定可使用內(nèi)存的上限峦耘,單位為KB剔蹋。
    -n <文件數(shù)目>  指定同一時(shí)間最多可開(kāi)啟的文件數(shù)。
    -p <緩沖區(qū)大小>  指定管道緩沖區(qū)的大小辅髓,單位512字節(jié)泣崩。
    -s <堆疊大小>  指定堆疊的上限,單位為KB洛口。
    -S  設(shè)定資源的彈性限制矫付。
    -t <CPU時(shí)間>  指定CPU使用時(shí)間的上限,單位為秒第焰。
    -u <程序數(shù)目>  用戶最多可開(kāi)啟的程序數(shù)目买优。
    -v <虛擬內(nèi)存大小>  指定可使用的虛擬內(nèi)存上限,單位為KB挺举。

設(shè)置成生成錯(cuò)誤報(bào)告文件

ulimit -c unlimited

然后我這個(gè)Ubuntu 是apport在管理

gdb 正在運(yùn)行的程序

后臺(tái)執(zhí)行

./output/Git_Attempt_001 &

會(huì)返回一個(gè) pid 進(jìn)程號(hào)
也可以

ps -ef | grep Git_Attempt_001 
image.png

然后

gdb -p pid

引用

gdb

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杀赢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖七冲,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敌厘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绊困,“玉大人,你說(shuō)我怎么就攤上這事适刀〕永剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵笔喉,是天一觀的道長(zhǎng)取视。 經(jīng)常有香客問(wèn)我,道長(zhǎng)常挚,這世上最難降的妖魔是什么作谭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮奄毡,結(jié)果婚禮上折欠,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好锐秦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布咪奖。 她就那樣靜靜地躺著,像睡著了一般酱床。 火紅的嫁衣襯著肌膚如雪羊赵。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天扇谣,我揣著相機(jī)與錄音昧捷,去河邊找鬼。 笑死揍堕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的汤纸。 我是一名探鬼主播衩茸,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贮泞!你這毒婦竟也來(lái)了楞慈?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤啃擦,失蹤者是張志新(化名)和其女友劉穎囊蓝,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體令蛉,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡聚霜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了珠叔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝎宇。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖祷安,靈堂內(nèi)的尸體忽然破棺而出姥芥,到底是詐尸還是另有隱情,我是刑警寧澤汇鞭,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布凉唐,位于F島的核電站,受9級(jí)特大地震影響霍骄,放射性物質(zhì)發(fā)生泄漏台囱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一读整、第九天 我趴在偏房一處隱蔽的房頂上張望玄坦。 院中可真熱鬧,春花似錦、人聲如沸煎楣。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)择懂。三九已至喻喳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間困曙,已是汗流浹背表伦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慷丽,地道東北人蹦哼。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像要糊,于是被迫代替她去往敵國(guó)和親纲熏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容