find . -name *.c | wc -l //查找並統計c程序文件的個數 find . -name *.c -exec wc {} -l \; //查找並統計每一個C程序的行數 find . -name *.c -exec cat {} \; | wc -l //查找並統計全部c程序的總行數
gcc simple.c -o simple //編譯生成爲指定文件,默認爲a.out gcc -S simple.c //生成 simple.s 的彙編程序 gcc -E print.c > print.i //預處理,頭文件的引入與處理 gcc -v print.c //生成編譯連接過程,libc.a cc1 //編譯器 as //彙編器 collect2 //連接器 objdump -d a.out //獲得全部機器指令(反彙編) echo $? //上一個程序執行後的返回值 objcopy -O binary -j .text a.out text.bin //提取可執行文件的代碼 objcopy -O binary -j .data a.out data.bin //提取可執行文件的數據 file a.out //文件格式(類型)信息 hexdump -C a.out //查看二進制文件的內容 readelf -a a.out //分析ELF文件 ps aux | grep a.out
局部變量的數據分配在棧上,且賦值操做會被解析成指令;全局變量分配在數據區,賦初值的等號至關於冒號,並不解析成指令。linux
&local = 0xbfb8948c &global = 0x804a018 main = 0x8048414 _start is 0x8048360 //c語言真正的入口
直觀映像,內存跨度 128M ~ 3G 。
操做系統管理物理內存,每一個進行都有獨立的內存空間,程序打印的地址都是虛擬地址,其對應關係由操做系統內核管理。編程
extern _start; //由連接器生成的 ... printf("_start is %p\n", &_start);
調試宏操作系統
#define PRINT(x) printf("<debug>" #x "= %d\n", x) //#define PRINT(x)
條件編譯;-lm 連接時加入數學庫debug
#if DEGUG … #endif $ gcc t.c -lm -DDEBUG //定義 $ gcc t.c -lm -UDEBUG //不定義
用來交換變量的宏,do...while的經典應用,注意兩個關鍵點調試
#define SWAP(a,b) \ do{ \ char tmp; \ tmp = b; \ b = a; \ a = tmp; \ }while(0) //故意不要語法要求的分號 if(j >= 0) SWAP(x, y); else //else前面本來是不該該有分號的 print("error\n");