vim 和 gcc 的使用

Linux-編輯器 vim的使用
vim 的三種模式:
 1.普通模式(命令/正常模式)(用vim 初次打開的默認模式)
   控制屏幕光標的移動,字符、字或行的刪除,移動複製某區段及進入Insert mode下,或者到 last line mode
 2.插入模式
   只有在Insert mode下,纔可以做文字輸入,按「ESC」鍵可回到命令行模式。該模式是我們後面用的最頻繁的編輯模式。
 3.底行模式
   文件保存或退出,也可以進行文件替換,找字符串,列出行號等操作。 在命令模式下,shift+: 即可進入該模式。要查看你的所有模式:打開vim

模式轉換
插入模式

按「i」切換進入插入模式「insert mode」,
       按“i”進入插入模式後是從光標當前位置開始輸入文件;
按「a」進入插入模式後,是從目前光標所在位置的下一個位置開始輸入文字;
按「o」進入插入模式後,是插入新的一行,從行首開 (光標換行)

命令模式

按[EXC] 鍵

普通模式切換至底行模式

「shift + ;」, 其實就是輸入「:」

插入模式下的操作
移刪復替撤改跳

移動光標

vim可以直接用鍵盤上的光標來上下左右移動,但正規的vim是用小寫英文字母
「h」、控制光標左移一格
「j」、控制光標下移一格
「k」、控制光標上移一格
「l」、控制光標右移一格
「w」、光標跳到下一個字的字首
「b」、光標跳到上一個字的字首,包含當前字
「e」、光標跳到下一個字的字首,包含當前字
按「G」:移動到當前文本的尾部
按「 $ 」:移動到光標所在行的“行尾”
按「^」:移動到光標所在行的“行首”
按「w」:光標跳到下個字的開頭
按「e」:光標跳到下個字的字尾
按「b」:光標回到上個字的開頭
按「#l」:光標移到該行的第#個位置,如:5l,56l
按[gg]:回到當前文本的頭部
按[shift+g]:進入文本末端
按「ctrl」+「b」:屏幕往“後”移動一頁
按「ctrl」+「f」:屏幕往“前”移動一頁
按「ctrl」+「u」:屏幕往“後”移動半頁
按「ctrl」+「d」:屏幕往“前”移動半頁

刪除文字

「x」:每按一次,刪除光標所在位置的一個字符
「num x」:例如,「6x」表示刪除光標所在位置的“後面(包含自己在內)”6個字符
「X」:大寫的X,每按一次,刪除光標所在位置的“前面”一個字符
「num X」:例如,「20X」表示刪除光標所在位置的“前面”20個字符
「dd」:刪除光標所在行
「num dd」:從光標所在行開始刪除num行

複製

「yw」:將光標所在之處到字尾的字符複製到緩衝區中。
「#yw」:複製#個字到緩衝區
「yy」:複製光標所在行到緩衝區。
「#yy」:例如,「6yy」表示拷貝從光標所在的該行“往下數”6行文字。
「p」:將緩衝區內的字符貼到光標所在位置。
       注意:所有與“y”有關的複製命令
       都必須與“p”配合才能完成複製與粘貼功能。

替換

「r」:替換光標所在處的字符。
「R」:替換光標所到之處的字符,直到按下「ESC」鍵爲止。

撤銷上一次操作

「u」:如果您誤執行一個命令,可以馬上按下「u」,回到上一個操作。
        按多次“u”可以執行多次恢復。
「ctrl + r」: 撤銷的恢復

更改

「cw」:更改光標所在處的字到字尾處
「c#w」:例如,「c3w」表示更改3個字

跳至指定行

「ctrl」+「g」列出光標所在行的行號。
「#G」:例如,「15G」,表示移動光標至文章的第15行行首。

linux-編輯器 gcc/g++的使用

gcc使用格式(編譯C語言)

gcc [選項] 要編譯的文件 [選項] [目標文件]

  通常我們所寫的.c/.cpp文件,在VS,dev這些編輯器中,都是只需要我們按一個運行的按鈕,就可以看到程序的執行結果,但是實際上代碼的運行並不是這樣一步到位的,編輯器會自動幫我們所編輯的.c/.cpp文件,在程序執行的過程中進行預處理,編譯,彙編和連接,最後生成可運行的.exe文件。
直接產生可執行文件

gcc [.c文件] -o 要生成的文件名 -g

1.預處理(進行宏替換)階段
  預處理功能主要包括宏定義,文件包含,條件編譯,去註釋等。就是將以#開始的頭文件展開,define和typedef 宏定義的名稱進行替換,去掉註釋,生成一個.i文件

gcc –E hello.c –o hello.i

