=============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
(SRCS)
(SRCS) -o $(TARGET)
版本三:(自動搜索所有的.c)
TARGET=main
SRCS=(TARGET):(CC) (TARGET)
wildcard *.c使用wildcard這個函數(shù)匹配所有的.c結(jié)尾的文件
版本四:(生成.o文件)
TARGET=main
SRCS=(patsubst %.c,%.o,(TARGET):(CC) (TARGET)
patsubst這個函數(shù)替換.c為.o
版本五:(保存.o文件)
TARGET=main
SRCS=(patsubst %.c,%.o,(TARGET):(CC) @
%.o:%.c
< -o (OBJ):(CC) (OBJ) -c 有問題
(OBJ) -o < 終級依賴@
版本六:(添加了刪除操作)
TARGET=test
SRCS=(patsubst %.c, %.o, (TARGET):(CC) @
%.o:%.c
@ -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: (CC) ^ @
$(OBJS): tftpsubs.h
tftp.o: ../version.h
install: tftp
install -m(INSTALLROOT)(MANMODE) tftp.1 (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ā)板