国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 學(xué)習(xí)筆記 > gcc編譯及gdb調(diào)試命令詳解

gcc編譯及gdb調(diào)試命令詳解 時(shí)間:2018-08-10      來(lái)源:未知

gcc和gdb

【1】GNU工具

編譯工具:把一個(gè)源程序編譯為一個(gè)可執(zhí)行程序

調(diào)試工具:能對(duì)執(zhí)行程序進(jìn)行源碼或匯編級(jí)調(diào)試

軟件工程工具:用于協(xié)助多人開發(fā)或大型軟件項(xiàng)目的管理,如make【2】gcc簡(jiǎn)介

全稱為GNU CC ,GNU項(xiàng)目中符合ANSI C標(biāo)準(zhǔn)的編譯系統(tǒng)

【3】gcc編譯過(guò)程

1--- 預(yù)處理:主要進(jìn)行宏替換以及頭文件的包含展開

gcc -E HelloWorld.c -o HelloWorld.i

2--- 編譯:編譯生成匯編文件,會(huì)檢查語(yǔ)法是否有錯(cuò)誤

gcc -S HelloWorld.i -o HelloWorld.s

3--- 匯編:將匯編文件編譯生成目標(biāo)文件(二進(jìn)制文件)

gcc -c HelloWorld.s -o HelloWorld.o

4--- 鏈接:鏈接庫(kù)函數(shù),生成可執(zhí)行文件

gcc HelloWorld.o -o HelloWorld

【4】Gdb調(diào)試

首先使用gcc對(duì)file.c進(jìn)行編譯,注意一定要加上選項(xiàng)‘-g’

查看文件(list)

(gdb) l

一次十行,知道顯示完為止

l 1 回到先前的位置

設(shè)置斷點(diǎn) (break)

(gdb) b 行數(shù)

刪除斷點(diǎn) (delete)

del 1刪除第一個(gè)斷點(diǎn)

查看斷點(diǎn)情況

(gdb) info b

查看變量值(print) 也可以查看變量的地址 p &a

(gdb) p n

單步運(yùn)行 (next step)

(gdb) n

(gdb) s 進(jìn)入函數(shù)

恢復(fù)程序運(yùn)行 (continue)

(gdb) c

幫助

(gdb) help [command]

退出

q

gdb使用時(shí)注意事項(xiàng)

在gcc編譯選項(xiàng)中一定要加入‘-g’。

只有在代碼處于“運(yùn)行”或“暫停”狀態(tài)時(shí)才能查看變量值。

設(shè)置斷點(diǎn)后程序在指定行之前停止

運(yùn)行被調(diào)試程序,設(shè)置所有的能影響該程序的參數(shù)和變量。

保證被調(diào)試程序在指定的條件下停止運(yùn)行。

當(dāng)被調(diào)試程序停止時(shí),讓開發(fā)工程師檢查發(fā)生了什么。

根據(jù)每次調(diào)試器的提示信息來(lái)做響應(yīng)的改變,以便修正某個(gè)錯(cuò)誤引起的問(wèn)

***************************指針***********************

【1】指針定義

在計(jì)算機(jī)內(nèi)部存儲(chǔ)器(簡(jiǎn)稱內(nèi)存)中,每一個(gè)字節(jié)單元,都有一個(gè)編號(hào),稱為地

址。

在C語(yǔ)言中,內(nèi)存單元的地址稱為指針,專門用來(lái)存放地址的變量,

稱為指針變量(pointer variable)。在不影響理解的情況中,有時(shí)對(duì)地址、指針和指針變量不區(qū)分,通稱指針。

*:在定義指針變量時(shí),只起到標(biāo)識(shí)作用,在其他情況下,代表獲取指針變量?jī)?nèi)的內(nèi)

&:代表取變量的地址

int *p = &a;

//如果一個(gè)指針變量指向NULL,代表不給他分配任何地址

int *q = NULL;

printf("q = %p\n", q);

輸出結(jié)果為:q=(nil)

//指針變量只能指向一塊已經(jīng)開辟的空間

//int *n = 0x12345678;

錯(cuò)誤,變量的地址只能由系統(tǒng)分配,不能人為指定

//地址的運(yùn)算與數(shù)據(jù)類型相關(guān)

printf("p = %p\n", p);

printf("p + 1 = %p\n", p + 1);

【2】指針與一維數(shù)組

//數(shù)組名是一個(gè)地址常量,不能改變地址

int a[6] ;

a++; 錯(cuò)誤,a為地址常量,不可更改 int b[N];

b = a; 錯(cuò)誤,b為地址常量,不可更改

指針的升級(jí) int a[6] ; &a 代表整個(gè)數(shù)組a的地址,&a+1 代表移動(dòng)整個(gè)數(shù)組的大小

printf("&a = %p\n", &a);

printf("&a + 1 = %p\n", &a + 1);

【3】指針與二維數(shù)組

1)指針的升級(jí) &a 代表整個(gè)數(shù)組,&a+1 代表移動(dòng)整個(gè)數(shù)組的大小 int a[3][4];

printf("&a = %p\n", &a);

printf("&a + 1 = %p\n", &a + 1);

2)二維數(shù)組的名字為行指針,指向a[ 0 ] 元素,a+1每次移動(dòng)一行元素的大小 printf("a = %p\n", a);

printf("a + 1 = %p\n", a + 1); 3)指針的降級(jí),將行指針降級(jí)為列指針

*a 代表將行指針a降級(jí)為列指針,指向元素a[0][0],*a+1,移動(dòng)一個(gè)元素的大小 printf("*a = %p\n", *a);

printf("*a + 1 = %p\n", *a + 1);

