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