開發(fā)工具·GDB使用筆記

=============GDB調(diào)試程序===========
1.調(diào)試代碼初級方法
加打印語句:在關(guān)鍵語句的前后,打印關(guān)鍵性的變量
2.使用GDB這個軟件工具來幫助你調(diào)試
安裝gdb sudo apt-get install gdb
如果你想要使用gdb來調(diào)試你的程序,編譯的時候必須加上-g這個選項
gcc hello.c -o hello -g
-std=c99
-Wall
-E
-S
-c
gdb調(diào)試代碼常用的命令
(1)打印代碼
l 默認(rèn)只打印前面10行
l 1旺拉,20 打印1到20行
(2)設(shè)置斷點
b 行號 b 10
(3)程序運行
r
(4)程序單步運行
n或者s
n不進(jìn)入調(diào)用的函數(shù)內(nèi)部
s進(jìn)入調(diào)用的函數(shù)內(nèi)部
(5)打印變量的值
p 變量名字
(6)查看當(dāng)前斷點信息
info b
刪除斷點
d
(7)追蹤變量的值
display 變量的名字
(8)繼續(xù)運行程序
c 繼續(xù)運行程序贞绳,直到遇到下一個斷點或者程序結(jié)束
3.段錯誤的調(diào)試(需要用到core文件摊崭,core文件中包含了產(chǎn)生段錯誤的信息)
core文件也被稱作核心轉(zhuǎn)儲文件
產(chǎn)生段錯誤的根本原因是你寫的代碼中訪問了非法內(nèi)存
步驟:
(1)先查看系統(tǒng)中core文件炊琉,ulimit -a
得到結(jié)果是:core file size (blocks, -c) 0 表示無法生成core文件
(2)讓系統(tǒng)能夠自動生成core文件
ulimit -c unlimited
(3)使用gdb來查找段錯誤
gdb ./程序名 core文件的名字
gdb ./test core
使用經(jīng)驗:使用core來尋找段錯誤并不是萬能的垮衷,有時候找到的信息看不懂厅翔,那就只能使用傳統(tǒng)的方法,重點查找指針搀突,取地址的那些變量是否操作有誤

==================生成庫文件==================
1.庫文件分為兩類:
動態(tài)庫文件 .so結(jié)尾的文件
靜態(tài)庫文件 .a結(jié)尾的文件
庫文件的名字:
libxxxxxxx.so
libxxxxxx.a
2.動態(tài)庫
步驟:(1)先將.c文件編譯成.o gcc test.c -o test.o -c
(2)將上一步得到的.o文件進(jìn)一步編譯得到動態(tài)庫文件
gcc -fPIC -shared test.o -o libxxxx.so
(3)以前的.c可以不要了刀闷,只使用動態(tài)庫就可以生成程序了
方法一:gcc main.c libxxxx.so -o main 當(dāng)運行程序的時候需要加載動態(tài)庫文件,需要將libxxx.so拷貝到系統(tǒng)專門用于存放動態(tài)庫的文件夾里面
不能寫反了gcc libxxxx.so main.c -o main(錯誤的)
方法二:gcc main.c -o main -L庫文件所在的路徑 -l庫文件的名字
-L 指明庫文件的路徑
-l 指明庫的名字(去掉lib仰迁,去掉后綴)
如果你不想將動態(tài)庫文件放置到系統(tǒng)默認(rèn)的路徑中甸昏,你可以選擇自己設(shè)置新的路徑
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH 此例子是將當(dāng)前路徑.設(shè)置成環(huán)境變量
3.靜態(tài)庫
步驟:(1)先將.c文件編譯成.o gcc test.c -o test.o -c
(2)將上一步得到的.o文件進(jìn)一步編譯得到靜態(tài)庫文件
ar -rcv libxxxx.a test.o (沒有-o,順序別搞反了)
(3)以前的.c可以不要了徐许,只使用靜態(tài)庫就可以生成程序了
方法一:gcc main.c libxxxx.a -o main 由于使用的是靜態(tài)庫施蜜,所以不需要將庫文件拷貝到環(huán)境變量中
不能寫反了gcc libxxxx.so main.c -o main(錯誤的)
方法二:gcc main.c -o main -L庫文件所在的路徑 -l庫文件的名字
-L 指明庫文件的路徑
-l 指明庫的名字(去掉lib,去掉后綴)
4.動態(tài)庫和靜態(tài)庫的區(qū)別
動態(tài)庫是在程序運行的時候加載到程序中去的雌隅,所以你在運行動態(tài)庫編譯的程序的時候需要依賴你的庫文件
但是靜態(tài)庫是程序編譯的時候就已經(jīng)自動編譯進(jìn)去了翻默,所以運行的時候不需要依賴靜態(tài)庫文件

