1編譯的時(shí)候加入調(diào)試,2運(yùn)行時(shí)設(shè)置斷點(diǎn)或單步執(zhí)行;
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、雅安服務(wù)器托管、營(yíng)銷軟件、網(wǎng)站建設(shè)、岢嵐網(wǎng)站維護(hù)、網(wǎng)站推廣。
春節(jié)時(shí)還玩來(lái)著,現(xiàn)在.....忘的差不多了
一、GDB 概述
GDB 是 GNU 開源組織發(fā)布的一個(gè)強(qiáng)大的 UNIX 下的程序調(diào)試工具?;蛟S,各位比較喜歡那種圖形界面方式的,像 VC 、 BCB 等 IDE 的調(diào)試,但如果你是在 UNIX 平臺(tái)下做軟件,你會(huì)發(fā)現(xiàn) GDB 這個(gè)調(diào)試工具有比 VC 、 BCB 的圖形化調(diào)試器更強(qiáng)大的功能。所謂 “ 寸有所長(zhǎng),尺有所短 ” 就是這個(gè)道理。
一般來(lái)說(shuō), GDB 主要幫忙你完成下面四個(gè)方面的功能:
1 、啟動(dòng)你的程序,可以按照你的自定義的要求隨心所欲的運(yùn)行程序。
2 、可讓被調(diào)試的程序在你所指定的調(diào)置的斷點(diǎn)處停住。(斷點(diǎn)可以是條件表達(dá)式)
3 、當(dāng)程序被停住時(shí),可以檢查此時(shí)你的程序中所發(fā)生的事。
4 、動(dòng)態(tài)的改變你程序的執(zhí)行環(huán)境。
從上面看來(lái), GDB 和一般的調(diào)試工具沒(méi)有什么兩樣,基本上也是完成這些功能,不過(guò)在細(xì)節(jié)上,你會(huì)發(fā)現(xiàn) GDB 這個(gè)調(diào)試工具的強(qiáng)大,大家可能比較習(xí)慣了圖形化的調(diào)試工具,但有時(shí)候,命令行的調(diào)試工具卻有著圖形化工具所不能完成的功能。讓我們一一看來(lái)。
二、一個(gè)調(diào)試示例
源程序: tst.c
[cpp] view plain copy
#include stdio.h
int func(int n)
{
int sum=0,i;
for(i=0; in; i++)
{
sum+=i;
}
return sum;
}
int main()
{
int i;
long result = 0;
for(i=1; i=100; i++)
{
result += i;
}
printf("result[1-100] = %d /n", result );
printf("result[1-250] = %d /n", func(250) );
}
編譯生成執(zhí)行文件:( Linux 下)
hchen/test cc -g tst.c -o tst
啟動(dòng)Gdb:
以上是對(duì)于gdb的感性認(rèn)識(shí),接下來(lái)系統(tǒng)地認(rèn)識(shí)一下 gdb 吧。
三、使用 GDB
1.基礎(chǔ)
一般來(lái)說(shuō) GDB 主要調(diào)試的是 C/C++ 的程序。要調(diào)試 C/C++ 的程序,首先在編譯時(shí),我們必須要把調(diào)試信息加到可執(zhí)行文件中。使用編譯器( cc/gcc/g++ )的 -g 參數(shù)可以做到這一點(diǎn)。如:
cc -g hello.c -o hello
g++ -g hello.cpp -o hello
如果沒(méi)有 -g ,你將看不見程序的函數(shù)名、變量名,所代替的全是運(yùn)行時(shí)的內(nèi)存地址。當(dāng)你用 -g 把調(diào)試信息加入之后,并成功編譯目標(biāo)代碼以后,讓我們來(lái)看看如何用 gdb 來(lái)調(diào)試他。
啟動(dòng) gdb 后,就你被帶入 gdb 的調(diào)試環(huán)境中,就可以使用 gdb 的命令開始調(diào)試程序了, gdb 的命令可以使用 help 命令來(lái)查看,
gdb 的命令很多, gdb 把之分成許多個(gè)種類。 help 命令只是例出 gdb 的命令種類,如果要看種類中的命令,可以使用 help class 命令,如: help breakpoints ,查看設(shè)置斷點(diǎn)的所有命令。也可以直接 help command 來(lái)查看命令的幫助。如下圖所示:
要退出 gdb 時(shí),只用發(fā) quit 或命令簡(jiǎn)稱 q 就行了。
2 GDB 中運(yùn)行 UNIX 的 shell 程序
在 gdb 環(huán)境中,你可以執(zhí)行 UNIX 的 shell 的命令,使用 gdb 的 shell 命令來(lái)完成:
shell command string
調(diào)用 UNIX 的 shell 來(lái)執(zhí)行 command string ,環(huán)境變量 SHELL 中定義的 UNIX 的 shell 將會(huì)被用來(lái)執(zhí)行 command string ,如果 SHELL 沒(méi)有定義,那就使用 UNIX 的標(biāo)準(zhǔn) shell : /bin/sh 。(在 Windows 中使用 Command.com 或 cmd.exe )
還有一個(gè) gdb 命令是 make :
make make-args
可以在 gdb 中執(zhí)行 make 命令來(lái)重新 build 自己的程序。這個(gè)命令等價(jià)于 “ shell make make-args ”
3 在 GDB 中運(yùn)行程序
在 gdb 中,運(yùn)行程序使用 r 或是 run 命令。程序的運(yùn)行,你有可能需要設(shè)置下面四方面的事。
1 、程序運(yùn)行參數(shù)。
set args 可指定運(yùn)行時(shí)參數(shù)。(如: set args 10 20 30 40 50 )
show args 命令可以查看設(shè)置好的運(yùn)行參數(shù)。
2 、運(yùn)行環(huán)境。
path dir 可設(shè)定程序的運(yùn)行路徑。
show paths 查看程序的運(yùn)行路徑。
set environment varname [=value] 設(shè)置環(huán)境變量。如: set env USER=hchen
show environment [varname] 查看環(huán)境變量。
3 、工作目錄。
cd dir 相當(dāng)于 shell 的 cd 命令。
pwd 顯示當(dāng)前的所在目錄。
4 、程序的輸入輸出。
info terminal 顯示你程序用到的終端的模式。
使用重定向控制程序輸出。如: run outfile
tty 命令可以指寫輸入輸出的終端設(shè)備。如: tty /dev/ttyb
今日分享開始啦,請(qǐng)大家多多指教~
linux 系統(tǒng)中采用了多用戶的管理方式使用系統(tǒng)
默認(rèn)用戶是root,有最高的權(quán)限。(在終端顯示為 #)
普通用戶為:$
在linux系統(tǒng)中沒(méi)有盤符的概念,以樹的形式管理文件
整個(gè)系統(tǒng)的根文件為 /
# 目錄結(jié)構(gòu)
linux系統(tǒng)中命令的使用
在使用linux系統(tǒng)命令的時(shí)候,嚴(yán)格區(qū)分大小寫
使用命令的語(yǔ)法: 命令 [-選項(xiàng)] 參數(shù)
clear 清屏
1.ls命令
ls 顯示文件和目錄列表(list)
常用參數(shù):
-l (long) 長(zhǎng)格式顯示文件和目錄信息
-a (all) 顯示所有文件和目錄(包含隱藏文件和目錄)
-R 遞歸顯示指定目錄下的文件清單,即會(huì)顯示指定目錄分支內(nèi)各子目錄中的文件清單。
ls -R ,會(huì)遞歸顯示目錄下的文件。
查看指定目錄下的文件
ls /(指定目錄) 例如:ls /etc
查看文件和目錄的組合使用命令
例如 ls -la 指定目錄 查看目錄下所有文件并且長(zhǎng)格式展示
2. cd 命令
cd 切換的目錄名
pwd 顯示當(dāng)前所在目錄
cd /root 回家目錄 或者 cd ~ 或者 cd 快速回家
3.常用操作文件命令
4.ls -l 長(zhǎng)格式說(shuō)明
5.網(wǎng)絡(luò)相關(guān)命令
ip addr 查看當(dāng)前服務(wù)器地址
簡(jiǎn)寫: ip a
ping ip地址 測(cè)試網(wǎng)絡(luò)連通性
會(huì)一直ping 。Ctrl+c 結(jié)束
6.壓縮相關(guān)命令
tar 命令
-c 建立一個(gè)壓縮文件的參數(shù)指令(create) 打包 .tar
-x 解開一個(gè)壓縮文件的參數(shù)指令(extract)解壓
-z 是否要用 gzip 壓縮 壓縮 .tar.gz
-v 壓縮過(guò)程中顯示文件(日志)
-f 指定打包名字,f后緊跟名字(必有)
例如: tar -zcvf linux.tar.gz aa.txt bb.txt
tar -zxvf linux.tar.gz
7.centos獨(dú)有 服務(wù)命令
systemctl
8.進(jìn)程相關(guān)
ps 查詢當(dāng)前控制臺(tái)上運(yùn)行的進(jìn)程
動(dòng)態(tài)顯示進(jìn)程 top
殺死進(jìn)程 kill
9.vi 命令
vi /vim 是linux最常用的文本編輯器,功能非常強(qiáng)大。
vi 有三種模式 :
常用命令
10.軟件相關(guān)的命令
rpm 命令 需要有rmp 的安裝包
rpm -ivh gcc-c+ 4.4.7-3.e16.x86_64.rpm
yum命令 [好用,自動(dòng)檢測(cè)依賴下載]
使用yum命令必須連接外部網(wǎng)絡(luò)。
11.用戶和組相關(guān)命令
1.查看當(dāng)前用戶:whoami
查看登錄用戶:who
退出用戶 exit
添加、刪除組賬號(hào):groupadd、groupdel
添加用戶賬號(hào):useradd
設(shè)置用戶名密碼:passwd [用戶名]
su 切換用戶
12.權(quán)限相關(guān)命令
linux 文件有三種權(quán)限,r讀,w寫,x執(zhí)行;r=4,w=2,x=1
chmod
今日份分享已結(jié)束,請(qǐng)大家多多包涵和指點(diǎn)!
如何獲???
轉(zhuǎn)發(fā)分享此文,后臺(tái)私信我:“1”即可獲取。(注:轉(zhuǎn)發(fā)分享,感謝大家)
gdb 執(zhí)行文件 #進(jìn)入gdb調(diào)試
b 函數(shù)名 #設(shè)置函數(shù)斷點(diǎn)
r #運(yùn)行程序
n #單步調(diào)試
c #運(yùn)行到下一個(gè)斷點(diǎn)
Gdb調(diào)試
注意:在Gcc編譯選項(xiàng)中一定要加入
–g
退出GDB:quit
或
Ctrl+d
調(diào)試過(guò)程:
1.
查看文件
命令:
(gdb)
l
命令:(gdb)
b
行號(hào)
注:到第17行停止,并沒(méi)有執(zhí)行17行
3.
查看斷點(diǎn)情況
info
b
4.
運(yùn)行代碼
r
命令:
(gdb)
r
(也可以指定行開始運(yùn)行,在r后面加上行號(hào))
5.
查看變量值
p
命令:(gdb)
p
變量名
6.
設(shè)置監(jiān)視點(diǎn):
watch
z
(變量名)
也可以是復(fù)雜的表達(dá)式
7.
單步運(yùn)行
命令:(gdb)
n
(逐過(guò)程)
8.逐步,會(huì)進(jìn)入函數(shù)
命令:(gdb)
s
9.條件斷點(diǎn)
將正常斷點(diǎn)轉(zhuǎn)變?yōu)闂l件斷點(diǎn):condition
如:condition
1
i
==
10
只有當(dāng)滿足條件i
==
1時(shí),才會(huì)在斷點(diǎn)1處暫停
10.
恢復(fù)程序運(yùn)行
c
命令:
(gdb)
c
(程序就會(huì)運(yùn)行,如果沒(méi)有斷點(diǎn),就運(yùn)行剩下部分,如果有斷點(diǎn),就會(huì)運(yùn)行到下一個(gè)斷點(diǎn))
11.
去除斷點(diǎn)
clear
line_number
clear
filename:line_number
12.
help
12.1
help找出類別
12.2help從列表中
Linux 下調(diào)試匯編代碼既可以用 GDB、DDD 這類通用的調(diào)試器,也可以使用專門用來(lái)調(diào)試匯編代碼的 ALD(Assembly Language Debugger)。
從調(diào)試的角度來(lái)看,使用 GAS 的好處是可以在生成的目標(biāo)代碼中包含符號(hào)表(symbol table),這樣就可以使用 GDB 和 DDD 來(lái)進(jìn)行源碼級(jí)的調(diào)試了。要在生成的可執(zhí)行程序中包含符號(hào)表,可以采用下面的方式進(jìn)行編譯和鏈接:
[xiaowp@gary code]$ as --gstabs -o hello.o hello.s
[xiaowp@gary code]$ ld -o hello hello.o
執(zhí)行 as 命令時(shí)帶上參數(shù) --gstabs 可以告訴匯編器在生成的目標(biāo)代碼中加上符號(hào)表,同時(shí)需要注意的是,在用 ld 命令進(jìn)行鏈接時(shí)不要加上 -s 參數(shù),否則目標(biāo)代碼中的符號(hào)表在鏈接時(shí)將被刪去。
匯編程序員通常面對(duì)的都是一些比較苛刻的軟硬件環(huán)境,短小精悍的ALD可能更能符合實(shí)際的需要,因此下面主要介紹一下如何用ALD來(lái)調(diào)試匯編程序。首先在命令行方式下執(zhí)行ald命令來(lái)啟動(dòng)調(diào)試器,該命令的參數(shù)是將要被調(diào)試的可執(zhí)行程序:
[xiaowp@gary doc]$ ald hello
Assembly Language Debugger 0.1.3Copyright (C) 2000-2002 Patrick Alken
hell ELF Intel 80386 (32 bit), LSB, Executable, Version 1 (current)
Loading debugging symbols...(15 symbols loaded)
ald
當(dāng) ALD 的提示符出現(xiàn)之后,用 disassemble 命令對(duì)代碼段進(jìn)行反匯編:
ald disassemble -s .text
Disassembling section .text (0x08048074 - 0x08048096)
08048074 BA0F000000 mov edx, 0xf
08048079 B998900408 mov ecx, 0x8049098
0804807E BB01000000 mov ebx, 0x1
08048083 B804000000 mov eax, 0x4
08048088 CD80 int 0x80
0804808A BB00000000 mov ebx, 0x0
0804808F B801000000 mov eax, 0x1
08048094 CD80 int 0x80
上述輸出信息的第一列是指令對(duì)應(yīng)的地址碼,利用它可以設(shè)置在程序執(zhí)行時(shí)的斷點(diǎn):
ald break 0x08048088
Breakpoint 1 set for 0x08048088
斷點(diǎn)設(shè)置好后,使用 run 命令開始執(zhí)行程序。ALD 在遇到斷點(diǎn)時(shí)將自動(dòng)暫停程序的運(yùn)行,同時(shí)會(huì)顯示所有寄存器的當(dāng)前值:
ald run
Starting program: hello
Breakpoint 1 encountered at 0x08048088
eax = 0x00000004 ebx = 0x00000001 ecx = 0x08049098 edx = 0x0000000Fesp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000
ds = 0x0000002B es = 0x0000002B fs = 0x00000000 gs = 0x00000000
ss = 0x0000002B cs = 0x00000023 eip = 0x08048088 eflags = 0x00000246
Flags: PF ZF IF
08048088 CD80 int 0x80
如果需要對(duì)匯編代碼進(jìn)行單步調(diào)試,可以使用 next 命令:
ald next
Hello, world!
eax = 0x0000000F ebx = 0x00000000 ecx = 0x08049098 edx = 0x0000000Fesp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000
ds = 0x0000002B es = 0x0000002B fs = 0x00000000 gs = 0x00000000
ss = 0x0000002B cs = 0x00000023 eip = 0x0804808F eflags = 0x00000346
Flags: PF ZF TF IF
0804808F B801000000 mov eax, 0x1
若想獲得 ALD 支持的所有調(diào)試命令的詳細(xì)列表,可以使用 help 命令:
ald help
Commands may be abbreviated.
If a blank command is entered, the last command is repeated.
Type `help command'' for more specific information on command.
General commands
attach clear continue detach disassemble
enter examine file help load
next quit register run set
step unload window write
Breakpoint related commands
break delete disable enable ignore
lbreak tbreak
當(dāng)前名稱:linux單步調(diào)試命令,如何進(jìn)行單步調(diào)試
文章URL:http://jinyejixie.com/article12/hsiegc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、App設(shè)計(jì)、電子商務(wù)、網(wǎng)站收錄、網(wǎng)站策劃、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容