




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Linux與C編程基礎(chǔ)(2),測(cè)試一下您的C語(yǔ)言基本功,思科面試題,用變量a給出下面的定義 a) 一個(gè)整型數(shù)(An integer) b) 一個(gè)指向整型數(shù)的指針(A pointer to an integer) c) 一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)(A pointer to a pointer to an integer) d) 一個(gè)有10個(gè)整型數(shù)的數(shù)組(An array of 10 integers e) 一個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的(An array of 10 pointers to integers),參考答案,答案是: a) int a; /
2、An integer b) int *a; / A pointer to an integer c) int *a; / A pointer to a pointer to an integer d) int a10; / An array of 10 integers e) int *a10; / An array of 10 pointers to integers,思科面試題,f) 一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針(A pointer to an array of 10 integers) g) 一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(A pointer to a fu
3、nction that takes an integer as an argument and returns an integer) h) 一個(gè)有10個(gè)指針的數(shù)組,該指針指向一個(gè)函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)( An array of ten pointers to functions that take an integer argument and return an integer ),參考答案,f) int (*a)10; / A pointer to an array of 10 integers g) int (*a)(int); / A pointer to a f
4、unction a that takes an integer argument and returns an integer h) int (*a10)(int); / An array of 10 pointers to functions that take an integer argument and return an integer,死循環(huán)(Infinite loops),2. 嵌入式系統(tǒng)中經(jīng)常要用到無限循環(huán),你怎么樣用C編寫死循環(huán)呢? 這個(gè)問題用幾個(gè)解決方案。方案是: while(1) 一些程序員更喜歡如下方案: for(;) 您能寫出更簡(jiǎn)潔的嗎?,面試題,更簡(jiǎn)潔是 while
5、(1); for(;) ; 下面語(yǔ)句編譯能通過嗎? int a; while(1); ; for(;) ;,華為面試題,1、語(yǔ)句for( ;1 ;)有什么問題?它是什么意思? 答:和while(1)相同。,華為面試題,2、dowhile和whiledo有什么區(qū)別? 答:前一個(gè)循環(huán)一遍再判斷,后一個(gè)判斷以后再循環(huán),華為面試題,3、請(qǐng)寫出下列代碼的輸出內(nèi)容,#include main() int a,b,c,d; a=10; b=a+; c=+a; d=10*a+; printf(b,c,d:%d,%d,%d,b,c,d); return 0; ,答:10,12,120,華為面試題4:設(shè)有以下語(yǔ)句
6、,說明其定義含義,并回答問題:,typedef union long i; int k5; char c; DATE; struct data int cat; DATE cow; double dog; too; DATE max; 則語(yǔ)句 printf(%d,sizeof(struct date)+sizeof(max);的執(zhí)行結(jié)果是:,華為面試題4:設(shè)有以下語(yǔ)句說明和定義,解釋各自的含義:,答案:DATE是一個(gè)union, 變量公用空間. 里面最大的變量類型是int5, 占用20個(gè)字節(jié). 所以它的大小是20 data是一個(gè)struct, 每個(gè)變量分開占用空間. 依次為int4 + DAT
7、E20 + double8 = 32. 所以結(jié)果是 20 + 32 = 52. 當(dāng)然.在某些16位編輯器下, int可能是2字節(jié),那么結(jié)果是 int2 + DATE10 + double8 = 20,5、請(qǐng)找出下面代碼中的所有點(diǎn)錯(cuò)誤,并給出修改方案 說明:以下代碼是把一個(gè)字符串倒序,如“abcd”倒序后變?yōu)椤癲cba” 1、#includestring.h 2、main() 3、 4、 char* src=hello,world; 5、 char* dest=NULL; 6、 int len=strlen(src); 7、 dest=(char*)malloc(len); 8、 char* d
8、=dest; 9、 char* s=srclen; 10、 while(len-!=0) 11、 d+=s-; 12、 printf(%s,dest); 13、 return 0; 14、,方法1: int main() char* src = hello,world; int len = strlen(src); char* dest = (char*)malloc(len+1);/要為0分配一個(gè)空間 char* d = dest; char* s = ,方法2: #includestring.h #include “stdio.h” main() char str=hello,world;
9、 int len=strlen(str); char t; for(int i=0; i t=stri; stri=strlen-i-1; strlen-i-1=t; printf(%s,str); return 0; ,vim命令學(xué)習(xí)-1,1.欲進(jìn)入vim編輯器(從命令行提示符),請(qǐng)輸入vim 文件名 2.光標(biāo)在屏幕文本中的移動(dòng)既可以用箭頭鍵,也可以使用 hjkl 字母鍵。 h (左移) j (下行) k (上行) l (右移) 3. 欲退出vim編輯器,請(qǐng)輸入以下命令放棄所有修改 :q! 或者輸入以下命令保存所有修改 :wq ,vim命令學(xué)習(xí)-2,4. 在正常模式下刪除光標(biāo)所在位置的字符,
10、請(qǐng)按 x 5. 在正常模式下要在光標(biāo)所在位置開始插入文本,請(qǐng)按 i 輸入必要文本 特別提示按下 鍵會(huì)帶您回到正常模式或者取消一個(gè)不期望或者部分完成的命令,vim命令學(xué)習(xí)-3,1. 欲從當(dāng)前光標(biāo)刪除至單字/單詞末尾,請(qǐng)輸入dw 2. 欲從當(dāng)前光標(biāo)刪除至當(dāng)前行末尾,請(qǐng)輸入d$ 3. 欲刪除整行,請(qǐng)輸入dd,vim命令學(xué)習(xí)-4,4. 在正常模式下一個(gè)命令的格式是 number command object 或者 command number object 其意是 number - 代表的是命令執(zhí)行的次數(shù) command - 代表要做的事情,比如 d 代表刪除.object - 代表要操作的對(duì)象,比如
11、 w 代表單字/單詞,$ 代表到行末等等。$ (to the end of line), etc.,vim命令學(xué)習(xí)-4,dnw:刪除n個(gè)單詞 dne:也可,只是刪除到單詞尾 dnl:向右刪除n個(gè)字母 dnh:向左刪除n個(gè)字母 dnj:向下刪除n行 dnk:向上刪除n行 d$:刪除當(dāng)前光標(biāo)到改行的行尾的字母 dd:刪除一行,vim命令學(xué)習(xí)-4,5. 欲撤消以前的操作,請(qǐng)輸入u (小寫的u) 欲撤消在一行中所做的改動(dòng),請(qǐng)輸入U(xiǎn) (大寫的U) 欲撤消以前的撤消命令,恢復(fù)以前的操作結(jié)果,請(qǐng)輸入CTRL-R,vim命令學(xué)習(xí)-5,粘貼:p,這是粘貼用x或d刪除的文本 復(fù)制: ynw:復(fù)制n個(gè)單詞 yy:復(fù)
12、制一行 ynl:復(fù)制n個(gè)字符 y$:復(fù)制當(dāng)前光標(biāo)至行尾處 nyy:拷貝n行 完了用p粘貼,vim命令學(xué)習(xí)-5,:split:分割一個(gè)窗口 :split file.c :為另一個(gè)文件file.c分隔窗口 :nsplit file.c: 為另一個(gè)文件file.c分隔窗口,并指定其行數(shù) CTRLW在窗口中切換 :close:關(guān)閉當(dāng)前窗口,1.源程序的編譯,在Linux下面,如果要編譯一個(gè)C語(yǔ)言源程序,我們要使用GNU的gcc編譯器. 下面我們 以一個(gè)實(shí)例來說明如何使用gcc編譯器. 假設(shè)我們有下面一個(gè)非常簡(jiǎn)單的源程序(hello.c):,#include int main() printf(Welc
13、ome to Linux Programmingn); return 0; ,1.源程序的編譯,要編譯這個(gè)程序,我們只要在命令行下執(zhí)行: gcc -o hello hello.c gcc 編譯器就會(huì)為我們生成一個(gè)hello的可執(zhí)行文件.執(zhí)行./hello就可以看到程序的輸出 結(jié)果了.,1.源程序的編譯,gcc -o hello hello.c 命令行中 gcc表示我們是用gcc來編譯我們的源程序,-o 選項(xiàng)表示我們要求編譯器給我們輸出的可執(zhí)行文件名為hello 而hello.c是我們的源程序文件. gcc編譯器有許多選項(xiàng),一般來說我們只要知道其中的幾個(gè)就夠了.,1.gcc編譯器選項(xiàng),-o選項(xiàng),
14、表示我們要求輸出的可執(zhí)行文件名. -c選項(xiàng)表示我們只要求編譯器輸出目標(biāo)代碼,而不必要輸出可執(zhí)行文件. -g選項(xiàng)表示我們要求編譯器在編譯的時(shí)候提供我們以后對(duì)程序進(jìn)行調(diào)試的信息.,1.gcc編譯器選項(xiàng),知道了這三個(gè)選項(xiàng),我們就可以編譯我們自己所寫的簡(jiǎn)單的源程序了 如果你想要知道更多的選項(xiàng),可以查看gcc的幫助文檔,那里有著許多對(duì)其它選項(xiàng)的詳細(xì)說明.,2.多源文件的編譯方法,如果有多個(gè)源文件,基本上有兩種編譯方法: 假設(shè)有兩個(gè)源文件為test.c和testfun.c a. 多個(gè)文件一起編譯 用法:#gcc testfun.c test.c -o test 作用:將testfun.c和test.c分別
15、編譯后鏈接成test可執(zhí)行文件。,2.多源文件的編譯方法,b. 分別編譯各個(gè)源文件,之后對(duì)編譯后輸出的目標(biāo)文件鏈接。 用法: #gcc -c testfun.c /將testfun.c編譯成testfun.o #gcc -c test.c /將test.c編譯成test.o #gcc -o testfun.o test.o -o test /將testfun.o和test.o鏈接成test,2.多源文件的編譯方法,以上兩種方法相比較,第一中方法編譯時(shí)需要所有文件重新編譯 而第二種方法可以只重新編譯修改的文件,未修改的文件不用重新編譯。,補(bǔ)充:如何利用gcc編輯”C+”,GCC是個(gè)功能很強(qiáng)大,但
16、精通的掌握它也許需要幾個(gè)月的時(shí)間。 例如:編寫my_class.cpp和my_class.h包含你自己創(chuàng)建的一個(gè)類。寫一個(gè)test.cpp,里面包含main函數(shù)并且調(diào)用my_class。 1、 g+ -c my_class.cpp 2、 g+ -o test test.cpp my_class.o 實(shí)際上對(duì)于C+程序員,只要記住g+命令,記住-c和-o兩個(gè)參數(shù),就可以開始用gcc了。,3.Makefile 的編寫,假設(shè)我們有下面這樣的一個(gè)程序,源代碼如下:,/* main.c */ #include mytool1.h #include mytool2.h int main(int argc,
17、char *argv) mytool1_print(hello); mytool2_print(hello); ,3.Makefile 的編寫,/* mytool1.c */ #include mytool1.h void mytool1_print(char *print_str) printf(This is mytool1 print %sn,print_str); ,/* mytool1.h */ #ifndef _MYTOOL_1_H #define _MYTOOL_1_H void mytool1_print(char *print_str); #endif,/* mytool2.
18、h */ #ifndef _MYTOOL_2_H #define _MYTOOL_2_H void mytool2_print(char *print_str); #endif,/* mytool2.c */ #include mytool2.h void mytool2_print(char *print_str) printf(This is mytool2 print %sn,print_str); ,3.Makefile 的編寫,當(dāng)然由于這個(gè)程序是很短的我們可以這樣來編譯 gcc -c main.c gcc -c mytool1.c gcc -c mytool2.c gcc -o ma
19、in main.o mytool1.o mytool2.o 這樣的話我們也可以產(chǎn)生main程序,而且也不時(shí)很麻煩. 但是如果我們考慮一下 如果有一天我們修改了其中的一個(gè)文件(比如說mytool1.c),那么我們還要重新輸入上面的命令,非常的麻煩!,3.Makefile 的編寫,當(dāng)我們把事情想的更復(fù)雜一點(diǎn),如果我們的程 序有幾百個(gè)源程序的時(shí)候,難道也要編譯器重新一個(gè)一個(gè)的去編譯? 為此,聰明的程序員們想出了一個(gè)很好的工具來做這件事情,這就是make.我們只要執(zhí)行以 下make,就可以把上面的問題解決掉.在我們執(zhí)行make之前,我們要先編寫一個(gè)非常重要的 文件.-Makefile.,3.Makef
20、ile 的編寫,.在我們執(zhí)行make之前,我們要先編寫一個(gè)非常重要的文件.-Makefile.對(duì)于上面的那個(gè)程序來說,可能的一個(gè)Makefile的文件是:,# 注釋行,這是上面那個(gè)程序的Makefile文件 main:main.o mytool1.o mytool2.o gcc -o main main.o mytool1.o mytool2.o main.o:main.c mytool1.h mytool2.h gcc -c main.c mytool1.o:mytool1.c mytool1.h gcc -c mytool1.c mytool2.o:mytool2.c mytool2.h
21、gcc -c mytool2.c,3.Makefile 的編寫,有了這個(gè)Makefile 文件,不管我們什么時(shí)候修改了源程序當(dāng)中的什么文件,我們只要執(zhí)行make 命令 我們的編譯器都只會(huì)去編譯和我們修改的文件有關(guān)的文件,其它的文件不予理睬,節(jié)省了大量編譯時(shí)間。,3.Makefile 的編寫,下面我們學(xué)習(xí)Makefile是如何編寫的. 在Makefile中#開始的行都是注釋行. Makefile中最重要的是描述文件的依賴關(guān)系的說 明.一般的格式是: target: components TAB rule /第一行表示的是依賴關(guān)系. /第二行是規(guī)則.,3.Makefile 的編寫,比如說我們上面的
22、那個(gè)Makefile文件的第二行 main:main.o mytool1.o mytool2.o 表示我們的目標(biāo)(target)main的依賴對(duì)象(components)是main.o mytool1.o mytool2.o 當(dāng)倚賴的對(duì)象在目標(biāo)修改后修改的話,就要去執(zhí)行規(guī)則一行所指定的命令. 就象我們的上面那個(gè)Makefile第三行所說的一樣要執(zhí)行 gcc -o main main.o mytool1.o mytool2.o 注意規(guī)則一行中的TAB表示那里是一個(gè)TAB鍵,3.Makefile 的編寫,3. Makefile的常用變量,Makefile 有三個(gè)非常有用的變量:$,$,$。其意義為
23、: $:目標(biāo)文件 $:所有的依賴文件 $:第一個(gè)依賴文件 如果使用上面三個(gè)變量,上面那個(gè)Makefile文件可簡(jiǎn)化為:,# 注釋行,這是原來程序的Makefile文件 main:main.o mytool1.o mytool2.o gcc -o main main.o mytool1.o mytool2.o main.o:main.c mytool1.h mytool2.h gcc -c main.c mytool1.o:mytool1.c mytool1.h gcc -c mytool1.c mytool2.o:mytool2.c mytool2.h gcc -c mytool2.c,#這是
24、簡(jiǎn)化后的Makefile main: main.o mytool1.o mytool2.o gcc -o $ $ main.o: main.c mytool1.h mytool2.h gcc -c $ mytool1.o: mytool1.c mytool1.h gcc -c $ mytool2.o: mytool2.c mytool2.h gcc -c $,$:目標(biāo)文件 $:所有的依賴文件 $:第一個(gè)依賴文件,4. Makefile 的缺省規(guī)則,.c.o: gcc -c $ 這個(gè)規(guī)則表示所有的.o文件都是依賴于相應(yīng)的.c文件的,例如mytool.o 依賴于mytool.c。 這樣上面那個(gè)Ma
25、kefile還可以簡(jiǎn)化為:,#這是簡(jiǎn)化后的Makefile main: main.o mytool1.o mytool2.o gcc -o $ $ main.o: main.c mytool1.h mytool2.h gcc -c $ mytool1.o: mytool1.c mytool1.h gcc -c $ mytool2.o: mytool2.c mytool2.h gcc -c $,#這是再一次簡(jiǎn)化后的Makefile main: main.o mytool1.o mytool2.o gcc -o $ $ .c.o: gcc -c $,$:目標(biāo)文件 $:所有的依賴文件 $:第一個(gè)依賴
26、文件,# 注釋行,這是原來程序的Makefile文件 main:main.o mytool1.o mytool2.o gcc -o main main.o mytool1.o mytool2.o main.o:main.c mytool1.h mytool2.h gcc -c main.c mytool1.o:mytool1.c mytool1.h gcc -c mytool1.c mytool2.o:mytool2.c mytool2.h gcc -c mytool2.c,.c.o: gcc -c $ #這個(gè)規(guī)則表示所有的.o文件都是依賴于相應(yīng)的.c文件的,4.程序的調(diào)試,我們編寫的程序不太
27、可能一次性就會(huì)成功的,在我們的程序當(dāng)中,會(huì)出現(xiàn)許許多多我們想不到的錯(cuò)誤,這個(gè)時(shí)候我們就要對(duì)我們的程序進(jìn)行調(diào)試了. 最常用的調(diào)試軟件是gdb. GDB(GNU symbolic debugger)簡(jiǎn)單地說就是一個(gè)調(diào)試工具。它是一個(gè)受通用公共許可證即GPL保護(hù)的自由軟件。 記得要在編譯的時(shí)候加入 -g選項(xiàng).,GDB概述,GDB是GNU開源組織發(fā)布的一個(gè)強(qiáng)大的UNIX下的程序調(diào)試工具?;蛟S,各位比較喜歡那種圖形界面方式的,像VC、BCB等IDE的調(diào)試, 但如果你是在UNIX/Linux平臺(tái)下做軟件,你會(huì)發(fā)現(xiàn)GDB這個(gè)調(diào)試工具有比VC、BCB的圖形化調(diào)試器更強(qiáng)大的功能。所謂“寸有所長(zhǎng),尺有所短”就是這
28、個(gè)道理。,GDB概述,一般來說,GDB主要幫忙你完成下面四個(gè)方面的功能: 1、啟動(dòng)你的程序,可以按照你的自定義的要求隨心所欲的運(yùn)行程序。 2、可讓被調(diào)試的程序在你所指定的調(diào)置的斷點(diǎn)處停住。(斷點(diǎn)可以是條件表達(dá)式) 3、當(dāng)程序被停住時(shí),可以檢查此時(shí)你的程序中所發(fā)生的事。 4、動(dòng)態(tài)的改變你程序的執(zhí)行環(huán)境。,一個(gè)調(diào)試示例,/源程序:tst.c 1 #include 2 3 int func(int n) 4 5 int sum=0,i; 6 for(i=0; i g+ -g hello.cpp -o hello 如果沒有 -g ,將看不見程序的函數(shù)名、變量名,所代替的全是運(yùn)行時(shí)的內(nèi)存地址。 當(dāng)你用
29、-g 把調(diào)試信息加入之后,并成功編譯目標(biāo)代碼以后,讓我們來看看如何用 gdb 來調(diào)試程序。,啟動(dòng) GDB 的方法有以下幾種: 1 、 gdb program 也就是你的執(zhí)行文件,一般在當(dāng)然目錄下。 2 、 gdb core 用 gdb 同時(shí)調(diào)試一個(gè)運(yùn)行程序和 core 文件, core 是程序非法執(zhí)行后 core dump 后產(chǎn)生的文件。 3 、 gdb 如果你的程序是一個(gè)服務(wù)程序,那么你可以指定這個(gè)服務(wù)程序運(yùn)行時(shí)的進(jìn)程 ID 。 gdb 會(huì)自動(dòng) attach 上去,并調(diào)試他。 program 應(yīng)該在 PATH 環(huán)境變量中搜索得到。,gdb 基本命令,gdb 支持很多的命令使你能實(shí)現(xiàn)不同的功能
30、. 這些命令從簡(jiǎn)單的文件裝入到允許檢查所調(diào)用的堆棧內(nèi)容的復(fù)雜命令, 下表列出了在用 gdb 調(diào)試時(shí)會(huì)用到的一些命令. 想了解 gdb 的詳細(xì)使用請(qǐng)參考 gdb 的指南頁(yè).,gdb 基本命令,小技巧,GDB啟動(dòng)后第一次list顯示的是main函數(shù)的上下文6行 可以用 l 行號(hào),可以顯示選定行的上下6行 list可以指定打開位置的:list 1,15 也可以指定要打開的文件:list main.c:10,使用GDB調(diào)試: gdb tst 2 3 int func(int n) 4 5 int sum=0,i; 6 for(i=0; in; i+) 7 8 sum+=i; 9 10 return s
31、um; (gdb) - 直接回車表示,重復(fù)上一次命令 11 12 13 14 main() 15 16 int i; 17 long result = 0; 18 for(i=1; i=100; i+) 19 20 result += i;,(gdb) break 16 - 設(shè)置斷點(diǎn),在源程序第16行處。 Breakpoint 1 at 0 x8048496: file tst.c, line 16. (gdb) break func - 設(shè)置斷點(diǎn),在函數(shù)func()入口處。 Breakpoint 2 at 0 x8048456: file tst.c, line 5. (gdb) info
32、break - 查看斷點(diǎn)信息。 Num Type Disp Enb Address What 1 breakpoint keep y 0 x08048496 in main at tst.c:16 2 breakpoint keep y 0 x08048456 in func at tst.c:5 (gdb) r - 運(yùn)行程序,run命令簡(jiǎn)寫 Starting program: /home/hchen/test/tst Breakpoint 1, main () at tst.c:17 - 在斷點(diǎn)處停住。 17 long result = 0; (gdb) n - 單條語(yǔ)句執(zhí)行,next命令簡(jiǎn)
33、寫。 18 for(i=1; i=100; i+),(gdb) n 20 result += i; (gdb) n 18 for(i=1; i=100; i+) (gdb) n 20 result += i; (gdb) c - 繼續(xù)運(yùn)行程序,continue命令簡(jiǎn)寫。 Continuing. result1-100 = 5050 -程序輸出。 Breakpoint 2, func (n=250) at tst.c:5 5 int sum=0,i; (gdb) n 6 for(i=1; i=n; i+) (gdb) p i - 打印變量i的值,print命令簡(jiǎn)寫。 $1 = 134513808
34、,(gdb) n 8 sum+=i; (gdb) n 6 for(i=1; i=n; i+) (gdb) p sum $2 = 1 (gdb) n 8 sum+=i; (gdb) p i $3 = 2 (gdb) n 6 for(i=1; i=n; i+) (gdb) p sum $4 = 3 (gdb) bt - 查看函數(shù)堆棧。 #0 func (n=250) at tst.c:5 #1 0 x080484e4 in main () at tst.c:24 #2 0 x400409ed in _libc_start_main () from /lib/libc.so.6,(gdb) fini
35、sh ,GDB 的命令概貌 啟動(dòng) gdb 后,就你被帶入 gdb 的調(diào)試環(huán)境中,就可以使用 gdb 的命令開始調(diào)試程序了, gdb 的命令可以使用 help 命令來查看,gdb 中,輸入命令時(shí),可以不用打全命令,只用打命令的前幾個(gè)字符就可以了,當(dāng)然,命令的前幾個(gè)字符應(yīng)該要標(biāo)志著一個(gè)唯一的命令,在 Linux 下,你可以敲擊兩次 TAB 鍵來補(bǔ)齊命令的全稱,如果有重復(fù)的,那么 gdb 會(huì)把其例出來。 示例一:在進(jìn)入函數(shù) func 時(shí),設(shè)置一個(gè)斷點(diǎn)??梢郧萌?break func ,或是直接就是 b func (gdb) b func Breakpoint 1 at 0 x8048458: fil
36、e hello.c, line 10. 示例二:敲入 b 按兩次 TAB 鍵,你會(huì)看到所有 b 打頭的命令: (gdb) b backtrace break bt (gdb),示例三:只記得函數(shù)的前綴,可以這樣: (gdb) b make_ (再按下一次 TAB 鍵,你會(huì)看到 : ) make_a_section_from_file make_environ make_abs_section make_function_type make_blockvector make_pointer_type make_cleanup make_reference_type make_command ma
37、ke_symbol_completion_list (gdb) b make_ GDB 把所有 make 開頭的函數(shù)全部例出來給你查看。 要退出 gdb 時(shí),只用發(fā) quit 或命令簡(jiǎn)稱 q 就行了。,GDB 中運(yùn)行 Linux 的 shell 程序 在 gdb 環(huán)境中,你可以執(zhí)行 Linux的 shell 的命令,使用 gdb 的 shell 命令來完成: shell 調(diào)用 Linux 的 shell 來執(zhí)行 ,環(huán)境變量 SHELL 中定義的 Linux的 shell 將會(huì)被用來執(zhí)行 如果 SHELL 沒有定義,那就使用 Linux的標(biāo)準(zhǔn) shell : /bin/sh 。 (在 Windo
38、ws 中使用 C 或 cmd.exe ) 還有一個(gè) gdb 命令是 make : make 可以在 gdb 中執(zhí)行 make 命令來重新 build 自己的程序。這個(gè)命令等價(jià)于 “ shell make ” 。,gdb 應(yīng)用舉例,下面一個(gè)實(shí)例教你一步步的用 gdb 調(diào)試程序. 被調(diào)試的程序相當(dāng)?shù)暮?jiǎn)單, 但它展示了 gdb 的典型應(yīng)用. 下面列出了將被調(diào)試的程序. 這個(gè)程序被稱為 greeting , 它顯示一個(gè)簡(jiǎn)單的問候, 再用反序?qū)⑺谐?,案例講解:gdb 調(diào)試程序,用一個(gè)實(shí)例教你一步步的用 gdb 調(diào)試程序. 被調(diào)試的程序相當(dāng)?shù)暮?jiǎn)單, 但它展示了 gdb 的典型應(yīng)用. 下面列出了將被調(diào)試
39、的程序. 這個(gè)程序被稱為 greeting , 它顯示一個(gè)簡(jiǎn)單的問候, 再用反序?qū)⑺谐?,#include main () char my_string = hello there; my_print (my_string); my_print2 (my_string); void my_print (char *string) printf (The string is %sn, string); ,void my_print2 (char *string) char *string2; int size, i; size = strlen (string); string2 = (cha
40、r *) malloc (size + 1); for (i = 0; i size; i+) string2size - i = stringi; string2size+1 = 0; printf (The string backward is %sn, string2); ,運(yùn)行結(jié)果,用下面的命令編譯它: gcc -o test test.c 這個(gè)程序執(zhí)行時(shí)顯示如下結(jié)果: The string is hello there The string printed backward is 輸出的第一行是正確的,但第二行打印出的東西并不是我們所期望的. 我們所設(shè)想的輸出應(yīng)該是: The str
41、ing printed backward is ereht olleh,for (i = 0; i size; i+) string2size - i = stringi;,size=11,string,string2,調(diào)試,由于某些原因, my_print2 函數(shù)沒有正常工作. 讓我們用 gdb 看看問題究竟出在哪兒, 先鍵入如下命令: gdb greeting 注意: 記得在編譯 greeting 程序時(shí)把調(diào)試選項(xiàng)打開.,調(diào)試,如果你在輸入命令時(shí)忘了把要調(diào)試的程序作為參數(shù)傳給 gdb , 你可以在 gdb 提示符下用 file 命令來載入它: (gdb) file greeting 這個(gè)命
42、令將載入 greeting 可執(zhí)行文件就象你在 gdb 命令行里裝入它一樣. 這時(shí)你能用 gdb 的 run 命令來運(yùn)行 greeting 了. 當(dāng)它在 gdb 里被運(yùn)行后結(jié)果大約會(huì)象這樣:,調(diào)試,(gdb) run Starting program: /root/greeting The string is hello there The string printed backward is Program exited with code 041,調(diào)試,這個(gè)輸出和在 gdb 外面運(yùn)行的結(jié)果一樣. 問題是, 為什么反序打印沒有工作? 為了找出癥結(jié)所在, 我們可以在 my_print2 函數(shù)的
43、 for 語(yǔ)句后設(shè)一個(gè)斷點(diǎn), 具體的做法是在 gdb 提示符下鍵入 list 命令三次, 列出源代碼: (gdb) list (gdb) list (gdb) list,技巧: 在 gdb 提示符下按回車 健將重復(fù)上一個(gè)命令.,調(diào)試,第一次鍵入 list 命令的輸出如下: 1 #include 2 3 main () 4 5 char my_string = hello there; 6 7 my_print (my_string); 8 my_print2 (my_string); 9 10,調(diào)試,如果按下回車, gdb 將再執(zhí)行一次 list 命令, 給出下列輸出: 11 my_print (char *string) 12 13 printf (The string is %sn, string); 14 15 16 my_print2 (char *string
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二三河南數(shù)學(xué)試卷
- 高二北京數(shù)學(xué)試卷
- 高一金太陽(yáng)湖南數(shù)學(xué)試卷
- 肛門閉鎖護(hù)理課件
- 定州四年級(jí)期中數(shù)學(xué)試卷
- 2025至2030大理石行業(yè)市場(chǎng)深度調(diào)研及發(fā)展趨勢(shì)與投資報(bào)告
- 2025至2030船舶機(jī)電設(shè)備行業(yè)市場(chǎng)深度研究及發(fā)展前景投資可行性分析報(bào)告
- 攀枝花市市直機(jī)關(guān)遴選公務(wù)員考試真題2024
- 關(guān)鍵期中考試數(shù)學(xué)試卷
- 高二金牌考卷數(shù)學(xué)試卷
- 抑郁病診斷證明書
- (約克)機(jī)組熱回收技術(shù)
- 《小學(xué)趣味語(yǔ)文》PPT課件(優(yōu)秀)
- 疫苗及其制備技術(shù)課件
- 世界衛(wèi)生組織-人瘤病毒疫苗:世衛(wèi)組織立場(chǎng)文件2022年5月(英譯中)
- (完整版)常見腫瘤AJCC分期手冊(cè)第八版(中文版)
- 《企業(yè)轉(zhuǎn)型升級(jí)研究》文獻(xiàn)綜述(3000字)
- 人教版PEP初中八年級(jí)下冊(cè)英語(yǔ)全冊(cè)課件
- 幼兒園大班數(shù)學(xué):《認(rèn)識(shí)單雙數(shù)》課件
- 日本文化介紹
- 藥廠MES系統(tǒng)解決方案
評(píng)論
0/150
提交評(píng)論