選項“-E”,該選項的作用是讓 gcc 在預處理結束後停止編譯過程。
選項“-o”是指目標文件,“.i”文件爲已經過預處理的C原始程序。

2.編譯(生成彙編)
  在這個階段中,gcc 首先要檢查代碼的規範性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,gcc 把代碼翻譯成彙編語言。可以使用“-S”選項來進行查看,該選項只進行編譯而不進行彙編,生成彙編代碼。

gcc –S hello.i –o hello.s

3.彙編(生成機器可識別代碼)
  彙編階段是把編譯階段生成的“.s”文件轉成目標文件。此時可使用選項“-c”就可看到彙編代碼已轉化爲“.o”的二進制目標代碼了,生成.obj文件

gcc –c hello.s –o hello.o

4.鏈接(生成可執行文件或庫文件)
  在成功編譯之後,就進入了鏈接階段,生成可以執行的.exe文件

gcc hello.o –o hello

所涉及到的函數庫,一般有兩種,一種是靜態庫,另一種是動態庫。
 靜態庫:在鏈接的時候進行靜態鏈接,把可能使用的函數全部展開到可執行文件中,導致運行時文件所佔內存會比較大,這樣做會使得代碼在不同的環境中也可以運行,不需要依賴其他的庫。
 動態庫:在鏈接的時候進行動態鏈接,在執行的時候,只是把需要的庫進行展開到可執行文件中,這樣產生的文件大小會比較小,可以節省系統的開銷,但是在不同的環境中不一定可以運行,轉換後的環境必須要有該程序所使用的庫。 一般使用動態鏈接

Linux-調試器 gdb的使用
1.事前

r或run:運行程序。
list或l 行號:顯示binFile源代碼,接着上次的位置往下列,每次列10行。
list或l 函數名:列出某個函數的源代碼。
info(或i) breakpoints:參看當前設置了哪些斷點
disable breakpoints:禁用斷點
enable breakpoints:啓用斷點
delete breakpoints:刪除所有斷點
delete breakpoints n:刪除序號爲n的斷點
s或step:進入函數調用(逐語句調試  F11)
n 或 next:單條執行(逐過程調試 F10)
print(p):打印變量的值,通過表達式可以修改變量的值或者調用函數

2.事中

將gdb附加到進程上面
dgb -p [pid]
gdb attch [pid]
pid  ==  ps aux | grep [可執行程序]
|  管道符

3.事後(程序崩潰的情況)
產生coredump文件

ulimit -a  -->core file size  -->unlimited

  如果core file size 的空間足夠大,但是磁盤的空間不足,也有可能不會產生coredump文件
  如果core file size 的值爲0,則需要把產生文件的大小調整一下。
ulimit -c unlimited

eg:解引用空指針產生程序崩潰,產生coredump文件

#include<stdio.h>
int main()
{
     int* p=NULL;
     *p=10;
     printf("haha\n");                                                       
     
     return 0;
}

排查錯誤的步驟:
 1.知道當前代碼崩潰時調用堆棧的信息,根據調用堆棧信息,確定代碼崩潰在哪一行
 2.配合源代碼查看對應行代碼是否有崩潰的風險,分析當前崩潰是不是由該風險導致的,eg:訪問野指針,解引用空指針,內存越界(難排查)等。

gdb o core.16653
bt 調用堆棧

make/makefile
 1.make解釋器解釋編譯規則的文件是 makefile/Makefile
 2.makefile的編譯規則
目標對象:依賴對象
(一個tab鍵)編譯命令

 3.解釋規則
  1.對比目標對象和依賴對象的最後一次修改時間,如果目標對象最後一次修改的時間距離現在比較近,則認爲目標對象比較新,則不會重新生成目標對象。反之,則認爲依賴對象比較新,則重新執行編譯命令,生成目標對象。
  2.永遠只爲了生成第一個目標對象而服務,如果有多個目標對象,則從上向下,執行找到的第一個依賴對象。
  3.如果依賴對象不存在,則會在當前makefile的編寫規則下去查找生成依賴對象的方法(遞歸執行)。(-c 指到彙編就停止,不再繼續鏈接)

  4.如果沒有依賴對象的生成方法,則make會補全依賴對象的生成方法,但是依賴對象的名稱和源碼文件名稱是強相關的,也就是說如果依賴對象名稱和源碼文件不相同則不會補全命令
預定義變量:
 $^ :所有依賴對象
  $@ :目標對象
 #< :第一個依賴對象

清理:

clean -->清理命令

僞目標:使當前定義爲僞目標的對象,一直生成,也就是說,不會參考最後一次修改時間

.PHONY:[後面加定義僞目標的名稱]

自定義變量:

BIN/SRC/OBJ
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章