欧美激情aaaa_伊人久久久大香线蕉综合直播_日韩在线卡一卡二_亚洲成人人体

gdb

功能強(qiáng)大的程序調(diào)試器

補(bǔ)充說(shuō)明

gdb命令 包含在GNU的gcc開(kāi)發(fā)套件中,是功能強(qiáng)大的程序調(diào)試器。GDB中的命令固然很多,但我們只需掌握其中十個(gè)左右的命令,就大致可以完成日常的基本的程序調(diào)試工作。

語(yǔ)法

gdb(選項(xiàng))(參數(shù))

選項(xiàng)

-cd:設(shè)置工作目錄;
-q:安靜模式,不打印介紹信息和版本信息;
-d:添加文件查找路徑;
-x:從指定文件中執(zhí)行GDB指令;
-s:設(shè)置讀取的符號(hào)表文件。

命令 | 解釋 | 示例 --- | --- | --- file <文件名> | 加載被調(diào)試的可執(zhí)行程序文件。
因?yàn)橐话愣荚诒徽{(diào)試程序所在目錄下執(zhí)行GDB,因而文本名不需要帶路徑。 | (gdb) file gdb-sample r | Run的簡(jiǎn)寫(xiě),運(yùn)行被調(diào)試的程序。
如果此前沒(méi)有下過(guò)斷點(diǎn),則執(zhí)行完整個(gè)程序;如果有斷點(diǎn),則程序暫停在第一個(gè)可用斷點(diǎn)處。 | (gdb) r c | Continue的簡(jiǎn)寫(xiě),繼續(xù)執(zhí)行被調(diào)試程序,直至下一個(gè)斷點(diǎn)或程序結(jié)束。 | (gdb) c b <行號(hào)>
b <函數(shù)名稱(chēng)>
b *<函數(shù)名稱(chēng)>
b <代碼地址> d [編號(hào)] | b: Breakpoint的簡(jiǎn)寫(xiě),設(shè)置斷點(diǎn)。兩可以使用“行號(hào)”“函數(shù)名稱(chēng)”“執(zhí)行地址”等方式指定斷點(diǎn)位置。
其中在函數(shù)名稱(chēng)前面加“
”符號(hào)表示將斷點(diǎn)設(shè)置在“由編譯器生成的prolog代碼處”。如果不了解匯編,可以不予理會(huì)此用法。 d: Delete breakpoint的簡(jiǎn)寫(xiě),刪除指定編號(hào)的某個(gè)斷點(diǎn),或刪除所有斷點(diǎn)。斷點(diǎn)編號(hào)從1開(kāi)始遞增。 | (gdb) b 8(gdb) b main
(gdb) b *main
(gdb) b *0x804835c (gdb) d s, n | s: 執(zhí)行一行源程序代碼,如果此行代碼中有函數(shù)調(diào)用,則進(jìn)入該函數(shù);
n: 執(zhí)行一行源程序代碼,此行代碼中的函數(shù)調(diào)用也一并執(zhí)行。 s 相當(dāng)于其它調(diào)試器中的“Step Into (單步跟蹤進(jìn)入)”;
n 相當(dāng)于其它調(diào)試器中的“Step Over (單步跟蹤)”。 這兩個(gè)命令必須在有源代碼調(diào)試信息的情況下才可以使用(GCC編譯時(shí)使用“-g”參數(shù))。 | (gdb) s
(gdb) n si, ni | si命令類(lèi)似于s命令,ni命令類(lèi)似于n命令。所不同的是,這兩個(gè)命令(si/ni)所針對(duì)的是匯編指令,而s/n針對(duì)的是源代碼。 | (gdb) si
(gdb) ni p <變量名稱(chēng)> | Print的簡(jiǎn)寫(xiě),顯示指定變量(臨時(shí)變量或全局變量)的值。 | (gdb) p i
(gdb) p nGlobalVar display ... undisplay <編號(hào)> | display,設(shè)置程序中斷后欲顯示的數(shù)據(jù)及其格式。
例如,如果希望每次程序中斷后可以看到即將被執(zhí)行的下一條匯編指令,可以使用命令
“display /i $pc”
其中 $pc 代表當(dāng)前匯編指令,/i 表示以十六進(jìn)行顯示。當(dāng)需要關(guān)心匯編代碼時(shí),此命令相當(dāng)有用。 undispaly,取消先前的display設(shè)置,編號(hào)從1開(kāi)始遞增。 | (gdb) display /i $pc (gdb) undisplay 1 i | info的簡(jiǎn)寫(xiě),用于顯示各類(lèi)信息,詳情請(qǐng)查閱“help i”。 | (gdb) i r q | Quit的簡(jiǎn)寫(xiě),退出GDB調(diào)試環(huán)境。 | (gdb) q help [命令名稱(chēng)] | GDB幫助命令,提供對(duì)GDB名種命令的解釋說(shuō)明。
如果指定了“命令名稱(chēng)”參數(shù),則顯示該命令的詳細(xì)說(shuō)明;如果沒(méi)有指定參數(shù),則分類(lèi)顯示所有GDB命令,供用戶(hù)進(jìn)一步瀏覽和查詢(xún)。 | (gdb) help

參數(shù)

文件:二進(jìn)制可執(zhí)行程序。

實(shí)例

以下是linux下dgb調(diào)試的一個(gè)實(shí)例,先給出一個(gè)示例用的小程序,C語(yǔ)言代碼:

#include <stdio.h>
int nGlobalVar = 0;

int tempFunction(int a, int b)
{
    printf("tempFunction is called, a = %d, b = %d /n", a, b);
    return (a + b);
}

int main()
{
    int n;
        n = 1;
        n++;
        n--;

        nGlobalVar += 100;
        nGlobalVar -= 12;

    printf("n = %d, nGlobalVar = %d /n", n, nGlobalVar);

        n = tempFunction(1, 2);
    printf("n = %d", n);

    return 0;
}

請(qǐng)將此代碼復(fù)制出來(lái)并保存到文件 gdb-sample.c 中,然后切換到此文件所在目錄,用GCC編譯之:

gcc gdb-sample.c -o gdb-sample -g

在上面的命令行中,使用 -o 參數(shù)指定了編譯生成的可執(zhí)行文件名為 gdb-sample,使用參數(shù) -g 表示將源代碼信息編譯到可執(zhí)行文件中。如果不使用參數(shù) -g,會(huì)給后面的GDB調(diào)試造成不便。當(dāng)然,如果我們沒(méi)有程序的源代碼,自然也無(wú)從使用 -g 參數(shù),調(diào)試/跟蹤時(shí)也只能是匯編代碼級(jí)別的調(diào)試/跟蹤。

下面“gdb”命令啟動(dòng)GDB,將首先顯示GDB說(shuō)明,不管它:

GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu".
(gdb)

上面最后一行“(gdb)”為GDB內(nèi)部命令引導(dǎo)符,等待用戶(hù)輸入GDB命令。

下面使用“file”命令載入被調(diào)試程序 gdb-sample(這里的 gdb-sample 即前面 GCC 編譯輸出的可執(zhí)行文件):

(gdb) file gdb-sample
Reading symbols from gdb-sample...done.

上面最后一行提示已經(jīng)加載成功。

下面使用“r”命令執(zhí)行(Run)被調(diào)試文件,因?yàn)樯形丛O(shè)置任何斷點(diǎn),將直接執(zhí)行到程序結(jié)束:

(gdb) r
Starting program: /home/liigo/temp/test_jmp/test_jmp/gdb-sample
n = 1, nGlobalVar = 88
tempFunction is called, a = 1, b = 2
n = 3
Program exited normally.

下面使用“b”命令在 main 函數(shù)開(kāi)頭設(shè)置一個(gè)斷點(diǎn)(Breakpoint):

(gdb) b main
Breakpoint 1 at 0x804835c: file gdb-sample.c, line 19.

上面最后一行提示已經(jīng)成功設(shè)置斷點(diǎn),并給出了該斷點(diǎn)信息:在源文件 gdb-sample.c 第19行處設(shè)置斷點(diǎn);這是本程序的第一個(gè)斷點(diǎn)(序號(hào)為1);斷點(diǎn)處的代碼地址為 0x804835c(此值可能僅在本次調(diào)試過(guò)程中有效)。回過(guò)頭去看源代碼,第19行中的代碼為“n = 1”,恰好是 main 函數(shù)中的第一個(gè)可執(zhí)行語(yǔ)句(前面的“int n;”為變量定義語(yǔ)句,并非可執(zhí)行語(yǔ)句)。

再次使用“r”命令執(zhí)行(Run)被調(diào)試程序:

(gdb) r
Starting program: /home/liigo/temp/gdb-sample

