提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
前言
Linux調試器-gdb使用
1. 背景
2. 開始使用
馮諾依曼體系結構
總結
前言
世上有兩種耀眼的光芒,一種是正在升起的太陽,一種是正在努力學習編程的你!一個愛學編程的人。各位看官,我衷心的希望這篇博客能對你們有所幫助,同時也希望各位看官能對我的文章給與點評,希望我們能夠攜手共同促進進步,在編程的道路上越走越遠!
提示:以下是本篇文章正文內容,下面案例可供參考
Linux調試器-gdb使用
1. 背景
- 程序的發布方式有兩種,debug模式和release模式
- Linux gcc/g++出來的二進制程序,默認是release模式
- 要使用gdb調試,必須在源代碼生成二進制程序的時候, 加上-g選項
debug版本可調試,那是因為編譯器形成可執行程序的時候,會給可執行程序添加添加調試信息;而release版本不能調試。
2. 開始使用
gdb binFile(文件)? ?退出:ctrl + d 或 quit? ?
調試命令:
- list/l (list簡寫) + 行號:顯示binFile源代碼,接著上次的位置往下列,每次顯示10行(一般是從這一行的上下文的代碼開始顯示);如果向繼續顯示下面的代碼,可以按回車,每次顯示10行。
- list / l + 函數名 :?行號:默認從函數名的第幾行號開始,默認顯示10行。
- list / l + 文件名 :?行號:默認從文件的第幾行開始,默認顯示10行。
- r或run:(或重新)運行程序。(相當于F5,要和斷點一塊使用)
- break(b)? + (文件名) + 行號:在(文件的)某一行設置斷點。
- break + (文件名) :函數名:在某個函數開頭設置斷點。
- info / (簡寫i)?break(簡寫b) :查看打的斷點的信息。
- delete / (d) breakpoints?n(序號為n的斷點):刪除序號為n的斷點。
- disable?breakpoints(n:序號為n的斷點):禁用斷點。(序號為n的斷點不想用,但是又不想刪除掉)
- enable?breakpoints(n:序號為n的斷點):啟用斷點。
- n 或 next:單條執行。(逐過程)
- s或step:進入函數調用。(逐語句)
- p(print) + 變量名/取地址變量名:打印變量值。(可以在查看循環中的值)
- display + 變量名/取地址變量名:跟蹤查看一個變量,每次停下來都顯示它的值。(常顯示)
- undisplay + 變量前面的編號:取消對先前設置的那些變量的跟蹤。
- 斷點的本質:是幫我們縮小出問題的范圍。
- continue(或c):從當前位置開始連續而非單步執行程序。(從當前斷點直接執行到下一個斷點處。)
- finish:執行到當前函數返回(也就是結束),然后挺下來等待命令。
- until + X行號:跳轉至指定行,中間的代碼都是運行了的。比如:在循環的函數里面。
- set?var + 變量=你想要改成的值:修改變量的值。
- delete?breakpoints:刪除所有斷點。
- info(i)?locals:查看當前棧幀局部變量的值。
- quit:退出gdb。
- breaktrace(或bt):查看各級函數調用及參數。
馮諾依曼體系結構
我們常見的計算機,如筆記本。我們不常見的計算機,如服務器,大部分都遵守馮諾依曼體系。
截至目前,我們所認識的計算機,都是有一個個的硬件組件組成
- 輸入單元:包括鍵盤, 鼠標,掃描儀, 寫板等
- 中央處理器(CPU):含有運算器和控制器等
- 輸出單元:顯示器,打印機等
關于馮諾依曼,必須強調幾點:
- 這里的存儲器指的是內存
- 不考慮緩存情況,這里的CPU能且只能對內存進行讀寫,不能訪問外設(輸入或輸出設備)
- 外設(輸入或輸出設備)要輸入或者輸出數據,也只能寫入內存或者從內存中讀取。
- 一句話,所有設備都只能直接和內存打交道。
為什么要加儲存器呢?
假如我們的輸入設備和輸出設備直接和CPU連接起來,會怎么樣呢?數據從一個設備流到另一個設備,本質是拷貝過去的,而輸入設備和輸出設備的效率是非常低的,CPU的拷貝效率是非常高的,兩者之間的效率差是非常大的。(想一想木桶效應,木桶存儲水的多少,取決于最低的竹板,兩者是一樣的道理)
這時候加上存儲器的話,讓輸入設備給存儲器拷貝數據,存儲器給CPU拷貝數據,CPU對數據緊進行處理后,返回給存儲器,然后存儲器將數據拷貝到輸出設備上。以前CPU是直接在外設上拷貝數據,現在變成了CPU直接從存儲器上拷貝數據(這兩的拷貝效率會更快),而外設的拷貝只用作用到存儲器就可以了。而存儲器一次性可以存儲大量的數據,大大提高了運行的效率。存儲器比寄存器的內存容量更大,價格更低,性價比更高,適合廣大民眾。
結論:
在硬件數據流動角度,在數據層面:
1、CPU不和外設直接打交道,CPU只和內存打交道;
2、外設(輸入和輸出設備)的數據,不是直接給CPU的,而是要先放入到內存中。
程序運行,為什么要加載到內存?(馮諾依曼體系規定這么做的!!!)
程序=代碼+數據:程序的“代碼和數據”都要被CPU訪問;CPU只會從內存中讀取代碼和數據
程序還沒有加載到內存中的時候,在哪里?
在磁盤(外部設備),當前是二進制文件。
登錄上QQ,就代表著QQ的 .exe 的可執行程序被加載到內存當中了。
我們發的信息“你好!”,在輸入設備上會直接拷貝到內存中 ------> 存儲器將數據拷貝到CPU ----> CPU對數據進行加密運算 -----> 再返回到存儲器中 ------> 拷貝到輸出設備(網卡) ------> 通過網絡傳到你朋友的輸入設備(網卡) -----> 拷貝到內存的可執行程序中 ------> 拷貝到CPU來進行解密運算 -------> 再拷貝到內存當中 -----> 拷貝到輸出設備(顯示器)上。
總結
好了,本篇博客到這里就結束了,如果有更好的觀點,請及時留言,我會認真觀看并學習。
不積硅步,無以至千里;不積小流,無以成江海。