色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

快速入門GDB

汽車電子技術 ? 來源:宅學部落 ? 作者:wit ? 2023-02-17 09:48 ? 次閱讀

GDB簡介

常在河邊走,哪有不濕鞋。經常編寫程序的人,又怎么可能不遇到bug呢?沒有遇到過bug的程序員不是真正的程序員。當程序出現了bug,我們就需要debug,常見的程序錯誤按錯誤類型來分,一般可分為兩種:

  • 編譯錯誤
  • 運行錯誤

編譯錯誤是指程序在編譯階段遇到的錯誤,比如語法錯誤、語義錯誤等。這種類型的錯誤編譯器一般會幫助我們檢查,當遇到此類錯誤時,編譯器就會停止編譯,給出錯誤或警告的信息,我們根據錯誤的提示,就可以很快解決掉。

運行錯誤是指程序在運行階段遇到的錯誤,比如段錯誤。在運行階段,為了能夠定位出現的錯誤,我們經常使用的方法是打?。簩⒊绦蜻\行過程中的一些觀察變量打印出來,看是否符合正常的程序邏輯。打印方法簡單方便,但對于一些隱藏比較深的bug,或者一些跟內存相關的bug,此時再用“打印大法”可能就愛莫能助了。此時,我們經常使用的另一種方法是:單步調試。所謂單步調試,就是我們可以獲取到控制程序運行的權限,在人工操作下,程序可以“放慢腳步”,一步一步地執行,甚至可以暫停執行,方便我們觀察各個變量、內存、寄存器的值,看是否符合我們的預期。

在Windows下調試程序,我們一般是使用集成開發環境(IDE,Integrated Development Environment )內部集成的調試器(debugger),通過菜單欄的“調試(debug)”選項,就可以讓程序進入調試模式:可以單步執行程序、暫停程序運行、觀察變量或內存的值。

Linux下調試程序,因為早期沒有成熟、好用的IDE,一般都是使用GDB來調試程序。GDB是“GNU Symblic Debugger”的縮寫,是GNU自由軟件下的一個產品,隨著版本不斷地更新迭代,目前最新的GDB版本不僅可以調試C語言程序,還可以調試C++、Go、Object-C等編譯型語言。

在Linux下開發程序,學會使用GDB是一項基本技能。在Windows下開發程序,在很多IDE內部,往往也集成了GDB,用戶可以通過圖形界面來調用GDB調試程序,也可以直接在DOS環境下直接通過GDB命令來調試程序。

教程將會帶領大家熟悉和掌握程序調試常用的GDB命令,讓我們的開發工作更加高效。

GDB安裝

很多Linux操作系統默認都已經安裝了GDB,所以在安裝GDB之前,首先要確實你的當前系統有沒有已經安裝:

# gdb -v
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

如果出現上面的版本信息,如果GDB已經安裝好了;若沒有出現上面的信息,可以使用下面的命令直接安裝:

# apt-get install gdb  Debian系列操作系統安裝命令
# yum install gdb      RedHat系列操作系統安裝命令

Linux操作系統因為開源特性,很多操作系統都是基于開源版本不斷演化,發展成不同的版本和分支。但總的來說,可以分為三大系:Fedora系、Debian系和SlackWare系。

  • RedHat系:Fedora、RHEL、CentOS等,使用yum命令安裝軟件包
  • Debian系:Ubuntu、Kali、Knopix等,使用apt-get安裝命令
  • SlackWare系:SUSE、OpenSUSE

安裝成功后,再次使用# gdb -v 命令查看是否安裝成功,如果出現gdb的版本信息,說明軟件安裝成功。

GDB源碼安裝

使用yum或apt-get命令,從官方服務器安裝的軟件包,一般都是穩定版,版本比較舊。如果想嘗鮮最先版本的GDB,可以使用源碼安裝。GDB因為是GNU開源工程,所以安裝步驟也是基本的三步:配置、編譯、安裝。

首先,要到GDB官網下載最新版本的源碼包:GDB源碼包官網地址

接下來,解壓這個源碼包,進入源碼包目錄,按照經典的三步走:配置、編譯、安裝即可。

# tar xvf gdb-10.1.tar.gz
# cd  gdb-10.1
# ./configure
# make
# make install
# gdb -v
GNU gdb (GDB) 10.1
Copyright (C) 2020 Free Software Foundation, Inc.
...