Breakpoint 1, main () at gdb-sample.c:19
19 n = 1;

程序中斷在gdb-sample.c第19行處,即main函數(shù)是第一個(gè)可執(zhí)行語(yǔ)句處。

上面最后一行信息為:下一條將要執(zhí)行的源代碼為“n = 1;”,它是源代碼文件gdb-sample.c中的第19行。

下面使用“s”命令(Step)執(zhí)行下一行代碼(即第19行“n = 1;”):

(gdb) s
20 n++;

上面的信息表示已經(jīng)執(zhí)行完“n = 1;”,并顯示下一條要執(zhí)行的代碼為第20行的“n++;”。

既然已經(jīng)執(zhí)行了“n = 1;”,即給變量 n 賦值為 1,那我們用“p”命令(Print)看一下變量 n 的值是不是 1 :

(gdb) p n
$1 = 1

果然是 1。($1大致是表示這是第一次使用“p”命令——再次執(zhí)行“p n”將顯示“$2 = 1”——此信息應(yīng)該沒(méi)有什么用處。)

下面我們分別在第26行、tempFunction 函數(shù)開(kāi)頭各設(shè)置一個(gè)斷點(diǎn)(分別使用命令“b 26”“b tempFunction”):

(gdb) b 26
Breakpoint 2 at 0x804837b: file gdb-sample.c, line 26.
(gdb) b tempFunction
Breakpoint 3 at 0x804832e: file gdb-sample.c, line 12.

使用“c”命令繼續(xù)(Continue)執(zhí)行被調(diào)試程序,程序?qū)⒅袛嘣诘诙?個(gè)斷點(diǎn)(26行),此時(shí)全局變量 nGlobalVar 的值應(yīng)該是 88;再一次執(zhí)行“c”命令,程序?qū)⒅袛嘤诘谌齻€(gè)斷點(diǎn)(12行,tempFunction 函數(shù)開(kāi)頭處),此時(shí)tempFunction 函數(shù)的兩個(gè)參數(shù) a、b 的值應(yīng)分別是 1 和 2:

(gdb) c
Continuing.

Breakpoint 2, main () at gdb-sample.c:26
26 printf("n = %d, nGlobalVar = %d /n", n, nGlobalVar);
(gdb) p nGlobalVar
$2 = 88
(gdb) c
Continuing.
n = 1, nGlobalVar = 88

Breakpoint 3, tempFunction (a=1, b=2) at gdb-sample.c:12
12 printf("tempFunction is called, a = %d, b = %d /n", a, b);
(gdb) p a
$3 = 1
(gdb) p b
$4 = 2

上面反饋的信息一切都在我們預(yù)料之中~~

再一次執(zhí)行“c”命令(Continue),因?yàn)楹竺嬖僖矝](méi)有其它斷點(diǎn),程序?qū)⒁恢眻?zhí)行到結(jié)束:

(gdb) c
Continuing.
tempFunction is called, a = 1, b = 2
n = 3
Program exited normally.

有時(shí)候需要看到編譯器生成的匯編代碼,以進(jìn)行匯編級(jí)的調(diào)試或跟蹤,又該如何操作呢?

這就要用到display命令“display /i $pc”了(此命令前面已有詳細(xì)解釋?zhuān)?/p>

(gdb) display /i $pc
(gdb)

此后程序再中斷時(shí),就可以顯示出匯編代碼了:

(gdb) r
Starting program: /home/liigo/temp/test_jmp/test_jmp/gdb-sample

Breakpoint 1, main () at gdb-sample.c:19
19 n = 1;
1: x/i $pc 0x804835c <main+16>: movl $0x1,0xfffffffc(%ebp)

看到了匯編代碼,“n = 1;”對(duì)應(yīng)的匯編代碼是“movl $0x1,0xfffffffc(%ebp)”。

并且以后程序每次中斷都將顯示下一條匯編指定(“si”命令用于執(zhí)行一條匯編代碼——區(qū)別于“s”執(zhí)行一行C代碼):

(gdb) si
20 n++;
1: x/i $pc 0x8048363 <main+23>: lea 0xfffffffc(%ebp),%eax
(gdb) si
0x08048366 20 n++;
1: x/i $pc 0x8048366 <main+26>: incl (%eax)
(gdb) si
21 n--;
1: x/i $pc 0x8048368 <main+28>: lea 0xfffffffc(%ebp),%eax
(gdb) si
0x0804836b 21 n--;
1: x/i $pc 0x804836b <main+31>: decl (%eax)
(gdb) si
23 nGlobalVar += 100;
1: x/i $pc 0x804836d <main+33>: addl $0x64,0x80494fc

接下來(lái)我們?cè)囈幌旅睢癰 *<函數(shù)名稱(chēng)>”。

為了更簡(jiǎn)明,有必要先刪除目前所有斷點(diǎn)(使用“d”命令——Delete breakpoint):

(gdb) d
Delete all breakpoints? (y or n) y
(gdb)

當(dāng)被詢(xún)問(wèn)是否刪除所有斷點(diǎn)時(shí),輸入“y”并按回車(chē)鍵即可。

下面使用命令“b *main”在 main 函數(shù)的 prolog 代碼處設(shè)置斷點(diǎn)(prolog、epilog,分別表示編譯器在每個(gè)函數(shù)的開(kāi)頭和結(jié)尾自行插入的代碼):

(gdb) b *main
Breakpoint 4 at 0x804834c: file gdb-sample.c, line 17.
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/liigo/temp/test_jmp/test_jmp/gdb-sample