2017-02-09
==============Makefile的使用============
1.Makefile的作用:理清復(fù)雜的大型工程項目代碼之間的聯(lián)系
管理大型工程項目源碼

2.Makefile的使用
目標(biāo):依賴
執(zhí)行
版本一:
main:main.c
gcc main.c -o main
注意gcc前面是用tab鍵縮進(jìn)的缸沃,不能使用空格

版本二:(引入變量)
TARGET=main
SRCS=main.c
CC=gcc
(TARGET):(SRCS)
(CC)(SRCS) -o $(TARGET)

版本三:(自動搜索所有的.c)
TARGET=main
SRCS=(wildcard *.c) CC=gcc(TARGET):(SRCS)(CC) (SRCS) -o(TARGET)
wildcard *.c使用wildcard這個函數(shù)匹配所有的.c結(jié)尾的文件

版本四:(生成.o文件)
TARGET=main
SRCS=(wildcard *.c) OBJ=(patsubst %.c,%.o,(wildcard *.c)) CC=gcc(TARGET):(OBJ)(CC) (OBJ) -o(TARGET)
patsubst這個函數(shù)替換.c為.o

版本五:(保存.o文件)
TARGET=main
SRCS=(wildcard *.c) OBJ=(patsubst %.c,%.o,(wildcard *.c)) CC=gcc(TARGET):(OBJ)(CC) ^ -o@
%.o:%.c
(CC)< -o @ -c 生成中間文件.o ?修械?趾牧? 寫法一 %.o:%.c有問題 寫法二(OBJ):(SRCS)有問題 寫法三(CC) (SRCS) -o(OBJ) -c 有問題
(CC)(OBJ) -o (TARGET) 初級依賴< 終級依賴^ 目標(biāo)@

版本六:(添加了刪除操作)
TARGET=test
SRCS=(wildcard *.c) OBJ=(patsubst %.c, %.o, (wildcard *.c)) CC=gcc(TARGET):(OBJ)(CC) ^ -o@
%.o:%.c
(CC) -o@ -c $<

clean:
rm *.o $(TARGET)

======================開發(fā)板的使用=================
1.官方名稱:s5pv210 (我們這塊開發(fā)板cpu芯片的名字)
gec210 粵嵌取的名字
該芯片采用的是ARM架構(gòu),三星公司出產(chǎn)肯污,屬于ARM Cortex-A8系列
傳統(tǒng)的PC里面的cpu是X86架構(gòu)的
ARM是一家英國公司翘单,專門設(shè)計CPU的架構(gòu),三星仇箱,高通,TI德州儀器东羹,聯(lián)發(fā)科剂桥,華為等等都是按照ARM公司的設(shè)計生產(chǎn)屬于自己公司的cpu芯片
2.進(jìn)入開發(fā)板操作系統(tǒng)
(1)使用secure CRT這個軟件輔助我們查看開發(fā)板操作系統(tǒng)里面的內(nèi)容
配置secure CRT
一:安裝usb轉(zhuǎn)串口的驅(qū)動
二:打開secure CRT這個軟件,刪除別人舊的配置
協(xié)議:serial
端口:實事求是属提,去設(shè)備管理器查看究竟是端口幾
波特率:115200
右邊的勾取消
點擊連接
三:開發(fā)板上電
(2)開發(fā)板啟動的過程
先啟動uboot---》啟動內(nèi)核kernel---》最后進(jìn)入根文件系統(tǒng)rootfs
uboot:板級初始化权逗,初始化cpu,內(nèi)存等等
kernel:配置網(wǎng)絡(luò)冤议,內(nèi)存管理斟薇,其他一些系統(tǒng)服務(wù)
rootfs:管理存放文件
(3)開發(fā)板根文件系統(tǒng)中的目錄
IOT driver_test lost+found sys
etc mnt tmp
bin opt tslib
home proc upiot.sh
data lib root usr
dev linuxrc sbin var
(4)文件如何下載到開發(fā)板
方法一:使用串口下載
rz 回車----》自動彈出對話框---》手動選擇你要下載的文件---》雙擊,自動下載
rx 你要下載的文件名字 回車---》點擊傳輸---》選擇發(fā)送xmdem---》會彈出對話框---》手動選擇你要下載的文件---》雙擊恕酸,自動下載
rz無法覆蓋同名文件堪滨,rx可以覆蓋同名文件
設(shè)置默認(rèn)下載,上傳的路徑:點擊選項---》選擇會話選項---》點擊xmodem/zmodem
使用串口上傳
sz 文件名 回車
串口下載文件速度很慢蕊温,你可以將文件壓縮一下再下載

      方法二:tftp下載
              情況一:windows和開發(fā)板之間tftp
              第一步:修改開發(fā)板的ip地址ifconfig eth0 正確的ip(一次性的袱箱,開發(fā)板重啟之后就沒有了)
                      永久修改開發(fā)板的ip地址   打開/etc/init.d/rcS這個文件,修改ifconfig eth0 你先要的ip地址
              第二步:分別用ping命令去ping電腦和開發(fā)板
              第三步:打開tftpboot這個軟件
                      配置好電腦的ip义矛,選擇好你要下載的文件的目錄
              第四步:
                      下載:在開發(fā)板中輸入tftp -r 要下載的文件名  -g 電腦的ip
                      上傳:在開發(fā)板中輸入tftp -r 要下載的文件名  -p 電腦的ip
              情況二:ubuntu和開發(fā)板之間tftp
                      跟情況一差不多发笔,不太穩(wěn)定(開發(fā)板和電腦之間用網(wǎng)線直接連效果很好)
      方法三:nfs掛載