快速上手

安裝好GDB后,接下來就要快速上手GDB的使用。GDB和shell類似,采用命令行形式的命令來調試程序,GDB常用的命令也就10來個,掌握了這些常用的調試命令,基本上就可以滿足日常程序的調試需求。

第01步:編譯要調試的程序

首先,要將需要調試的源程序編譯為可執行文件。以下面的C語言程序為例:

#include 

int main(void)
{
   int sum = 0;
   int i, num;
   
   printf("breakpoint 1\\n");

   printf("input num: ");
   scanf("%d", &num);
   printf("breakpoint 2\\n");

   if(num <= 0)
       printf("input invalid!\\n");
   else
   {
       for(i = 1; i <= num; i++)
           sum += i;
       printf("sum = %d\\n", sum);
   }

   printf("breakpoint 3\\n");
   printf("goodbye!\\n");
   return 0;
}

麻雀雖小,五臟俱全,上面的C語言程序實現了數據求和的簡單功能,但包含了程序的三種基本結構:順序程序結構、選擇程序結構和循環程序結構。為方便演示,我們分別在第8行、第12行、第23行設置了三個打印斷點的函數。接下來我們編譯這個程序:

# gcc -g -O0 main.c -o a.out

生成的可執行文件a.out里都是二進制的機器指令,如果你想要源碼級調試,就需要在編譯程序時選中:debug選項(-g),生成的debug模式下的可執行文件a.out就包含了各種調試信息,其中最重要的一個信息就是:二進制機器指令和源程序代碼之間的對應關系,有了這個調試信息,當程序運行二進制機器指令的時候,就可以實時顯示對應的源代碼,更方便我們閱讀和調試。如果你在編譯的時候不使用debug模式,而使用release模式,那么程序在運行時,顯示給你的就是二進制的機器代碼或匯編指令,不適合人類閱讀。

為提高程序的運行效率和性能,編譯器在編譯程序時,往往會對源程序進行優化,比如常量折疊、緩存、內聯展開等。我們在編譯程序時,也可以通過參數來控制編譯優化級別,一般可分為如下等級:

  • -O0:不對程序進行編譯優化,默認的優化等級
  • -O1:可以減少目標文件的體積和程序執行時間
  • -O2:在-O1優化的基礎上,編譯器不執行循環展開和函數內聯,增加了代碼的性能
  • -Os:在-O2優化的基礎上,專門優化目標文件的大小
  • -O3:在-O2優化的基礎上,打開了-finline-functions, -funswitch-loops等標簽

源程序經過編譯器優化后,生成的二進制和源代碼之間可能就不是一一對應的關系了。為了更好的演示源碼級調試,我們在編譯時選擇-O0選項,不對程序進行編譯優化。

第02步:進入GDB調試環境

需要調試的可執行程序a.out生成以后,接下來就可以使用gdb進行調試了,可以使用下面的命令來進入GDB調試環境,調試a.out(編譯生成的a.out文件位于/home/gdb目錄下):

root@ubuntu:/home/gdb# gdb a.out
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later //gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
//www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
   //www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out...
(gdb) r
Starting program: /home/gdb/a.out
breakpoint 1
input num: 3
breakpoint 2
sum = 6
breakpoint 3
goodbye!
[Inferior 1 (process 2768) exited normally]
(gdb) q
root@ubuntu:/home/gdb#

當我們使用# gdb a.out時,就會進入交互式的gdb調試環境,運行run(可簡寫為 r)命令即可啟動a.out的運行。程序在運行過程中的輸出、輸入和正常運行模式下一樣,程序結束后,輸入quit(可簡寫為q)命令即可退出GDB調試環境,重新返回到SHELL環境下。

第03步:設置斷點、打印變量

GDB作為一個調試器,調試器該有的功能他都有,比如:設置斷點、打印變量、單步等。我們在調試程序時,如果想讓程序在某行暫停,觀察此時的一些寄存器、變量值,此時可以通過GDB的斷點設置和變量打印功能來實現。

接下來就給大家演示下如何設置斷點和打印變量:

root@ubuntu:/home/gdb# gdb a.out
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out...
(gdb) b 8
Breakpoint 1 at 0x11cb: file main.c, line 8.
(gdb) b 12
Breakpoint 2 at 0x1200: file main.c, line 12.
(gdb) b 23
Breakpoint 3 at 0x1252: file main.c, line 23.
(gdb) r
Starting program: /home/gdb/a.out

Breakpoint 1, main () at main.c:8
8     printf("breakpoint 1\\n");
(gdb) print sum
$1 = 0
(gdb) c
Continuing.
breakpoint 1
input num: 3

Breakpoint 2, main () at main.c:12
12     printf("breakpoint 2\\n");
(gdb) c
Continuing.
breakpoint 2
sum = 6

Breakpoint 3, main () at main.c:23
23     printf("breakpoint 3\\n");
(gdb) print sum
$2 = 6
(gdb) c
Continuing.
breakpoint 3
goodbye!
[Inferior 1 (process 2780) exited normally]
(gdb) q
root@ubuntu:/home/gdb#

重新進入GDB調試環境,使用break(可簡寫為b)命令可以在源代碼的具體某一行設置斷點。設置好斷點后,使用run命令即可運行程序,程序在運行過程中遇到斷點會暫停下來,程序暫停后,你可以使用print命令來打印某一個具體變量的值。

如果想要程序繼續運行,可以使用continue命令(可簡寫為c),程序會繼續運行,直到遇到下一個斷點暫停下來。如果沒有再遇到斷點,程序則會一直執行下去,直到運行結束。

如果想要程序繼續運行,可以使用continue命令(可簡寫為c),程序會繼續運行,直到遇到下一個斷點暫停下來。如果沒有再遇到斷點,程序則會一直執行下去,直到運行結束。

在設置斷點的時候,如果想查看某一行代碼的具體行數,可以使用list(可簡寫為l)命令查看部分源代碼。多次輸入list命令,GDB就會依次顯示不同的代碼片段,直到你找到要設置的斷點的行數為止。

在GDB交互環境下,當你不輸入任何命令,直接敲擊回車鍵(Enter鍵)時,GDB會默認執行上一次你輸入的命令。所以,當你需要多次運行同一個命令時,不需要每次都輸入相同的命令,直接回車,就可以多次重復執行一個命令了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 運行
    +關注

    關注

    0

    文章

    25

    瀏覽量

    15399
  • 編譯
    +關注

    關注

    0

    文章

    657

    瀏覽量

    32860
  • DEBUG
    +關注

    關注

    3

    文章

    93

    瀏覽量

    19910