4)a[0] 為列指針,指向元素a[0][0], a[0]+1,移動(dòng)一個(gè)元素的大小

printf("&a[0][0] = %p\n", &a[0][0]); printf("&a[0][0] + 1 = %p\n", &a[0][0] + 1);

【4】字符指針和字符串

1)字符串自帶結(jié)束標(biāo)志符‘\0’

char s1[] = "hello";

char s2[6] = {'h', 'e', 'l', 'l', 'o', '\0'};

char s2[5] = {'h', 'e', 'l', 'l', 'o'}; 數(shù)據(jù)后沒(méi)有結(jié)束符,易發(fā)生越界訪

問(wèn)

2)字符指針指向一個(gè)字符串常量,不可更改字符串的內(nèi)容,但是可以更改字符指針的

指向

【5】數(shù)組指針

數(shù)組指針:本質(zhì)上一個(gè)指針,指針指向一個(gè)數(shù)組,就是一個(gè)行指針

int (*p)[4]; //4為列數(shù)

【6】指針數(shù)組

指針數(shù)組:本質(zhì)上是一個(gè)數(shù)組,數(shù)組里面存放的是指針

int *p[2]; // [2] 為數(shù)組的長(zhǎng)度,表示數(shù)組內(nèi)可以存儲(chǔ)兩個(gè)指針

【7】多級(jí)指針

多級(jí)指針:指向指針的指針

int *p = &a; int **q = &p; 【8】const

const常用來(lái)修飾指針變量或者類型

1)如果const修飾類型,則不能通過(guò)指針變量修改數(shù)據(jù) const int *p = &a;

*p = 40; 錯(cuò)誤,不可通過(guò)*p訪問(wèn)數(shù)據(jù)內(nèi)容

2)如果const修飾一個(gè)指針變量,則不能呢個(gè)改變這個(gè)指針變量的地址

int *const p = &a;

p = &b;錯(cuò)誤,不可更改p的指向注意:const 修飾誰(shuí),誰(shuí)被常量化,不可更改

******************函數(shù)********************【1】定義

函數(shù)是一個(gè)完成特定功能的代碼模塊,其程序代碼獨(dú)立,通常要求有返回值,也可以是空值。

【2】一般形式如下:

<數(shù)據(jù)類型> <函數(shù)名稱>( <形式參數(shù)說(shuō)明> )

{

語(yǔ)句序列;

return (<表達(dá)式>);

}

其中:

<函數(shù)名稱>是一個(gè)標(biāo)識(shí)符,要求符合標(biāo)識(shí)符的命名規(guī)則;

<數(shù)據(jù)類型>是整個(gè)函數(shù)的返回值類型,如無(wú)返回值應(yīng)該寫為void型;

<形式參數(shù)說(shuō)明>是逗號(hào)”,”分隔的多個(gè)變量的說(shuō)明形式,通常簡(jiǎn)稱為形

參;

大括弧對(duì) {<語(yǔ)句序列> },稱為函數(shù)體;

<語(yǔ)句序列>是大于等于零個(gè)語(yǔ)句構(gòu)成的。

注意:在函數(shù)體中,表達(dá)式語(yǔ)句里使用的變量必須事先已有說(shuō)明,否則不

能使用。

return(<表達(dá)式>)語(yǔ)句中表達(dá)式的值,要和函數(shù)的<數(shù)據(jù)類型>保持一致;如函數(shù)的<數(shù)據(jù)類型>為void,可以省略或者無(wú)表達(dá)式結(jié)果返回(即寫成

return ;)。

【3】函數(shù)傳參

值傳遞 :函數(shù)的傳參1:值傳遞,只是將變量的數(shù)據(jù)傳遞給行參,不會(huì)改變?cè)瓉?lái)實(shí)參的數(shù)據(jù)

地址傳遞 將變量的地址傳遞給行參,改變地址的內(nèi)容,則實(shí)參也會(huì)改變

注意:數(shù)組的值傳遞,實(shí)質(zhì)為地址傳遞,改變形參的值,實(shí)參的值同樣被改變【4】命令行傳參(向main函數(shù)傳遞參數(shù))

argc:表示命令行傳參的個(gè)數(shù)

argv:表示命令行所傳的每一個(gè)參數(shù)

【5】函數(shù)指針

函數(shù)指針:本質(zhì)上是一個(gè)指針,指向一個(gè)函數(shù)

注意:函數(shù)名就是首地址

【6】指針函數(shù)

指針函數(shù):本質(zhì)上是一個(gè)函數(shù),返回值是一個(gè)指針

【7】函數(shù)指針數(shù)組

函數(shù)指針數(shù)組:本質(zhì)上是一個(gè)數(shù)組,數(shù)組里面存放的時(shí)函數(shù)指針

【8】遞歸函數(shù)

在遞歸函數(shù)中判斷是否滿足某個(gè)條件,不滿足則return 遞歸函數(shù)本身

(return myrecursion)

滿足條件則返回一個(gè)準(zhǔn)確的數(shù)值

int myrecursion(int n){

if(n<1)

return 1;

else

return n*myrecursion(n-1);

}

 

【9】回調(diào)函數(shù)

將一個(gè)函數(shù)以參數(shù)的形式傳遞給某個(gè)函數(shù)。

即回調(diào)函數(shù)的其中之一或更多的形參是某個(gè)函數(shù)傳參使用函數(shù)名

int callback(int fun(int a,int b),int m,int n){ return fun(m,n);

}

上一篇:linux命令大全--分類總結(jié)、實(shí)例和用法

下一篇:NFS服務(wù)端和ftfp客戶端配置的詳細(xì)步驟

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5,京公海網(wǎng)安備11010802025203號(hào)

回到頂部