2017-02-10
=================燒寫系統(tǒng)=================
1.燒寫系統(tǒng):你原來的系統(tǒng)崩潰了,更新新的系統(tǒng)凉翻,更換新類型的操作系統(tǒng)
2.uboot燒寫系統(tǒng)
注意的問題:
1.千萬別用快捷鍵去粘貼以下命令了讨,會出錯
2.先配置好開發(fā)板和電腦的ip,使得二者能夠tftp下載
3.在使用uboot下載的使用本地連接有時候是斷開網(wǎng)線的(這個沒有關(guān)系制轰,關(guān)鍵是要配置好開發(fā)板前计,電腦,uboot的ip地址)
4.以下的第一步注意別完全復(fù)制
如何通過uboot來更新系統(tǒng)(u-boot.bin,zImage,rootfs.img)

1)修改uboot的網(wǎng)絡(luò)配置
重啟開發(fā)板垃杖,倒數(shù)三秒之前按下任意鍵残炮,選擇e進(jìn)入到uboot
GEC210 # setenv serverip 192.168.1.100 // 電腦的ip
GEC210 # setenv ipaddr 192.168.1.5 //只要不跟電腦和開發(fā)板沖突就行
GEC210 # setenv gatewayip 192.168.1.1
GEC210 # save

2)更新uboot
GEC210 # tftp 0x40000000 uboot-gec210.bin
GEC210 # nand erase 0x0 0x100000 -->擦除nand中uboot的分區(qū)
GEC210 # nand write 0x40000000 0x0 0x100000

3)更新zImage
GEC210 # tftp 0x40008000 zImage
GEC210 # nand erase 0x600000 0x500000
GEC210 # nand write 0x40008000 0x600000 0x500000

4)更新rootfs
GEC210 # tftp 0x40000000 game_fs.img
GEC210 # nand erase 0xe00000 0x1F200000
GEC210 # nand write.yaffs 0x40000000 0xe00000 0x*******
xxx--->Bytes transferred = 4011628 (0x3d366c) --->實際下載文件的大小

遇到的問題:
問題一:ip配置都對,但是無法ping通
原因一:網(wǎng)線壞了
原因二:關(guān)閉掉電腦的防火墻
問題二:ip配置都對缩滨,tftp下載總是重啟
關(guān)閉防火墻

========================交叉工具鏈的安裝和使用============================
1.引入概念
交叉編譯:程序的編寫势就,編譯在pc上面進(jìn)行泉瞻,但是程序的運行在開發(fā)板上運行,這個過程被稱作交叉編譯(分工協(xié)作)
2.工具鏈的安裝
(1)將源碼包拷貝純粹的linux環(huán)境中(不要在共享中直接解壓苞冯,會出錯袖牙,原因是windows不支持linux中的鏈接文件)
(2)解壓源碼包
(3)設(shè)置環(huán)境變量
export PATH=/usr/arm-2009q3/bin:$PATH 把路徑/usr/arm-2009q3/bin設(shè)置成環(huán)境變量,原因是我剛才解壓工具包的時候就放在這個路徑里面了

以下工具是屬于ARM架構(gòu)下編譯程序用到的
arm-linux-as binutils 編譯ARM 匯編程序
arm-linux-ar binutils 把多個.o 合并成一個.o 或靜態(tài)庫(.a)
arm-linux-ranlib binutils 為庫文件建立索引舅锄,相當(dāng)于arm-linux-ar -s
arm-linux-ld binutils 連接器(Linker), 把多個.o 或庫文件連接成一個可執(zhí)行文件

