linux下gdb的安裝與除錯
1 安裝gdb
在Debian GNU/Linux Desktop中,應用程式 >> 附件 >> Root Terminal。輸入密碼,在Root許可權下的終端下輸入:
apt-get update …… apt-get install gdb …… |
安裝時選擇y安裝好gdb。
2 gdb基本使用
用一般許可權的Termianl用vi編輯器編寫一個C程式main.c:
1 #include <stdio.h> 2 3 4 int main(void) 5 { 6 int a = 1; 7 int b = a; 8 9 printf("a = %d\tb =%d\n", a, b); 10 return 0; 11 } |
(1) 在可執行檔案中加入原始碼資訊
這個過程用gcc來完成:
gcc –g main.c –o main |
-g選項的作用是在可執行檔案中加入原始碼資訊,比如可執行檔案中第幾條機器指令對應原始碼的第幾行,但並不是把整個原始檔嵌入到可執行檔案中,而是在除錯時必須保證gdb能找到原始檔。
(2) 進入gdb
[email protected]:~/LinuxC$ gcc -g main.c -o main GNU gdb (GDB) 7.0.1-debian Copyright (C) 2009 Free SoftwareFoundation, Inc. License GPLv3+: GNU GPL version 3 or later<http://gnu.org/licenses/gpl.html> This is free software: you are free tochange and redistribute it. There is NO WARRANTY, to the extentpermitted by law. Type "showcopying" and "show warranty" for details. This GDB was configured as"i486-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from/home/lly7/LinuxC/main...done. (gdb) |
gdb提供一個類似Shell的命令列環境,上面的(gdb)就是提示符,在提示符後面輸入gdb輸入的命令就可以實現其對應的功能。
(3) gdb除錯常用命令
[1] start
用start命令開始執行程式:
(gdb)start Temporary breakpoint 1 at 0x80483cd: file main.c, line 6. Starting program: /home/lly7/LinuxC/main Temporary breakpoint 1, main () at main.c:6 6 int a = 1; (gdb) |
gdb提示準備執行main.c程式的第六行程式碼。然後繼續用(gdb)提示需要輸入的命令。
[2] 單步執行(n)
(gdb)start Temporary breakpoint 1 at 0x80483cd: file main.c, line 6. Starting program: /home/lly7/LinuxC/main Temporary breakpoint 1, main () at main.c:6 6 int a = 1; (gdb) n 7 int b = a; (gdb) n 9 printf("a = %d\tb =%d\n", a, b); (gdb) n a =1 b = 1 10 return 0; (gdb) quit Adebugging session is active. Inferior 1 [process 6268] will bekilled. Quitanyway? (y or n) y [email protected]:~/LinuxC$ |
在start命令後,每輸入一個n就能夠單步執行一條語句(輸入一個命令後,直接回車表示最近輸入命令的含義)。當程式執行完時,可以輸入quit命令來推出gdb模式。
[3] gdb斷點除錯
[ break,display和continue ]
[email protected]:~/LinuxC$ gdb main …… (gdb) start …… (gdb) b 9 Breakpoint 2 at 0x80483dd: file main.c,line 9. (gdb) c Continuing. Breakpoint 2, main () at main.c:9 9 printf("a= %d\tb = %d\n", a, b); (gdb) display b 1: b = 1 (gdb) n a = 1 b= 1 10 return0; 1: b = 1 (gdb) 11 } 1: b = 1 (gdb) 0xb7ea5ca6 in __libc_start_main () from/lib/i686/cmov/libc.so.6 (gdb) Single stepping until exit from function__libc_start_main, which has no line number information. Program exited normally. (gdb) quit [email protected]:~/LinuxC$ |
gdb main會進入main可執行程式的gdb模式,start命令就使程式準備執行程式中的第一條語句。b 9是break 9的簡寫(break的引數也可以以是某個函式名,表示在此函式處設定一個斷點),表示在程式第九行設定一個斷點。c是continue的縮寫,表示執行程式,程式會在設定斷點處停下來。displayb表示將b的值顯示出來(undisplay取消對變數的跟蹤),然後再輸入單步除錯命令n(next)就可以使程式繼續執行。
可見斷點有助於快速跳過沒有問題的程式碼,然後在有問題的程式碼上慢慢走慢慢分析,“斷點加單步”是使用偵錯程式的基本方法。至於應該在哪裡設定斷點,怎麼知道哪些程式碼可以跳過而哪些程式碼要慢慢走,也要通過對錯誤現象的分析和假設來確定,以前我們用printf列印中間結 果時也要分析應該在哪裡插入printf,列印哪些中間結果,除錯的基本思路是一樣的。[ info ]
一次除錯可以設定多個斷點,用info命令可以檢視已經設定的斷點:
(gdb) b 8 Breakpoint 2 at 0x80483dd: file main.c, line 8. (gdb) b 9 Note: breakpoint 2 also set at pc 0x80483dd. Breakpoint 3 at 0x80483dd: file main.c, line 9. (gdb) i breakpoints Num Type Disp EnbAddress What 2 breakpoint keep y 0x080483dd in main at main.c:8 3 breakpoint keep y 0x080483dd in main at main.c:9 (gdb) |
[delete]
每個斷點都有一個編號(有的斷點行數不一樣,但地址卻一樣,有的地方不能夠設定斷點或者說與上一個設定的斷點等效),可以用編號指定刪除某個斷點:
(gdb) delete 3 (gdb) i breakpoints Num Type Disp Enb Address What 2 breakpoint keep y 0x080483dd in main at main.c:8 |
[條件斷點 break 和run]
gdb的斷點功能非常靈活,還可以設定斷點在滿足某個條件時才啟用,例如:
(gdb) b 9 if a == 2 Breakpoint 6 at0x80483dd: file main.c, line 9. (gdb) i breakpoints Num Type Disp Enb Address What 6 breakpoint keep y 0x080483dd in main at main.c:9 stop only if a == 2 (gdb) r The program beingdebugged has been started already. Start it from thebeginning? (y or n) y Starting program:/home/lly7/LinuxC/main a = 1 b = 1 Program exitednormally. (gdb) |
r表示從頭開始執行程式,在a==2的條件下中斷才有效。a不等於2,所以中斷無效。
[4] gdb的觀察點(watch 和c)
斷點是當程式執行到某一程式碼行時中斷,而觀察點是當程式訪問某個儲存單元時中斷,如果我們不知道某個儲存單元是在哪裡被改動的,這時候觀察點尤其有用。
(gdb) start …… (gdb) watch b Hardware watch point 8: b (gdb) c Continuing. Hardwarewatchpoint 8: b Old value =-1208147980 Newvalue = 1 |
程式執行到b儲存單元,將此執行單元執行前後的值都顯示出來。
[5] 段錯誤
如果程式執行時出現段錯誤,用gdb可以很容易定位到究竟是哪一行引發的段錯誤。在gdb中執行,遇到段錯誤會自動停下來,這時可以用命令檢視當前執行到哪一行程式碼了。gdb顯示段錯誤出現在_IO_vfscanf函式中,用bt命令可以看到是哪一個函式呼叫了它。[6] gdb基本命令
gdb有許多有用的命令如list(顯示原始碼),這樣就可以結合原始碼與除錯資訊更好的進行除錯。將gdb常用命令摘抄如下表:
命令 |
描述 |
backtrace(bt) |
檢視各級函式呼叫及引數 |
finish |
連續執行到當前函式返回為止,然後停下來等待命令 |
frame(f) 幀編號 |
選擇棧幀 |
info(i) locals |
檢視當前棧幀區域性變數的值 |
list(l) |
列出原始碼,接著上次的位置往下列,每次列十行 |
list 行號 |
列出第幾行開始的原始碼 |
list 函式名 |
列出某個函式的原始碼 |
next(n) |
執行下一行語句 |
print(p) |
打印表達式的值,通過表示式的值可以修改變數的值或者呼叫函式 |
quit(q) |
退出gdb除錯環境 |
set var |
修改變數的值 |
start |
開始執行程式,停在main函式第一行語句前面等待命令 |
step(s) |
執行下一行語句,如果有函式則進入到函式中 |
break(b) 行號 |
在某一行設定斷點 |
break 函式名 |
在某個函式開頭設定斷點 |
break… if… |
設定條件斷點 |
continue(c) |
從當前位置開始連續執行程式 |
delete breakpoints 斷點號 |
刪掉此號的斷點 |
display 變數名 |
跟蹤檢視某個變數,每次停下來都顯示它的值 |
disable breakpoints 斷點號 |
禁用此斷點 |
enable 斷點號 |
啟用此斷點 |
info(i) breakpoints |
檢視當前設定了哪些斷點 |
run(r) |
從頭開始連續執行程式 |
undisplay 跟蹤顯示行號 |
取消跟蹤顯示 |
watch |
設定觀察點 |
info(i) watchpoints |
檢視當前設定了哪些觀察點 |
x |
從某個位置開始列印儲存單元的內容,全部當成位元組來看,而不區分哪個位元組屬於哪個變數 |
disassemble |
反彙編當前函式或者指定的函式,單獨用disassemble命令是反彙編當前函式,如果disassemble命令後面跟函式名或地址則反彙編指定的函式。 |
si |
可以一條指令一條指令地單步除錯。 |
info registers |
可以顯示所有暫存器的當前值。在gdb中表示暫存器名時前面要加個$,例如p $esp可以列印esp暫存器的值。 |
set follow-fork-mode child/parent | 設定gdb在fork之後跟蹤子程序/父程序 |
set args 'command-line' | 給執行的程式傳命令列引數 |
s(stepin) | 進入子函式 |
相關推薦
Linux 下MySQL 安裝與卸載
word stat client int etc dpkg init net 是否 參考博客:http://www.cnblogs.com/steven_oyj/archive/2010/05/24/1742808.html http://www.linuxidc.com/
linux下LAMP安裝與配置
函數 rri osi ase live ins php expose share 安裝 一. Apache 安裝 yum install -y httpd啟動 /etc/init.d/httpd start備註:Apache啟動之後會提示錯誤: 正在啟動http
Redis在Linux下的安裝與配置
conf eas etc 下載 127.0.0.1 基於內存 最新 ansi lin Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。 Redis是 NoSQL技術陣營中的一員。 說到
linux下FTP安裝與配置
linux ftp pure-ftpdcd /usr/local/src/wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.42.tar.bz2 (下載pureftp源碼包)tar jxvf pure-f
linux下rsync安裝與配置
linux rsync rsync (同步數據,支持增量備份)使用方法:rsync -av 192.168.31.182:/tmp/1.txt /tmp/ (將服務器192.168.31.182中tmp文件夾下的1.txt文件拷貝到本機的tmp目錄下)rsync -av /tmp/1.tx
linux上安裝redis Linux下redis安裝與使用
Linux下redis安裝與使用 redis官網地址:http://www.redis.io/ 最新版本:2.8.3主要看這塊 &nb
Linux下GDB安裝方法
前言 gdb是Linux環境下的程式碼除錯工具,為了能在linux環境下更有好的程式設計體驗。其安裝可謂是勢在必行。 安裝過程 安裝gdb的過程很簡單,具體步驟如下: step1:首先檢查系統中有沒有安裝過,有的話用一下命令解除安裝gdb舊版本 step2:安裝
Linux下redis安裝與配置
一.下載路徑 我下載的是5.0版本 二.安裝 1.將redis-5.0.0.tar.gz檔案用ftp上傳到伺服器 2解壓 tar xzvf redis-5.0.0.tar.gz 3.進入 /root/Redis/redis-5.0.0 路徑, 執行ma
linux下redis安裝與PHP redis拓展安裝
安裝環境:1. 伺服器環境:linux / centos6.2檢視命令:cat /etc/redhat-release2. redis版本(http://download.redis.io/releases/redis-2.8.13.tar.gz)3. 預裝軟體(gcc ,
基礎教程:5、圖解Linux下JDK安裝與環境變數配置
5.1 下載JDK8 (1)百度搜索“jdk8”第一條結果就是JDK下載地址 (2)接受協議,單擊下載 (3)JDK的上傳到Linux伺服器 首先,通過XShell連線遠端伺服器; 然後,單擊工具欄中的xftp圖示,如下圖所示; 最後,將已經下載的Linux版的JDK8軟體包檔案
Linux下libevent安裝與示例
1.先用:ls -al /usr/lib | grep libevent 檢視是否已安裝,如果已安裝且版本比較低,則先通過:rpm -e libevent —nodeps 進行解除安裝。 3.切換到解壓後的 libevent 主目錄:cd libevent-2
weblogic在Linux下的安裝與配置
一、環境linux版本:RedHat 6.7 二、安裝JDK 將JDK包上傳至根目錄即可,[[email protected] /]# tar -xvf jdk-8u161-linux-x64.tar.gz [[email protected] /]#
linux下JDK安裝與主機名設定
刪除自帶openJDK rpm -qa | grep java rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.50.1.11.5.el6_3.x86_64 rpm -e --nodeps java-1.7.0-openjdk-1.
Linux環境Nginx安裝與除錯以及PHP安裝
linux版本:64位CentOS 6.4 Nginx版本:nginx1.10.2 php版本:php5.5.28 1.編譯安裝Nginx # wget http://nginx.org/download/nginx-1.10.2.tar.gz # tar -zv
Nginx在Linux下的安裝與配置,以及遇到問題的解決整理
2、將下載的資源上傳到/usr/local目錄下,注意:如果遇到檔案無法移動或報沒有許可權,應該是賬號不是root使用者,可以使用su root命令切換。 3、安裝nginx,在/usr/local下解壓nginx-1.10.0.tar.gz,並進入nginx-1.10.
Linux下Keepalived安裝與配置
一、簡介 負載平衡是一種在真實伺服器叢集中分配IP流量的方法,可提供一個或多個高度可用的虛擬服務。在設計負載均衡拓撲時,重要的是要考慮負載均衡器本身的可用性以及它背後的真實伺服器。用C編寫的類似於layer3, 4 & 7交換機制軟體,具備我們平時說
linux下nginx安裝與設定開機啟動
http://www.myhack58.com/Article/sort099/sort0102/2015/66341.htm 環境準備yum -y install gcc gcc-c++ autoconf automake make yum -y install zli
Nginx在Linux下的安裝與配置
這是本人在安裝與配置nginx時所做的一些記錄,可能有些地方寫得不夠詳細。 nginx依賴以下一些軟體庫,在安裝之前請確保安裝了這些軟體庫,它們包括:gcc,openssl,zlib,pcre(可通過rpm -q命令查詢是否已安裝),其中前三個庫可通過系統盤進行安裝,這裡僅
Zookeeper在Linux下的安裝與配置
一共三個節點 (zookeeper伺服器叢集規模不小於3個節點),要求伺服器之間系統時間保持一致。 2. 解壓zookeeper-3.4.5.tar.gz到/usr/local 下 比如安裝包在根目錄/install下 cd /install tar -zxvf
linux下gdb單步除錯
用 GDB 除錯程式 GDB 概述 ———— GDB 是 GNU開源組織釋出的一個強大的 UNIX下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像 VC、 BCB等 IDE的除錯,但如果你是在 UNIX平臺下做軟體,你會發現 GDB這個除錯工具有比