Breakpoint 4, main () at gdb-sample.c:17
17 {
1: x/i $pc 0x804834c <main>: push %ebp
(gdb) si
0x0804834d 17 {
1: x/i $pc 0x804834d <main+1>: mov %esp,%ebp
(gdb) si
0x0804834f in main () at gdb-sample.c:17
17 {
1: x/i $pc 0x804834f <main+3>: sub $0x8,%esp
(gdb) si
0x08048352 17 {
1: x/i $pc 0x8048352 <main+6>: and $0xfffffff0,%esp
(gdb) si
0x08048355 17 {
1: x/i $pc 0x8048355 <main+9>: mov $0x0,%eax
(gdb) si
0x0804835a 17 {
1: x/i $pc 0x804835a <main+14>: sub %eax,%esp
(gdb) si
19 n = 1;
1: x/i $pc 0x804835c <main+16>: movl $0x1,0xfffffffc(%ebp)

此時(shí)可以使用“i r”命令顯示寄存器中的當(dāng)前值———“i r”即“Infomation Register”:

(gdb) i r
eax 0xbffff6a4 -1073744220
ecx 0x42015554 1107383636
edx 0x40016bc8 1073834952
ebx 0x42130a14 1108544020
esp 0xbffff6a0 0xbffff6a0
ebp 0xbffff6a8 0xbffff6a8
esi 0x40015360 1073828704
edi 0x80483f0 134513648
eip 0x8048366 0x8048366
eflags 0x386 902
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x33 51

當(dāng)然也可以顯示任意一個(gè)指定的寄存器值:

(gdb) i r eax
eax 0xbffff6a4 -1073744220

最后一個(gè)要介紹的命令是“q”,退出(Quit)GDB調(diào)試環(huán)境:

(gdb) q
The program is running. exit anyway? (y or n)

補(bǔ)充內(nèi)容

gdb 教程:慕課網(wǎng)-Linux C語(yǔ)言指針與內(nèi)存-第三章

如果刪除源代碼, 就無(wú)法顯示行號(hào)等輔助信息了

gcc -g gdb.c -o gdb.out # -g 支持gdb調(diào)試; -o 輸出, 默認(rèn)為 a.out

gdb gdb.out # 進(jìn)入 gdb 調(diào)試環(huán)境
enter # 繼續(xù)執(zhí)行上條命令
l # 列出源代碼, 默認(rèn) 10 行, 按 l 繼續(xù)

start # 開(kāi)始單步調(diào)試, 默認(rèn) main() 第一行
p a # 查看 a 變量的值
n # 繼續(xù)到下一行
s # 進(jìn)入子函數(shù)
bt # 查看函數(shù)棧
f 1 # 切換函數(shù)棧

q 退出調(diào)試

測(cè)試用代碼

#include <stdio.h>

void change(int a, int b){
    int tmp=a;
    a=b; b=tmp;
}

void change2(int *a, int *b){
    int tmp=*a;
    *a=*b; *b=tmp;
}

int main(){
    int a=5,b=3;
    change(a,b);
    printf("change:\na=%d\nb=%d\n", a,b);
    change2(&a,&b);
    printf("change2:\na=%d\nb=%d\n", a,b);
}
欧美激情aaaa_伊人久久久大香线蕉综合直播_日韩在线卡一卡二_亚洲成人人体
成人性生交大片| 亚洲乱码国产乱码精品精的特点| 不卡电影免费在线播放一区| 欧美日韩一区二区三区视频| 国产精品麻豆一区二区 | 免费人成在线不卡| 欧美网站一区二区| 亚洲欧美视频一区| 97se亚洲国产综合自在线不卡| 久久先锋资源网| 加勒比av一区二区| 日韩免费观看高清完整版| 亚洲成人av电影| 欧美三级日韩在线| 蜜桃视频一区二区| 精品国产一区二区精华| 国产曰批免费观看久久久| 久久综合九色综合97_久久久| 国内精品久久久久影院色| 精品久久久久久综合日本欧美| 久久国产精品99久久人人澡| 精品国产伦理网| 国产精品一区在线观看你懂的| xfplay精品久久| 成人丝袜18视频在线观看| 中文字幕综合网| 欧美日韩国产123区| 奇米在线7777在线精品| 久久夜色精品国产噜噜av| jlzzjlzz亚洲日本少妇| 亚洲第一二三四区| 欧美一区二区观看视频| 国产馆精品极品| 亚洲免费色视频| 日韩一级欧美一级| 老色鬼精品视频在线观看播放| 久久久久久久久久久久久女国产乱 | 中文字幕一区二区三区乱码在线| 99精品黄色片免费大全| 中文字幕欧美一区| 欧美日韩久久一区二区| 日韩 欧美一区二区三区| 日韩欧美国产成人一区二区| 国产精品一区二区在线观看网站| 欧美韩国一区二区| 在线精品视频免费播放| 免费的国产精品| 2022国产精品视频| 欧美在线免费视屏| 美女看a上一区| 亚洲天堂精品在线观看| 欧美日韩国产美| 国产99久久久久久免费看农村| 亚洲女人****多毛耸耸8| 欧美日韩国产高清一区二区三区| 国内成人免费视频| 亚洲人精品午夜| 欧美变态tickling挠脚心| 国产成人av网站| 亚洲欧美影音先锋| 精品国产伦一区二区三区免费 | 久久综合久久99| 欧洲生活片亚洲生活在线观看| 免费在线看一区| 亚洲一二三区不卡| 国产亚洲精品aa午夜观看| 欧美日韩亚洲综合一区| 国产成人午夜精品5599| 丝袜美腿亚洲综合| 一区二区三区欧美| 久久久亚洲综合| 欧美tickle裸体挠脚心vk| 91在线观看地址| 国产福利一区在线观看| 视频一区二区欧美| 亚洲欧美在线高清| 久久综合久久99| 精品剧情在线观看| 日韩欧美在线影院| 色狠狠桃花综合| 色婷婷av久久久久久久| 成人视屏免费看| 国产精品亚洲专一区二区三区 | 91网上在线视频| 国产河南妇女毛片精品久久久| 午夜精品久久久久久久久久久| 亚洲一区二区偷拍精品| 欧美激情一区三区| 久久精品视频一区二区三区| 欧美精品久久99久久在免费线| 91老师片黄在线观看| 91论坛在线播放| 国产suv精品一区二区883| 狠狠色综合色综合网络| 久久精品国产精品亚洲精品| 三级一区在线视频先锋| 蜜臀av一区二区在线免费观看| 亚洲综合激情小说| 亚洲欧美日韩综合aⅴ视频| 国产精品久久久久久久久免费樱桃 | 欧美性三三影院| 91久久线看在观草草青青| 精品视频1区2区| 色www精品视频在线观看| 欧美日韩另类一区| 91精品综合久久久久久| 欧美精品一区二区三区在线播放| 9191久久久久久久久久久| 欧美一区午夜精品| 精品久久免费看| 国产精品美女视频| 亚洲精品乱码久久久久久久久| 香蕉加勒比综合久久| 国内精品国产成人| 国产成人在线观看| 欧美视频精品在线观看| 精品奇米国产一区二区三区| 国产精品沙发午睡系列990531| 亚洲最大成人网4388xx| 视频一区在线视频| 成人一级视频在线观看| 欧美色爱综合网| 欧美激情一区二区三区在线| 亚洲va在线va天堂| 国产精品一区在线观看乱码| 91高清视频免费看| 日本一区二区视频在线| 性感美女久久精品| 波多野结衣中文字幕一区| 91精品国产福利| 一区免费观看视频| 精品一区二区三区在线观看| 欧美午夜不卡在线观看免费| 久久久99精品免费观看不卡| 亚洲成av人片在www色猫咪| 丰满岳乱妇一区二区三区| 69久久夜色精品国产69蝌蚪网 | 日韩综合小视频| 一本大道久久a久久综合| 久久久久久久久99精品| 亚洲第一av色| 91视频精品在这里| 欧美大胆人体bbbb| 午夜影院久久久| 色狠狠一区二区三区香蕉| 久久久国产精品午夜一区ai换脸| 午夜精品久久久久久| 色综合久久天天综合网| 日韩精品一区国产麻豆| 国产精品色眯眯| 国产一区二区三区黄视频| 欧美一区二区三区日韩| 亚洲国产欧美日韩另类综合| 色综合久久综合网欧美综合网| 久久亚洲影视婷婷| 久久av中文字幕片| 精品国产91九色蝌蚪| 日韩精品成人一区二区三区| 在线观看网站黄不卡| 玉足女爽爽91| 色综合天天综合网天天狠天天 | 成年人国产精品| 国产精品午夜久久| 成人动漫视频在线| 国产精品国产三级国产aⅴ无密码| 国产不卡视频在线播放| 精品国产凹凸成av人导航| 麻豆精品新av中文字幕| 精品剧情在线观看| 九九九久久久精品| 国产亚洲精品7777| av中文字幕不卡| 亚洲免费电影在线| 欧美人与z0zoxxxx视频| 日本成人在线一区| 精品av久久707| 国产成人av影院| 亚洲欧美激情视频在线观看一区二区三区| 97久久人人超碰| 亚洲一区二区高清| 亚洲在线观看免费| 蜜桃视频在线观看一区二区| 日韩美女天天操| 懂色av一区二区三区免费看| 成人欧美一区二区三区白人| 欧洲另类一二三四区| 美国av一区二区| 中文字幕第一区| 欧美精品v国产精品v日韩精品 | 国产视频一区不卡| 一本一道波多野结衣一区二区| 亚洲成a人片在线不卡一二三区 | 免费美女久久99| 国产精品天美传媒沈樵| 91片在线免费观看| 免费在线视频一区| 中文字幕亚洲欧美在线不卡| 欧美精品1区2区| 国产ts人妖一区二区| 亚洲宅男天堂在线观看无病毒|