arm-linux-objdump binutils 查看目標(biāo)文件(.o)和庫(.a)的信息
arm-linux-objcopy binutils 轉(zhuǎn)換可執(zhí)行文件的格式
arm-linux-strip binutils 去掉elf 可執(zhí)行文件的信息. 使可執(zhí)行文件變小
arm-linux-readelf binutils 讀elf 可執(zhí)行文件的信息
arm-linux-gcc gcc 編譯.c 或.S 開頭的C 程序或匯編程序
arm-linux-g++ gcc 編譯c++程序
3.小項目
交叉編譯tftp鞭达,默認(rèn)情況下我們下載tftp源碼包是使用gcc編譯的,屬于x86架構(gòu)下面的tftp皇忿,但是我們開發(fā)板上需要ARM架構(gòu)的tftp
步驟:
(1)在家目錄下新建一個文件夾用于存放tftp的源碼(例如:tftpcode)
(2)進(jìn)入到tftpcode目錄中畴蹭,執(zhí)行sudo apt-get source tftp
(3)進(jìn)入到下載的netkit-tftp-0.17/tftp目錄中,打開Makefile文件鳍烁,進(jìn)行修改
all: tftp
CC=arm-linux-gcc // 添加這一句叨襟,把編譯器改變成ARM架構(gòu)下

include ../MCONFIG // 用#將這兩句注釋

include ../MRULES

OBJS = tftp.o main.o tftpsubs.o

tftp: (OBJS)(CC) (LDFLAGS)^ (LIBS) -o@

$(OBJS): tftpsubs.h
tftp.o: ../version.h

install: tftp
install -m(BINMODE) tftp(INSTALLROOT)(BINDIR) install -m(MANMODE) tftp.1 (INSTALLROOT)(MANDIR)/man1

clean:
rm -f *.o tftp
(4)保存退出Makefile,在netkit-tftp-0.17/tftp目錄中執(zhí)行make命令幔荒,就可以得到ARM架構(gòu)下tftp程序
(5)編譯好的tftp就可以在開發(fā)板上使用了

============開發(fā)板實用小技巧===============
1.將u盤掛載到你的開發(fā)板
步驟:
(1)將u盤插上開發(fā)板的usb口糊闽,會自動識別出你的u盤,并且會分配一個驅(qū)動名字(比如:sda4)
(2)使用mount命令去掛載u盤
mount /dev/xxx /2017 將u盤xxx掛載到根目錄下面的2017
(3)刪除u盤
umount /2017
2.開機自動運行程序
修改/etc/profile這個文件爹梁,在最后面加上你要自動運行的那個程序的絕對路徑右犹,然后保存退出,重啟開發(fā)板

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姚垃,一起剝皮案震驚了整個濱河市念链,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌积糯,老刑警劉巖钓账,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異絮宁,居然都是意外死亡梆暮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門绍昂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啦粹,“玉大人,你說我怎么就攤上這事窘游∵胪郑” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵忍饰,是天一觀的道長贪嫂。 經(jīng)常有香客問我,道長艾蓝,這世上最難降的妖魔是什么力崇? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任斗塘,我火速辦了婚禮,結(jié)果婚禮上亮靴,老公的妹妹穿的比我還像新娘馍盟。我一直安慰自己,他們只是感情好茧吊,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布贞岭。 她就那樣靜靜地躺著,像睡著了一般搓侄。 火紅的嫁衣襯著肌膚如雪瞄桨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天讶踪,我揣著相機與錄音芯侥,去河邊找鬼。 笑死俊柔,一個胖子當(dāng)著我的面吹牛筹麸,可吹牛的內(nèi)容都是我干的活合。 我是一名探鬼主播雏婶,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼白指!你這毒婦竟也來了留晚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤告嘲,失蹤者是張志新(化名)和其女友劉穎错维,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橄唬,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡赋焕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了仰楚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隆判。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖僧界,靈堂內(nèi)的尸體忽然破棺而出侨嘀,到底是詐尸還是另有隱情,我是刑警寧澤捂襟,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布咬腕,位于F島的核電站,受9級特大地震影響葬荷,放射性物質(zhì)發(fā)生泄漏涨共。R本人自食惡果不足惜纽帖,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煞赢。 院中可真熱鬧抛计,春花似錦、人聲如沸照筑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凝危。三九已至波俄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛾默,已是汗流浹背懦铺。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留支鸡,地道東北人冬念。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像牧挣,于是被迫代替她去往敵國和親急前。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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