收藏 人收藏

    評論

    相關推薦

    使用GDB調試Linux應用程序

    本篇講解使用GDB調試Linux應用程序,以下以 `hellowld.c` 為例介紹 GDB 的調試入門。
    發表于 06-27 15:48 ?462次閱讀

    什么是GDB?GDB的基本功能和命令總結

    GDB是嵌入式軟件工程師調試用的比較多的一種工具,今天就來簡單分享一下GDB相關命令。
    的頭像 發表于 11-07 09:15 ?3834次閱讀

    ISE,Keil C和ICCAVR快速入門指南

    ISE,Keil C和ICCAVR快速入門指南:ISE6.2I快速入門介紹,Keil C快速入門
    發表于 11-01 23:20 ?0次下載
    ISE,Keil C和ICCAVR<b class='flag-5'>快速</b><b class='flag-5'>入門</b>指南

    gdb使用指南

    gdb使用指南 使用GDB:    本文描述GDB,GNU的原代碼調試器。(這是4.12版1994年一月,GDB版本4。16) 目錄: * 摘要: &
    發表于 09-28 16:35 ?27次下載

    gdb的基本工作原理

    gdbGNUdebugger。 gdb的主要功能救死扶傷。 gdb的主要用途修復bug;分析程序結構。 gdb官方網址http://www.gnu.org/software/gdb/
    發表于 04-18 21:18 ?35次下載

    力控組態軟件快速入門

    力控組態軟件快速入門,力控組態軟件快速入門,力控組態軟件快速入門
    發表于 10-30 18:01 ?0次下載

    實例演示GDB的使用

    GDB簡介 GDB(GNU Debugger)是一個強大的命令行調試工具。一般的,在Windows下進行開發,很少操控命令行調試,調試器大多與編譯器都集成在IDE里了。 當然,在Windows下也
    的頭像 發表于 10-19 09:58 ?2696次閱讀
    實例演示<b class='flag-5'>GDB</b>的使用

    PSCOPE快速入門指南

    PSCOPE快速入門指南
    發表于 05-23 20:22 ?8次下載
    PSCOPE<b class='flag-5'>快速</b><b class='flag-5'>入門</b>指南

    GDB串行協議概述 GDB Server的作用

    1.概述做嵌入式開發時,很多時候都會使用到GDB,從底層去理解GDB的調試過程,將更加容易的理解調試的過程。 在做嵌入式開發調試時,可理解為兩個部分 嵌入式系統平臺,啟動一個debug stub
    的頭像 發表于 08-10 10:10 ?5503次閱讀
    <b class='flag-5'>GDB</b>串行協議概述 <b class='flag-5'>GDB</b> Server的作用

    【嵌入式Linux學習】調試利器之GDB快速入門指南

    1. GDB調試利器1.1. GDB簡介在單片機開發中,KEIL、IAR、ADS1.2等集成開發環境下的調試工具對程序開發有很大的幫助, 尤其是出現各種疑難雜癥的bug時,往往只能通過單步調試、堆棧
    發表于 11-02 14:06 ?12次下載
    【嵌入式Linux學習】調試利器之<b class='flag-5'>GDB</b><b class='flag-5'>快速</b><b class='flag-5'>入門</b>指南

    TileLib 快速入門指南

    TileLib 快速入門指南
    發表于 03-13 19:14 ?0次下載
    TileLib <b class='flag-5'>快速</b><b class='flag-5'>入門</b>指南

    Renesas 7542入門套件快速入門指南

    Renesas 7542 入門套件快速入門指南
    發表于 04-28 19:42 ?0次下載
    Renesas 7542<b class='flag-5'>入門</b>套件<b class='flag-5'>快速</b><b class='flag-5'>入門</b>指南

    TileLib 快速入門指南

    TileLib 快速入門指南
    發表于 07-04 20:32 ?0次下載
    TileLib <b class='flag-5'>快速</b><b class='flag-5'>入門</b>指南

    GDB調試里怎么設置斷點

    本篇講解使用GDB調試Linux應用程序,以下以 hellowld.c 為例介紹 GDB 的調試入門: 設置斷點 ??disable?????????????????#?禁用所有斷點
    的頭像 發表于 10-04 16:10 ?1207次閱讀

    如何使用linux下gdb來調試python程序

    如何使用linux下gdb來調試python程序? 在Linux下,可以使用GDB(GNU調試器)來調試Python程序。GDB是一個強大的調試工具,可以幫助開發者診斷和修復程序中的錯誤。在本文
    的頭像 發表于 01-31 10:41 ?2596次閱讀
    主站蜘蛛池模板: 免费人成网站永久| 国产精品久免费的黄网站| 越南女 黑人 痛苦 大叫| 校园全肉高h湿一女多男| 日韩精品 中文字幕 有码| 欧美一夜爽爽爽爽爽爽| 美女搞鸡网站| 美女夫妻内射潮视频| 免费A级毛片无码无遮挡内射| 久久女婷五月综合色啪| 久久99r66热这里只有精品| 娇妻中日久久持久久| 黑丝女仆恋上我| 精品国产福利在线视频| 九九在线中文字幕无码| 九九热视频在线观看| 九九热这里只有精品2| 久久精品熟一区二区三区| 久久性色AV亚洲电影无码| 两个人的视频hd全免费| 麻豆精品传媒卡一卡二传媒短视频| 久久综合色视频| 女配穿书病娇被强啪h| 欧美精品3atv一区二区三区| 人妻换人妻AA视频| 特黄大片aaaaa毛片| 午夜看片a福利在线观看| 亚洲国产精品日本无码网站| 亚洲另类欧美综合在线| 在线看片av以及毛片| 91桃色污无限免费看| ping色堂| 国产精品久久久久影院免费| 好硬好湿好爽再深一点视频| 久久久精品久久久久特色影视| 美女厕所撒尿ass| 日本护士hd| 亚洲 无码 在线 专区| 永久免费的无码中文字幕| 99热久久久无码国产精品性麻豆 | 久久亚洲精品AV无码四区|