Linux九阳神功
Linux九陽神功
宗旨:技術的學習是有限的,分享的精神是無限的。
一、基礎命令:
1.用戶管理類命令
(1)useradd libang 添加用戶 —— 在home目錄下生成同級的目錄
(2)userdel -r libang 刪除用戶
(3)passwd libang 修改密碼
(4)su -root 切換到root用戶,并將root用戶的環境變量同時帶入
(5)groupadd group 添加名為group的用戶組
(6)groupdel group 刪除名為group的用戶組
注意:
??? adduser創建帳號的同時,要求用戶輸入密碼
??? useradd需要在創建帳號后,自行創建密碼passwd
?
2.文件與目錄類命令
(1)ls 查看目錄 (ls [選項] 目錄或文件)
??? ls /home 顯示/home目錄下的文件與目錄(不包含隱藏的)
??? ls -a /home 顯示/home目錄下的文件與目錄(包含隱藏的)
??? ls -l /home 顯示/home目錄下的文件與目錄的詳細信息
(2)cd 改變工作目錄(cd 目錄名)
??? cd /home/ 進入/home目錄
??? cd ..退回到上一級目錄
??? cd ~ 進入用戶主目錄
??? cd - 代表前一個工作目錄
??? ctrl+h 顯示當前目錄下的隱藏文件
(3)cp 復制文件/目錄 (cp [選項] 源文件或目錄目標文件和目錄)
??? cp /home/test /tmp 將/home目錄下的test文件拷貝到/tmp目錄下
??? cp -r /home/dir1 /tmp 將/home目錄下的dir1目錄拷貝到/tmp目錄下
(4)mv 移動或改名(mv [選項] 源文件或目錄 目標文件或目錄)
??? mv /home/test /home/test1 將/home目錄下的test文件更名為test1
??? mv /home/dir1 /tmp 將/home目錄下的dir1目錄移動到/tmp目錄下
(5)rm 刪除文件/目錄 (rm [選項] 文件或目錄)
??? rm /home/test 刪除/home目錄下的test文件
??? rm -r /home/dir 刪除目錄下的dir目錄
(6)chmod 改變文件權限(chmod +x test.txt)
??? chmod 777 test.txt 可讀可寫可執行
(7)mkdir 創建目錄(mkdir [選項] 目錄名)
??? mkdir /home/workdir 在/home目錄下創建workdir目錄
??? mkdir -p /home/dir1/dir2/dir3 ?依次創建
(8)du 查看目錄 (du 目錄名)
??? du /tmp
(9)pwd 查看當前路徑
(10)echo 顯示字符串變量等
?
3.壓縮打包類命令
*.gz——gzip命令壓縮的文件
*.bz2——bzip2命令壓縮的文件
*.tar——tar命令打包的文件
*.tar.gz——tar打包后,再經過gzip壓縮的文件
*.tar.bz2——tar命令打包后,再經過bzip2壓縮的文件 (tar xjvf *.tar.bz2)
(1)gzip 壓縮解壓(gzip [選項] 文件名)
??? gzip /root/anaconda-ks.cfg 壓縮文件
??? gzip -d /root/anaconda-ks.cfg.gz 解壓文件
(2)bzip2 壓縮解壓(bzip2 [選項] 文件名)
??? bzip2 /root/anaconda-ks.cfg 壓縮文件
??? bzip2 -d /root/anaconda-ks.cfg.bz2 解壓文件
? ? tar xjvf?name.bz2
(3)tar 打包壓縮(tar [選項] 目錄或者文件)
??? tar cvf tmp.tar /tmp 將/tmp目錄打包為一個文件
??? tar xvf tmp.tar 將打包文件解開
??? tar cvzf tmp.tar.gz /tmp 將tmp目錄打包為一個文件
(4)tar xzvf tmp.tar.gz 將打包文件解開
注意:1 gzip不能壓縮目錄,只能壓縮文件
???? 2 壓縮和打包,解壓縮和解包是不同的過程
???? 3 gzip壓縮或者解壓后,原文件不再存在;bzip2提供了-k參數,可以保留原文件
???? 4 windows對文件壓縮,其實是先打包在壓縮的過程
?
4.磁盤管理類命令
(1)mount 加載光盤(mount [選項] 類型 設備名 掛載目錄)
??? mount /dev/csrom /mnt
??? mount -t iso9660 /dev/cdrom /mnt/cdrom
??? 類型:
?????? windows95/98的FAT32系統?? vfat
?????? winNT/2000??? ntfs
?????? CD-ROM??????? iso9660??????
(2)umount 卸載光盤(umount 掛在目錄)
??? umount /mnt (請在執行umount前,保證用戶已經推出了mnt目錄)
(3)df 查看磁盤總容量,已用容量(df [選項])
??? df -hl
??? du 查看文件已用容量
??? du -h ————針對目錄
(4)touch 創建新文件
??? touch newfile 創建一個名為newfile的空白文件
(5)ln 文件鏈接(ln [選項] 文件名 鏈接名)
??? ln oldfile hlink 為oldfile文件創建一個應鏈接hlink
??? ln -s oldfile slink 為oldfile文件創建一個軟鏈接slink
??? 硬鏈接和軟鏈接的區別:
(6)fdisk 查看硬盤分區情況
??? fdisk -l ————擁有root權限
?
5.查找類命令
(1)find 查找文件/目錄 (find 查找路徑 -name文件名)
??? find /root -name install.log 在root目錄下尋找名為install.log文件
(2)grep 查找字符(grep "字符串" 路徑 [選項])
??? grep "hello" ./ -rn 在當前路徑下尋找包含字符串"hello"的文件
?
6.進程管理類命令
(1)ps 查看進程(ps [選項])
??? ps aux
(2)kill 殺死進程(kill [選項] pid)
??? vim hello.c
??? ps aux
??? kill pid (hello.c的進程號)
(3)free 查看內存
??? free
(4)top CPU占有率(top [選項])
??? top 動態顯示進程
(5)pstree 以樹形式打印進程
(6)tree 以樹形式打印當前目錄
(7)jobs 查看后臺進程和它的作業號
??? fg %1??1為作業號,調到 前臺運行
??? ctrl+z 正在執行的進程放在后臺,并停止
??? bg %1??1為作業號,把后臺停止的作業改成 后臺運行
??? 多個命令的同時執行時,只要將它們用分號隔開即可。
?
7.雜項命令大聚合
(1)代碼風格
??? indent [options] [input-files]
??? indent [options] [single-input-file] [-ooutput-file]
??? indent -kr -bl -bli0 test.c
??? -kr表示K&R風格
??? -i8表示縮進8個空格的長度
??? -l80表示一行最多80個字符
??? 沒有指定-nut選項,則每8個縮進空格會自動用一個Tab代替
(2)| 管道操作 (命令1 | 命令2)
??? rpm -qa|grep tar 查詢系統中安裝的所有軟件包,并從中找出帶有字符串"tar"的
(3)man?? info?--help查看幫助 (man 命令名)
??? man find 查看find命令的用法
(4)shutdown關閉linux系統 (shutdown [選項] 時間)?
??? shutdown -h 18:00
??? 立即關機:shutdown now?? init 0?? halt
??? 重啟:init6?? reboot?? shutdown -r
(5)date+%Y/%m/%d 顯示年月日
???? date +%H:%M 顯示小時和分鐘 (/和:可以用其他符號代替)
???? cal [[month] year]
(6)將一般用戶改為sudo用戶
??? sudo vim /etc/group
??? 找到類似這樣的一行: sudo:x:27:icawu,sir
??? 在第4列后面加入一般賬戶的名字即可,“,”后不要空格
??? 或者是/etc/sudoers root ALL=(ALL) ALL 在起下面添加xxxALL=(ALL) ALL(這里的xxx是你的用戶名)
(7)od[-t TYPE] 檔案
??? -t :后面可以接各種類型 (TYPE)癿輸出,例如:
??? a :利用默認的字符輸出;
??? c :使用ASCII 字符輸出
??? d[size] :利用十進制(decimal)輸出數據,每個整數占用size bytes ;
??? f[size] :利用浮點數(floating)輸出數據,每個數占用size bytes ;
??? o[size] :利用八進制(octal)輸出數據,每個整數占用size bytes ;
??? [size] :利用十六進制(hexadecimal)輸出數據,每個整數占用 size
??? 例如: hello文件的內容 3210o
??? od -tx1 -tc hello? //可以有多個選項,注意1的效果(每1個字節隔開)
??? 0000000?33? 32? 31?30? 6f? 0a
???????? ? ?3??2?? 1?? 0??o? \n
(8)內核相關
??? uname -arsmpi
??? -a :所有系統相關癿信息,包括底下的數據都會被列出來;
??? -s :系統核心名稱
??? -r :核心的版本
??? -m :本系統癿硬件名稱,例如 i686 戒 x86_64 等;
??? -p :CPU的類型,與-m 類似,只是顯示的是 CPU的類型!
??? -i :硬件的平臺 (ix86)
??? 應用:cd /usr/src/'uanme -r'/include/linux/fs.h
??? 此句在里ubuntu13.04中不可,linux-headers-3.8.0-19
??? lsmod?查看已加載內容
??? lshw??當前硬件信息
??? xrandr 查看當前分辨率? (xrandr -s 7(第幾行)
(9)cat顯示文本文件內容 (cat /etc/issue)
???? more 分頁顯示文本文件內容? ——只能向下翻頁
???? less 分頁顯示文本文件內容? ——可以上下翻頁
???? head 顯示文件首部內容?? (head -5 /etc/passwd)
???? tail 顯示文件尾部內容
??? cat /etc/passwd | more/less/head -5/tail -5
(10)which 查看可執行文件的位置
??? which which
????? whereis 查看文件位置(全匹配查找)
??? whereis which
????? locate 配合數據庫查看文件位置 (局部匹配查找)
??? locate ls
(11)信息查看
??? dmesg 顯示系統的啟動信息 (保存在/etc/sysconfig)
??? uptime 關于系統相關的時間信息
??? who 查看當前系統用戶 (whoami 只查看當前用戶)
??? last 系統用戶登錄信息 (/var/log名為wtmp文件里)
??? hostname 域名
??? bc 計算器
(12)ubuntu專題:
? <1> apt命令用法: (在ubuntu下可用,redhat不可用)
??? apt-get update? 升級源
??? apt-get install 安裝新軟件包
??? apt-get remove 卸載已安裝的軟件包
??? apt-get clean? 清理系統,不影響安裝的軟件的使用
??? apt-get upgrade 更新任何已安裝的軟件包
??? apt-get dist-upgrade 系統升級到新版本
??? apt-get search 查找軟件包
??? dpkg-config-list-all (dpkg -l)列出所有軟件包
?
??? sudo apt-get install nautinuls-open-terminal(當前位置代開終端) ---重啟生效
??? sudo apt-get autoremove indicator-appmenu? (關閉全局應用菜單)
?
? <2> ubuntu下的幾個重要文件:
??? (1) 軟件源:/etc/apt/sources.list
??? (2) $PATH:/etc/environment
??? (3) 環境變量:/etc/profile
??? (4) grub:/boot/grub/grub.cfg
??? (5) 用戶bash:/home/.bashrc(注意以.開頭的文件屬于隱藏文件,用ctrl+h可以顯示)
?
? <3> system setting沒有語言支持: sudo apt-get install language-selector-gnome
? <4> 虛擬機中VMwareTools的安裝
??? (1)、下載vmwaretools工具包:http://download.csdn.net/download/jiaoxiaogu/6287937
??? (2)、解壓并安裝:
??? - $ tar xzf VMwareTools-9.6.0-1294478.tar.gz
??? - $ cd vmware-tools-distrib
??? - $ sudo ./vmware-install.pl
??? 一直按回車鍵
??? (3)、重啟虛擬機
?<5> GNU二進程工具 (對ARM很重要,務必要了解)---redhat/ubuntu
??? addr2line:把程序地址轉換為文件名和行號ar:建立、修改、提取歸檔文件
??? as:主要用來編譯GNU C編譯器gcc輸出的匯編文件,產生的目標文件由鏈接器ld連接
??? c++filt:連接器使用它來過濾C++ 和Java 符號,防止重載函數沖突
??? ld:GNU鏈接器
??? nm:列出目標文件中的符號
?????? R--只讀符號? N--調試符號? D--已經初始化的變量? T--text段的符號
?????? U--未定義的符號? S--未初始化的符號
??? objcopy:文件格式轉換?
??? objdump:顯示一個或者更多目標文件的信息,主要用來反編譯?
??? ranlib:產生歸檔文件索引,并將其保存到這個歸檔文件中。在索引中列出了歸檔文件各成員所定義的可重分配目標文件
??? readelf:顯示elf格式可執行文件的信息? readelf -a a.out
??? size:列出目標文件每一段的大小以及總體的大小。默認情況下,對于每個目標文件或者一個歸檔文件中的每個模塊只產生一行輸出? size a.out
??? strings:打印某個文件的可打印字符串。默認情況下,只打印目標文件初始化和可加載段中的可打印字符;對于其它類型的文件它打印整個文件的可打印字符,這個程序對于了解非文本文件的內容很有幫助? strings -f/a hello.o
??? strip:丟棄目標文件中的全部或者特定符號,減小文件體積? strip -s a.out
?
<6>windows和ubuntu文件共享之samba服務器配置
??? 關閉LINUX防火墻命令: #ufw disable? 然后就在windows下ping一下linux的IP,如果能ping通,就可以繼續下面的內容,如果ping不通就再找找原因
??? 注:ubuntu12.04已經安裝了最新版本的samba服務器,無需安裝。如果使用12.04以前的版本,最好是按下邊的方法升級一下samba,12.04版本無需下列操作
??? 卸載samba,smbclient,samba-common
??? $sudo apt-get remove samba-common
??? $sudo apt-get remove smbclient
??? $sudo apt-get remove samba
?
??? 安裝Ubuntusamba服務器:
??? sudo apt-get install samba
??? sudo apt-get install smbfs
?
??? 安裝Ubuntusamba圖形管理界面
??? #sudo apt-get install system-config-samba
?
??? 啟動samba圖形管理界面
??? #sudo system-config-samba
??? 選擇要共享的目錄 設置讀寫權限 設置訪問權限添加samba用戶
??? 配置完成后要重啟samba
??? #sudo /etc/init.d/smbd restart
(13)Elf格式文件
??? GNU編譯器生成的目標文件缺省為elf格式
??? elf文件由若干段(section)組成;目標代碼中包含如下段:
??? .text:??? 包含程序的指令代碼、固定的數據,如常量、字符串;
??? .data:??? 包含有初始化值的變量、數組等;
??? .bss: 包含未初始化的變量、數組等;
??? 連接器的任務就是將多個目標文件的.text、.data和.bss等段連接在一起
?
?
二、vim編輯器的使用與配置 參考:http://blog.csdn.net/wqx521/article/details/37913877
??? 1.常用編輯器:
?????? (1) vi/vim 最常用的字符界面文本編輯器
?????? (2) emacs?專為編輯程序源碼文件而編寫的文本編輯器
?????? (3) nano??字符界面底端
?????? (4) gedit?運行在Linux圖形界面中
?????????? gedit之亂碼問題
?????????? ?<1> 運行dconf-editor
?????????? ?<2> 展開/org/gnome/gedit/preferences/encodings
?????????? ?<3> auto-detected的Value中加入'GB2312' ,加在UTF-8前面;
?????? (5) MC
?? 2.開發環境構成:
?????? (1) 編輯器:vi/vim
?????? (2) 編譯器:gcc
?????? (3) 調試器:gdb
?????? (4) 函數庫:glibc??? /usr/lib
?????? (5) 系統頭文件:glibc_header?? /usr/include
?
三、Linux網絡配置 (vmware workstation虛擬機)
??? 1.VMware提供了三種網絡工作模式:
?????? (1).bridged(橋接模式)—— 提供做個IP地址
?????? (2).NAT(網絡地址轉換模式)——只能提供一個IP地址
?????? (3).host-only(主機模式)——主機沒有連接任何外部網絡
??? 2.注意事項:
?????? (1).選擇網絡模式前,停止虛擬機中系統的運行
?????? (2).配置完網絡后,重新啟動虛擬機中的系統
???
??? 3.相關命令
?????? (1) ifconfig:查看各網卡詳細信息(如IP),以太網卡名一般為"eth0"
?????? (2) /etc/init.d/networking restart 重啟各網卡
???
??? 4.Linux常見網絡接口
?????? -eth0:系統中的第一塊物理網卡
?????? -lo:虛擬的回環網卡
??? ??? -virbr0:網絡網橋
?
四、遠程登錄
??? 1.登錄前提
?????? (1) 從windows能夠ping通linux(在ctrl+R--cmd--pingIP地址(在linux里面用ifconfig看IP地址))
?????? (2) 關閉Linux防火墻——ufw disable (ubuntu)
??? ?
??? 2.putty-SSH軟件,設置相關信息.軟件下載地址:http://download.csdn.net/detail/a1314521531/7877905
??? 3.VNC
?????? (1) 安裝vnc服務器
?????? (2) 啟動vnc服務:vncserver &
??? <或者3.在windows端運行vnc.exe>
??? VNC常見問題:windows不能ping通linux? 未關閉防火墻
?
五、Windows與Linux文件共享(redhat)
??? 1.前提條件
?????? (1) 從windows能夠ping通linux(在ctrl+R--cmd--pingIP地址(在linux里面用ifconfig看IP地址))
?????? (2) 關閉Linux防火墻——/etc/init.d/iptables stop (redhat)?ufw disable (ubuntu)
??? 2.WinSCP軟件(windows中)
?????? 自己摸索一下這個軟件的使用吧,就是把文件拖進拖出
?
??? Vmware Tools不推薦使用
?
??? Windows與Linux文件共享(ubuntu)
??? 1.前提條件
?????? (1) 從windows能夠ping通linux(在windows+R--cmd--pingIP地址(在linux里面用ifconfig看IP地址))
?????? (2) 物理機和虛擬機建立通信——sudo apt-get install ssh??? ps-e |grep ssh??? /etc/init.d/ssh start--啟動ssh服務器
??? 2.WinSCP軟件(windows中)
?????? 自己摸索一下這個軟件的使用吧,就是把文件拖進拖出
?
六、Linux密碼故障解決
破解root密碼步驟:
??? (1) 在系統啟動時進入grub選項菜單
??? (2) 在grub選項菜單按e進入編輯模式
??? (3) 編輯kernel那行,添加/init 1
??? (4) 按b重啟
??? (5) 進入系統后,將root密碼設置為空
??? vim /etc/passwd
?????? root:x:0...中的x刪除
?????? root::0...然后保存退出
??? (6) 重啟,登錄linux后修改root密碼
??? passwd root
?
七、宿主機上安裝TFTP服務器 (ubuntu)
??? 配置tftp 服務的步驟:
??? <1>. 若/etc/xinetd.d/下存在 tftp,執行下列操作
?????? 1)關閉 xinetd 服務
?????? $sudo service xinetd stop
?????? 2)刪除 tftp 文件
?????? $sudo rm /etc/xinetd.d/tftp
?????? 3) 啟動xinetd 服務
?????? $sudo service xinetd start
??? <2>. 安裝 tftp 客戶端和服務器端
?????? $sudo apt-get install tftp-hpa
?????? $sudo apt-get install tftpd-hpa
??? <3>. 修改 tftpd-hpa 配置文件
?????? $vim /etc/default/tftpd-hpa
?????? 修改 “/var/lib/tftpboot ” 為 “/tftpboot”
?????? 修改"--secure" 為 "--secure -c" 允許上傳新文件
??? <4>. 若/tftpboot 不存在,創建該目錄
?????? $sudo mkdir /tftpboot
?????? $sudo chmod 777 /tftpboot
??? <5>. 重啟 tftpd-hpa 服務
?????? $sudo service tftpd-hpa restart
?????? 若服務重啟成功,能查看到相應的進程
?????? $ps -ef |grep in.tftpd
?????? 至此tftp 服務已經安裝完成了,下面可以對其進行一下測試。 (假設在當前目錄下有一個測
?????? 試文件 test.txt)
?????? $tftp 127.0.0.1
??? ??? tftp>put test.txt
?????? Sent 1018 bytes in 0.0 seconds
?????? tftp> get test.txt
?????? Received 1018 bytes in 0.1 seconds
?????? tftp> quit
?????? $
??? 通過get 命令,可以把當前目錄下的 test.txt 文件,通過tftp 上傳到它的服務文件目錄。這
??? 時,在/tftpboot 下面會出現 test.txt 文件。通過 put 命令,可以從/tftpboot 下, 下載 test.tx t
??? 文件。這樣就驗證了 tftp 服務配置的正確性。當文件上傳與下載結束后,可以通過 quit 命
??? 令退出。
???
???
??? 安裝、配置nfs服務:
??? <1> 安裝 nfs
?????? Ubuntu 上默認是沒有安裝 nfs 服務器的,因此我們首先安裝 nfs 服務器端:
?????? $sudo apt-get install nfs-kernel-server
??? 2、配置/etc/exports
?????? nfs 允許掛載的目錄及權限在文件/etc/exports 中進行了定義。
?????? 例如,我們要將根目錄下的 rootfs 目錄共享出來,那么我們需要在/etc/exports 文件末尾添
?????? 加如下一行:/rootfs *(rw,sync,no_root_squash)
?????? 其中:/rootfs 是要共享的目錄,*代表允許所有的網絡段訪問,rw 是可讀寫權限,sync 是資
?????? 料同步寫入內存和硬盤,no_root_squash 是 nfs 客戶端分享目錄使用者的權限,如果客戶端
?????? 使用的是 root 用戶,那么對于該共享目錄而言,該客戶端就具有 root 權限。
?????? 其它nfs 常用的參數有:
?????? ro 只讀訪問
?????? rw 讀寫訪問 sync 所有數據在請求時寫入共享
?????? async nfs 在寫入數據前可以響應請求
?????? secure nfs 通過 1024 以下的安全 TCP/IP 端口發送
?????? insecure nfs 通過 1024 以上的端口發送
?????? wdelay 如果多個用戶要寫入 nfs 目錄,則歸組寫入(默認)
?????? no_wdelay 如果多個用戶要寫入 nfs 目錄,則立即寫入,當使用 async 時,無需此設置。
?????? hide 在nfs 共享目錄中不共享其子目錄
?????? no_hide 共享 nfs 目錄的子目錄
?????? subtree_check 如果共享/usr/bin 之類的子目錄時,強制 nfs 檢查父目錄的權限(默認)
?????? no_subtree_check 和上面相對,不檢查父目錄權限
?????? all_squash 共享文件的 UID 和 GID 映射匿名用戶anonymous ,適合公用目錄。
?????? no_all_squash 保留共享文件的 UID 和GID(默認)
?????? root_squash root 用戶的所有請求映射成如 anonymous 用戶一樣的權限(默認)
?????? no_root_squas root 用戶具有根目錄的完全管理訪問權限
?????? anonuid=xxx 指定 nfs 服務器/etc/passwd文件中匿名用戶的 UID
?????? anongid=xxx 指定 nfs 服務器/etc/passwd文件中匿名用戶的 GID
??? 3、重啟服務
?????? $sudo /etc/init.d/portmap restart
?????? $sudo /etc/init.d/nfs-kernel-serverrestart
??? 4、測試 nfs
?????? 此時可以運行以下命令來顯示一下共享出來的目錄:
?????? $showmount -e
?????? 或者可以使用以下命令把它掛載在本地磁盤上,例如將/rootfs 掛載到/mnt 下:
?????? $ sudo mount -t nfs localhost:/rootfs/mnt
?????? 可以運行 df 命令查看是否掛載成功。查看后可以使用以下命令卸載:
?????? $ sudo umount /mnt
?
八、Linux編譯器GCC (gcc -v 查看gcc版本)
??? ——其執行效率與一般編譯器相比平均效率要高20%~30%
??? 1.基本用法 (gcc [options] filenames)
?????? gcc *.c??./a.out
??? 2.GCC編譯流程
??? gcc通過后綴來區別輸入文件,常見類型:
?????? .c為后綴的文件:c語言源代碼文件
?????? .a為后綴的文件:是由目標文件構成的庫文件
?????? .C,.cc為后綴的文件:是c++源代碼文件
?????? .h為后綴的文件:頭文件
?????? .o為后綴的文件:是編譯后的目標文件
?????? .s為后綴的文件:是匯編語言源代碼文件
?????? .m為后綴的文件:Objective-C原始程序
?????? .so為后綴的文件:編譯后的動態庫文件
?
?????? 源程序, 預處理,編譯,匯編,連接,可執行
?????? 預處理階段: 條件編譯,頭文件包含,宏替換的處理
?????? 預處理 gcc -E test.i test.c?? // gcc-E test.c -o test.i 輸入為源代碼輸出為源代碼(文本文件)(不作語法檢查)
?????? 編譯gcc -S test.c -o test.s???? //輸入為預處理源代碼,輸出為匯編源代碼(intel的匯編指令)(文本文件)(做語法檢查,需函數的原型聲明)
?????? 匯編gcc -c test.c -o test.o???? #輸入為匯編源碼,輸出的二進制代碼不能被執行(不含庫函數的二進制文件)
?????? .so 的庫文件
?????? 連接gcc test.o -o test?? (和庫文件進行連接)
?
?
??? 3.gcc編譯選項
?????? -o output_option:確定可執行文件的名稱
?????? -O 對程序進行優化
?????????? gcc optimize.c -o optimize ? ? ? ? ? ./optimize
?????????? gcc -O optimize.c -o optimize ? ? ?./optimize
?????? -c 不鏈接,生成.o為后綴的中間文件
?????? -g 長生調試工具所需要的符號信息
?????? -Wall 生成所有警告
?????? -w 不生成任何警告
?????? -DMACRO 定義MACRO宏,等效于在程序中使用#define MACRO
?
九、Linux調試器GDB
GUN的調試程序gdb,用來調試c和 c++ 程序的調試器
設置所有能影響程序運行的參數
指定條件下停止運行
?
gdb調試的對象是可執行文件而不是程序的源代碼文件
需在執行gcc指令編譯程序時,加上-g,才能調試
gdb使得機器碼和源代碼相關聯
??? gcc -g -o debugme debugme.c
??? gdb debugme
??? 斷點break?? 行號/函數/文件名:行號(函數名)
??? break(b)?25
??? break main
??? info break:查看斷點y表示生效n表示失效
??? disable+斷點號?? 斷點失效
??? enable + 斷點號
??? run(r) 啟動程序
??? print i??查看變量的值
??? step(s) 執行一行停到下一行 ;會進入子程序內部;跳到子程序中
??? next??執行一行停到下一行 ;把子函數當成單步執行
??? quit? 退出調試
??? continue 跳到下一個斷點處
??? finish 結束子程序的運行
??? Enter: 進行上一步的操作
?
??? gdb -d 目錄名???? 指出源碼所在位置
??? print arry[0]@5?? 查看連續的存儲單元的值
??? p/x arry[0]@5?? 以十六進制顯示
??? print &i
??? print *arry
??? break 37 if i==15? :條件斷點, 當i==15時才停下來
??? watch 設置監視點(監視表達式的變換)(變量)
??? break 制定了特定的位置(監視某位置)
??? watch j :j的變量變換就會停下來
??? continue
??? rwatch 設置讀監視點
??? set variable i=100 運行時人工改變變量的值
??? return 返回值
??? where 和backtrace???? 顯示程序運行位置和函數調運棧
??? up , down :遍歷函數調運棧
??? up 上升一個函數調運棧
??? down
??? print?main::i
??? list 列出當前運行行附近的行
??? whatis i??:i是什么類型
??? whatis main
??? ptype :明細顯示變量和函數的數據類型
??? search 搜索字符串
??? revarse search
??? shell pwd????????? 執行shell命令
??? info file????? 顯示調試文件的信息
??? info func??????? 顯示函數名
??? info local 局部變量的信息
??? info prog??顯示調試程序的執行狀態
??? set args調試加參數:set args 參數1 參數2
?
十 segement fault
1.段錯誤產生原因:數組訪問越界 訪問空指針 棧溢出 修改只讀內存
2.通過ulinit命令打開/關閉core dump功能
??? 打開:ulimit-c unlimited
??? 關閉:ulimit-c 0
??? ulimit -c 1000 ---指定大小
3.core文件分析
??? gdb 程序名 core文件名
4.什么時候不產生core文件
??? (a)進程是設置-用戶-ID,而且當前用戶并非程序文件的所有者;
??? (b)進程是設置-組-ID,而且當前用戶并非該程序文件的組所有者;
??? (c)用戶沒有寫當前工作目錄的許可權;
??? (d)文件太大。core文件的許可權(假定該文件在此之前并不存在)通常是用戶讀/寫,組讀和其他讀。
??? ?
5.解決方法
??? (1) 利用gdb逐步查找段錯誤
??? (2) 分析Core文件
??? (3) 段錯誤時啟動調試
??? (4) 利用backtrace和objdump進行分析 (objdump -d a.out)?
?
?
總結
- 上一篇: 【SBUS,串口DMA】用STM32F4
- 下一篇: VS2003升级VS2010修改