目錄
1、debug和release的知識
2、gdb的使用和常用指令介紹:
(1)、windows下調試的功能:
(2)、進入和退出:
(3)、調試過程中的相關指令:
3、調試究竟是在干什么?
?前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家
點擊跳轉到網站
1、debug和release的知識
(1)、debug形成的可執行程序會給我們加上調試信息,這部分調試信息也會占用空間,但我們用戶是不需要這些調試信息的,用戶需要更快的下載和安裝,所以debug模式一般是方便開發人員進行調試,而用戶得到的應該是release版本。
(2)、release形成的可執行程序不會給我們調試信息,占用內存較小,所以也是測試人員和用戶得到的版本。
(3)、gcc/g++編譯時默認是release模式,所以直接編譯來的文件是不能用于調試的。
gcc的默認行為:
(1)默認是動態鏈接的
(2)默認是release模式發布的
(4)、如何讓gdb以debug模式發布?
在編譯的時候,使用 -g 命令:
然后使用make,生成可執行文件mybin后,使用指令:
gdb mybin
這樣就進入了調試模式。如果不加-g選項,生成的可執行文件是release模式,是進不去調試模式的。
(5)、我們分別在debug和release模式下生成可執行文件,發現如下:
會發現debug模式下的可執行文件的文件大小會比release模式下的要大,大的那部分就是增加的調試信息。
2、gdb的使用和常用指令介紹:
(1)、windows下調試的功能:
1、運行起來才能調試;
2、調試的時候需要看到代碼;
3、打斷點功能;
4、可以局部調試;
5、可以看到相關局部變了的內容和地址;
6、可以查看調用堆棧
7、逐語句和逐過程調試;
linux所做的就是需要平替windows里面的功能
(2)、進入和退出:
1、進入:輸入指令gdb或者gdb+可執行文件名,即可進入調試功能;
gdb mybin-2
2、退出:輸入指令 quit
quit
(3)、調試過程中的相關指令:
(1)、l +行號:顯示指定行號之后的代碼:
注意:gdb會自動記錄最近的一條指令,所以上次輸入指令后,直接回車可以繼續執行:
(2)、b+行號/函數名/file:行號 :對指定位置打斷點:
(3)、info? b :查看我們所打的斷點:
(4)、d+斷點編號:刪除該斷點。
注意,這里的斷點編號是我們使用info b指令后,顯示的內容的Num列:?
(5)、disable/enable + 斷點編號:禁用 / 開啟 該斷點;
(6)、n:逐過程調試(相當于F10)
(7)、s:逐語句調試(相當于F11)
(8)、run + [參數]:開始調試,若沒有斷點,則全部運行完,若有斷點,則運行到斷點處,然后就可以進行逐語句和逐過程調試。
若該程序是需要參數輸入的,此時就可以在run后面增加參數,如 run 9,則是把參數9輸入到程序。
(9)、p:顯示變量的內容和地址:
(10)、display 變量名/取地址變量:每調試一步,自動顯示改變量的內容/地址:
(11)、undisplay + 編號:取消第(10)步:
注意,這里的編號是顯示列表中的編號:
(12)、c:從一個斷點運行到下一個斷點(范圍查找)
(13)、finish:將一個函數運行結束,然后停下來(范圍查找一個函數)
(14)、until:在一個范圍內,直接運行到指定行(范圍查找)
(15)、bt:查看調用堆棧
(16)、set var name=value:修改name變量的值,進行分支(如if判斷)測試,不會改變實際變量的值。
3、調試究竟是在干什么?
首先要知道,想調試一個程序,首先需要搞懂它的代碼邏輯,不然是很困難的;
(1)、找到問題(查找、范圍查找局部逐行查找);
(2)、解決問題(配合上下文代碼);