網(wǎng)站建設(shè)_免費(fèi)視頻武漢剛剛突然宣布
很早就想在好好學(xué)一學(xué)gdb了,正好最近學(xué)算法(以前一直以為干硬件不需要什么特別厲害的算法,結(jié)果現(xiàn)在卷起來了。大廠面試題也有復(fù)雜一些的算法了)
下面的這些命令是別的博主總結(jié)的
GDB 調(diào)試過程_gdb調(diào)試過程_麷飛花的博客-CSDN博客
工具書
GDB
1.gdb
? ? ? ? 啟動(dòng)gdb
2.gdb -tui
? ? ? ? 啟動(dòng)gdb,并且分屏顯示源代碼
3.gdb app
? ? ? ? 啟動(dòng)gdb調(diào)試指定程序app
4.gdb <program> <PID>
? ? ? ? 啟動(dòng)程序之后,再用gdb調(diào)試
5.gdb <PID>?
? ? ? ? 啟動(dòng)程序之后,再啟動(dòng)gdb調(diào)試
6.**啟動(dòng)gdb之后的交互命令
? file app
? ? ? ? 載入指定的程序
7.set args <var>
? ? ? ? 修改發(fā)送給程序的參數(shù)
Iist?
<linenum> ? ? ? ? ? 行號。?
<+offset> ? ? ? ? ? 當(dāng)前行號的正偏移量。?
<-offset> ? ? ? ? ? 當(dāng)前行號的負(fù)偏移量。?
<filename:linenum> ?哪個(gè)文件的哪一行。?
<function> ? ? ? ? ?函數(shù)名。?
<filename:function> 哪個(gè)文件中的哪個(gè)函數(shù)。?
<*address> ? ? ? ? ?程序運(yùn)行時(shí)的語句在內(nèi)存中的地址。 ?
?
set listsize <count>
設(shè)置一次顯示源代碼的行數(shù)。
?
show listsize
查看當(dāng)前l(fā)istsize的設(shè)置。?
break?
<number> ? ? ? ? ?當(dāng)前的文件中某一行(假設(shè)為6)設(shè)定斷點(diǎn)。
<number if conf> ?如果conf成立,就在number行處斷點(diǎn)。
<func> ? ? ? ? ? ?當(dāng)前的文件中為某一函數(shù)(假設(shè)為func)處設(shè)定斷點(diǎn)。
<fileName:N> ? ? ?給指定文件(fileName)的某個(gè)行(N)處設(shè)置斷點(diǎn):?
?
enable/ena ? ? ? ?N:啟用斷點(diǎn)
disable/dis ? ? ? N:禁用斷點(diǎn)
?
顯示當(dāng)前gdb斷點(diǎn)信息
? ? ? ? ? ? ? ? ? info breakpoints
? ? ? ? ? ? ? ? ? i breakpoints
? ? ? ? ? ? ? ? ? i b?
?print/p
1.print var
? ? ? ? print顯示變量(var)值
2.print /x var
? ? ? ? 用16進(jìn)制顯示(var)值
?
? ? x ?按十六進(jìn)制格式顯示變量。?
? ? d ?按十進(jìn)制格式顯示變量。?
? ? u ?按十六進(jìn)制格式顯示無符號整型。?
? ? o ?按八進(jìn)制格式顯示變量。?
? ? t ?按二進(jìn)制格式顯示變量。?
? ? a ?按十六進(jìn)制格式顯示變量。?
? ? c ?按字符格式顯示變量。?
? ? f ?按浮點(diǎn)數(shù)格式顯示變量。
?
3.print *a@10
? ? ? ?a是一個(gè)數(shù)組,10個(gè)元素
4.print x=4
? ? ? ?修改運(yùn)行時(shí)候的變量值
其它
1.finish
? ? ? ? 執(zhí)行完當(dāng)前函數(shù)返回到調(diào)用它的函數(shù) ???
2.until/u
? ? ? ? 指定程序直到退出當(dāng)前循環(huán)體?
3.jump 5
? ? ? ? 跳轉(zhuǎn)執(zhí)行程序到第5行
4.return
? ? ? ? 強(qiáng)制返回當(dāng)前函數(shù)
5.call <expr>?
? ? ? ? 強(qiáng)制調(diào)用函數(shù):?
? print <expr>?
?? ??? ?強(qiáng)制調(diào)用函數(shù)2:
【如果函數(shù)的返回值是void那么call不會(huì)打印返回值,但是print還是會(huì)打印出函數(shù)的返回值并且存放到歷史記錄中。】?
6.kill
? ? ? ? 終止一個(gè)正在調(diào)試的程序
?
7.display:追蹤查看具體變量值
? undisplay:取消追蹤觀察變量
?
8.
? watch:被設(shè)置觀察點(diǎn)的變量發(fā)生修改時(shí),打印顯示
? i watch:顯示觀察點(diǎn)?
layout
layout:用于分割窗口,可以一邊查看代碼,一邊測試。主要有以下幾種用法:
layout src:顯示源代碼窗口
layout asm:顯示匯編窗口
layout regs:顯示源代碼/匯編和寄存器窗口
layout split:顯示源代碼和匯編窗口
layout next:顯示下一個(gè)layout
layout prev:顯示上一個(gè)layout
?
Ctrl + L:刷新窗口
Ctrl + x,再按1:單窗口模式,顯示一個(gè)窗口
Ctrl + x,再按2:雙窗口模式,顯示兩個(gè)窗口
Ctrl + x,再按a:回到傳統(tǒng)模式,即退出layout,回到執(zhí)行l(wèi)ayout之前的調(diào)試窗口。?
多線程調(diào)試
(1)查看可切換調(diào)試的線程:info threads
?
(2)切換調(diào)試的線程:thread 線程id
?
(3)只運(yùn)行當(dāng)前線程:set scheduler-locking on
?
(4)運(yùn)行全部的線程:set scheduler-locking off
?
(5)指定某線程執(zhí)行某gdb命令:thread apply 線程id gdb_cmd
?
(6)全部的線程執(zhí)行某gdb命令:thread apply all gdb_cmd?
例程一
#include <stdio.h>
#include <stdlib.h>int flag = 0;typedef struct node{int data;struct node *next;
}list,*link;
void pp(int num)
{if(flag == 1){switch(num){case 0:printf("\nError%d: Failed to malloc!\n",num);break;default:printf("\nError: unknown error!\n");}}
}link create()
{link ll;if((ll = (link)malloc(sizeof(link))) == NULL){pp(0);return NULL;}ll->data = 0;ll->next = NULL;return ll;
}void l_free(link ll)
{link p;while(ll){p = ll;ll = ll->next;printf("free:%d\n",p->data);p->next = NULL;free(p);p = NULL;}
}void l_show(link ll)
{link p;p = ll;while(p){printf("%d",p->data);p = p->next;}
}int l_in(link ll)
{int *p,*p1;link q;link s;q = ll;printf("input>>> ");scanf("%d",p);getchar();p1 = p;while(p){if((s = (link)malloc(sizeof(link))) == NULL){pp(0);return -1;}s->data = *p1;q->next = s;s->next = NULL;p1++;q = q->next;}l_show(ll);return 0;
}int main()
{link ll;ll = create();l_in(ll);l_free(ll);return 0;
}
在編譯文件的時(shí)候加入 -g就能進(jìn)行程序調(diào)試
我記得exit也能退出的不知道為什么不行了
反正quit/q都是可以退出的,查了一下好像是版本問題,我的ubuntu18.04好像是不行
?那個(gè)tui沒整好不過無所謂,工具是為了方便大家使用的,而不是來扭曲我們的思想和習(xí)慣。
用他好用的地方就好了,其實(shí)我以前一直很喜歡打印來找錯(cuò)誤,這是驅(qū)動(dòng)的習(xí)慣,因?yàn)轵?qū)動(dòng)不用gdb,但是驅(qū)動(dòng)的實(shí)習(xí)找不到啊,只好學(xué)學(xué)軟件開發(fā)的東西先找個(gè)軟件實(shí)習(xí)了。
加個(gè)斷點(diǎn)
?
?這次就沒有溢出了,因?yàn)樵谳斎脒@里停了。
?C繼續(xù)執(zhí)行,很好又溢出了
n單步執(zhí)行,問題出現(xiàn)了,就是輸入的時(shí)候就G了。
回車也是單步執(zhí)行
可以tab補(bǔ)全還可以看之前的命令
當(dāng)運(yùn)行到函數(shù)的時(shí)候要按step進(jìn)入函數(shù)內(nèi)單步執(zhí)行
不然n就是直接執(zhí)行完這個(gè)函數(shù)
l可以查看后面幾行程序,
p可以查看變量和函數(shù)的地址或值
info是查詢,可以簡寫成i
i b
可以查詢斷點(diǎn)
?i reg
查詢寄存器
i r也可以
delete刪除全部斷點(diǎn)也可以指定刪除
簡寫為d