20145212 《信息安全系統設計基礎》第2周學習總結
教材學習內容總結
Vim基本操作
- 1.使用vim命令進入vim界面
vim后面加上你要打開的已存在的文件名或者不存在(則作為新建文件)的文件名。 打開Xfce終端,輸入以下命令$ vim practice_1.txt
直接使用vim也可以打開vim編輯器,但是不會打開任何文件。$ vim
進入命令行模式后輸入:e 文件路徑 同樣可以打開相應文件。
- 2.游標移動
按Esc進入普通模式,在該模式下使用方向鍵或者h,j,k,l鍵可以移動游標
按鍵 | 說明 |
---|---|
h | 左 |
l | 右 |
j | 下 |
k | 上 |
w | 移動到下一個單詞 |
b | 移動到上一個單詞 |
- 3.進入插入模式
在普通模式下使用下面的鍵將進入插入模式,并可以從相應的位置開始輸入
命令 | 說明 |
---|---|
i | 在當前光標處進行編輯 |
I | 在行首插入 |
A | 在行末插入 |
a | 在光標后插入編輯 |
o | 在當前行后插入一個新行 |
O | 在當前行前插入一個新行 |
cw | 替換從光標所在位置后到一個單詞結尾的字符 |
注意每次要先回到普通模式才能切換成以不同的方式進入插入模式
- 4.保存文檔
命令行模式下保存文檔
從普通模式輸入:進入命令行模式,輸入w回車,保存文檔。輸入:w 文件名可以將文檔另存為其他文件名或存到其它路徑下
- 5.退出vim
1.命令行模式下退出vim從普通模式輸入:進入命令行模式,輸入wq回車,保存并退出編輯
2.以下為其它幾種退出方式:
命令 | 說明 |
---|---|
:q! | 強制退出,不保存 |
:q | 退出 |
:wq! | 強制保存并退出 |
:w | 另存為 |
:saveas 文件路徑 | 另存為 |
:x | 保存并退出 |
:wq | 保存并退出 |
3.普通模式下退出vim普通模式下輸入Shift+zz即可保存退出vim
- 6、刪除文本
1.普通模式下刪除vim文本信息
進入普通模式,使用下列命令可以進行文本快速刪除:
命令 | 說明 |
---|---|
x | 刪除游標所在的字符 |
X | 刪除游標所在前一個字符 |
Delete | 同x |
dd | 刪除整行 |
dw | 刪除一個單詞(不適用中文) |
d$或D | 刪除至行尾 |
d^ | 刪除至行首 |
dG | 刪除到文檔結尾處 |
d1G | 刪至文檔首部 |
除此之外,還可以在命令之前加上數字,表示一次刪除多行,如:2dd
表示一次刪除2行
GCC基本操作
- 預處理:gcc –E hello.c –o hello.i;gcc –E調用cpp
- 編 譯:gcc –S hello.i –o hello.s;gcc –S調用ccl
- 匯 編:gcc –c hello.s –o hello.o;gcc -c 調用as
- 鏈 接:gcc hello.o –o hello ;gcc -o 調用ld
Tips:
1.Linux的可執行文件并沒有像 Windows 那樣有明顯的.exe后綴名, 只需向其分配x(可執行)權限即可 sudo chmod u+x excutefile
2.作為Linux程序員,我們可以讓gcc在編譯的任何階段結束,以便檢查或使用該階段的輸出(這個很重要)
GDB基本操作
- 建議使用CGDB,比GDB好用,熟悉VC的調試方式,可以使用DDD。
- 注意使用GCC編譯時要加“-g”參數。 參考gdb參考卡GDB最基本的命令有:
0.gdb programm(啟動GDB)
1.l 列出源碼,相當于list
2.b 設斷點(要會設4種斷點:行斷點、函數斷點、條件斷點、臨時斷點)
3.run 開始運行程序
4.bt 打印函數調用堆棧
5.p 查看變量值
6.c 從當前斷點繼續運行到下一個斷點
7.n 單步運行
8.s 單步運行
9.quit 退出GDB
- 注:啟動gdb的方法有以下幾種:
gdb <program> program
也就是執行文件,一般在當前目錄下。gdb <program> core
用gdb同時調試一個運行程序和core文件,core是程序非法執行后,core dump后產生的文件。gdb <program> <PID>
如果程序是一個服務程序,那么可以指定這個服務程序運行時的進程ID。gdb會自動attach上去,并調試它。program應該在PATH環境變量中搜索得到。 gdb啟動時,可以加上一些gdb的啟動開關,詳細的開關可以用gdb -help查看。下面只列舉一些比較常用的參數:-symbols <file> -s <file>
從指定文件中讀取符號表。-se file
從指定文件中讀取符號表信息,并把它用在可執行文件中。-core <file> -c <file>
調試時core dump的core文件。-directory <directory> -d <directory>
加入一個源文件的搜索路徑。默認搜索路徑是環境變量中PATH所定義的路徑。
截圖:
Makefile的使用
使用參考了實驗樓的教程,就不在此復制粘貼了……
教材學習中的問題和解決過程
- 問題一:GDB的n(next)命令讓GDB執行下一行,然后暫停。 s(step)命令的作用與此類似,只是在函數調用時step命令會進入函數,那么實際使用中應該優先選用哪個?為什么?
GDB的next命令讓GDB執行下一行,然后暫停。step命令的作用于此類似,只是在函數調用時step命令會進入函數,而next導致程序執行的暫停出現在下次調用函數時。DDD有對應的Next和Step菜單項。
答:next:執行一行源代碼但不進入函數內部。
step :執行一行源代碼而且進入函數內部。
我認為應該優選step,通過GDB的next命令一次是移動一行代碼,而通過step命令單步調試一段時間,更能夠仔細檢查靠近斷點處的程序狀態和行為。
代碼調試中的問題和解決過程
- 1.在進行實驗樓實驗的學習中,代碼編譯出現一個錯誤:
- 2.經過對div.c的檢查,刪除了一個不小心打上的~號之后,成功
- 3.但是運行的結果中div一直是0,經過思考,應該是由于div.c中的a和b都是int型的,要想進行double運算需要一個類型轉換所導致。
- 4.但是,不論是強制類型轉換還是在div.c中變成return (a+0.0)/b,得到的結果依舊都是0.0000……
- 5.我嘗試在Windows的VC++中編譯了相同的程序,得到的結果卻是正確的!!!
- 6.陷入沉思……并不知道為什么?難道是因為不同系統的規定不一樣……?
- 7.把上述代碼中除了main函數外的代碼制作成一個靜態庫math.a和一個共享庫math.so
- 8.編寫makefile,讓代碼編譯,上述靜態庫和共享庫的使用自動化。
課程學習中的問題和解決過程
- 一、在vim下載過程中出現以下問題
E: 無法獲得鎖 /var/cache/apt/archives/lock – open (11 資源臨時不可用)
E: 無法鎖定下載目錄
解決方法:方法一 命令:ps -aux 列出進程 找到最后一列以apt-get 開頭的進程 命令:sudo kill 該進程的PID
方法二: sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock
- 二、在Ubuntu下使用git上傳代碼:
1.首先,我按照在百度上找到的教程生成公鑰:
2.然而,在添加過公鑰進行鏈接測試的時候出現了問題:
無法連接……這個問題各種查資料……重新生成公鑰等等擺弄了半天都沒有成功,然而最后驚覺我使用的是開源中國而不是github……咳……
3.接下來進行正確的git連接,還是出現了問題:經過百度,在一個全英文的網頁上看到了奇怪的解決方法:
4.最終連接成功:
5.推送(一部分代碼):
家庭作業中的問題和解決過程
7.7 不改變任何變量名字,修改7.6.1中的bar5.c,使得fool5.c輸出x和y的正確值
答:輸出錯誤的原因是全局符號x被多重定義,若想輸出正確的值,可以將bar5.c中的x變成局部變量,將其移到void f()的括號中就可以了。7.8
答:
A.main.1,main.2;
B.UNKNOWN;
C.ERROR.7.9 的程序當在Linux系統中編譯和執行時,即使p2不初始化變量main,它也能打印字符串“0x55\n”并正常終止。你能解釋這一點嗎?
答:p2中的main是弱符號,鏈接器會把bar6.c中的main引用為foo6.c中的main,打印出來的應該是main函數指令第一個字節的地址。7.10 給出使得靜態鏈接器能夠解析所有符號引用的最小的命令行:
答:
A.gcc p.o libx.a p.o
B.gcc p.o libx.a liby.a libx.a
C.gcc p.o liby.a libx.a liby.a libz.a
本周代碼托管截圖
其他
感覺這周要學習的內容好多啊,不過更多的是學習一些在Ubuntu下的Vim基本操作以及一些很基礎的原理。
這周即使按照課本以及實驗樓的實驗過了一遍還是覺得在實際用起來的時候很生疏,希望以后的學習中可以不斷鞏固。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
第一周 | 0/0 | 2/2 | 10/10 | |
第二周 | 300/300 | 3/3 | 20/30 |
參考資料
- Makefile使用 - 實驗樓
- 《深入理解計算機系統V2》學習指導
- GDB調試
- 簡明Vim練級攻略
- Linux makefile 教程 非常詳細,且易懂
- Linux系統編程 實驗樓