在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

對GDB命令腳本做一個粗淺的介紹

嵌入式與Linux那些事 ? 來源:嵌入式與Linux那些事 ? 2023-02-06 11:41 ? 次閱讀

在shell下敲gdb命令即可啟動gdb,啟動后會顯示下述信息,出現gdb提示符。

?examplegdb
GNUgdb(Ubuntu8.1.1-0ubuntu1)8.1.1
Copyright(C)2018FreeSoftwareFoundation,Inc.
LicenseGPLv3+:GNUGPLversion3orlater
Thisisfreesoftware:youarefreetochangeandredistributeit.
ThereisNOWARRANTY,totheextentpermittedbylaw.Type"showcopying"
and"showwarranty"fordetails.
ThisGDBwasconfiguredas"x86_64-linux-gnu".
Type"showconfiguration"forconfigurationdetails.
Forbugreportinginstructions,pleasesee:
.
FindtheGDBmanualandotherdocumentationresourcesonlineat:
.
Forhelp,type"help".
Type"aproposword"tosearchforcommandsrelatedto"word".
(gdb)

測試代碼

#include
intminus(inta,intb){
printf("Inminus():
");
intc=a-b;
returnc;
}
intsum(inta,intb){
printf("Insum():
");
intc=a+b;
returnc;
}
voidprint(intxx,int*xxptr){
printf("Inprint():
");
printf("xxis%dandisstoredat%p.
",xx,&xx);
printf("ptrpointsto%pwhichholds%d.
",xxptr,*xxptr);
intc=sum(2,3);
intd=minus(3,2);
}

intmain(void){
intx=10;

int*ptr=&x;
printf("Inmain():
");
printf("xis%dandisstoredat%p.
",x,&x);
printf("ptrpointsto%pwhichholds%d.
",ptr,*ptr);

print(x,ptr);
return0;
}

設置斷點

可以在函數名和行號等上設置斷點。程序運行后,到達斷點就會自動暫停運行。

此時可以查看該時刻的變量值、顯示棧幀、重新設置斷點或重新運行等。斷點命令(break)可以簡寫為b。

格式

break斷點

舉例

(gdb)bmain
Breakpoint1at0x758:filegdb_example.c,line9.

格式

break函數名
break行號
break文件名:行號
break文件名:函數名
break+偏移量
break-偏移量
break*地址

舉例

(gdb)bprint
Breakpoint2at0x709:filegdb_example.c,line4.
(gdb)bgdb_example.c:5
Breakpoint3at0x715:filegdb_example.c,line5.
(gdb)b+3
Note:breakpoint2alsosetatpc0x709.
Breakpoint4at0x709:filegdb_example.c,line4.
(gdb)b*0x709
Note:breakpoints2and4alsosetatpc0x709.
Breakpoint5at0x709:filegdb_example.c,line4.
(gdb)

上面的例子分別對print函數,gdb_example.c第5行,現在暫停位置往后第3行,地址0x709設置斷點。

設置好的斷點可以通過info break 確認

(gdb)infobreak
NumTypeDispEnbAddressWhat
1breakpointkeepy0x0000000000000758inmainatgdb_example.c:9
2breakpointkeepy0x0000000000000709inprintatgdb_example.c:4
3breakpointkeepy0x0000000000000715inprintatgdb_example.c:5
4breakpointkeepy0x0000000000000709inprintatgdb_example.c:4
5breakpointkeepy0x0000000000000709inprintatgdb_example.c:4

顯示棧幀

backtrace命令可以在遇到斷點而暫停執行時顯示棧幀。該命令簡寫為bt。此外, backtrace的別名還有where和info stack(簡寫為info s)。

backtrace
bt

顯示所有棧幀

backtraceN
btN

只顯示開頭N個棧幀

backtrace-N
bt-N

只顯示最后N個棧幀

backtracefull
btfull
backtracefullN
btfullN
backtracefull-N
btfull-N

舉例

(gdb)b4
Breakpoint1at0x714:filegdb_example.c,line4.
(gdb)r
Startingprogram:/home/zhongyi/code/example/gdb_example
Inmain():
xis10andisstoredat0x7fffffffe2fc.
ptrpointsto0x7fffffffe2fcwhichholds10.
Inprint():
xxis10andisstoredat0x7fffffffe2cc.
ptrpointsto0x7fffffffe2fcwhichholds10.
Insum():
Inminus():

Breakpoint1,minus(a=3,b=2)atgdb_example.c:4
4intc=a-b;
#顯示棧幀
(gdb)bt
#0minus(a=3,b=2)atgdb_example.c:4
#10x00005555555547c0inprint(xx=10,xxptr=0x7fffffffe2fc)atgdb_example.c:17
#20x0000555555554841inmain()atgdb_example.c:28
#只顯示前2個棧幀
(gdb)bt2
#0minus(a=3,b=2)atgdb_example.c:4
#10x00005555555547c0inprint(xx=10,xxptr=0x7fffffffe2fc)atgdb_example.c:17
(Morestackframesfollow...)
#從外向內顯示2個棧幀,及其局部變量
(gdb)btfull-2
#10x00005555555547c0inprint(xx=10,xxptr=0x7fffffffe2fc)atgdb_example.c:17
c=5
d=21845
#20x0000555555554841inmain()atgdb_example.c:28
x=10
ptr=0x7fffffffe2fc
(gdb)

顯示棧幀后,就可以確認程序在何處停止,及程序的調用路徑。

顯示變量

格式

print變量

舉例

(gdb)px
$1=10
(gdb)pptr
$2=(int*)0x7fffffffe2fc
(gdb)

顯示寄存器

舉例

(gdb)inforeg
rax0xc12
rbx0x00
rcx0x7ffff7af2104140737348837636
rdx0x7ffff7dcf8c0140737351841984
rsi0x55555575626093824994337376
rdi0x11
rbp0x7fffffffe3100x7fffffffe310
rsp0x7fffffffe2f00x7fffffffe2f0
r80x7ffff7fe14c0140737354011840
r90x00
r100x00
r110x246582
r120x5555555545f093824992232944
r130x7fffffffe3f0140737488348144
r140x00
r150x00
rip0x5555555548410x555555554841
eflags0x202[IF]
cs0x3351
ss0x2b43
ds0x00
es0x00
fs0x00
gs0x00

寄存器前加$,可以顯示寄存器的內容。

(gdb)p$rdi
$7=1
(gdb)p$rax
$8=12
(gdb)

顯示寄存器可以用以下格式

p/格式 變量

格式 說明
x 顯示為16進制數
d 顯示為十進制數
u 顯示為無符號十進制數
o 顯示為八進制數
t 顯示為二進制數
a 地址
c 顯示為ascii
f 浮點小數
s 顯示為字符串
i 顯示為機器語言(僅在顯示內存的x命令中可用)

顯示內存

x命令可以顯示內存的內容

格式

x/格式地址

舉例

(gdb)x$r12
0x5555555545f0<_start>:xor%ebp,%ebp
(gdb)x$r8
0x7ffff7fe14c0:rclb$0xf7,(%rsi,%rdi,8)
(gdb)

x/i 可以顯示匯編指令。一般用x命令時,格式為x/NFU ADDR。此處ADDR為希望顯示的地址,N為重復次數。F為前面講過的格式,u代表的單位如下。

單位 說明
b 字節
h 半字(2字節)
w 字(4字節)
g 雙字(8字節)

下面顯示從rsp開始的10條指令。

(gdb)x/10i$rsp
0x7fffffffe2f0:(bad)
0x7fffffffe2f1:rex.Wpush%rbp
0x7fffffffe2f3:push%rbp
0x7fffffffe2f4:push%rbp
0x7fffffffe2f5:push%rbp
0x7fffffffe2f6:add%al,(%rax)
0x7fffffffe2f8:lockrex.RBpush%r13
0x7fffffffe2fb:push%rbp
0x7fffffffe2fc:or(%rax),%al
0x7fffffffe2fe:add%al,(%rax)

顯示反匯編

格式

disassemble
disassemble程序計數器
disassemble開始地址結束地址

格式1為反匯編當前整個函數,2為反匯編程序計數器所在函數的整個函數。3為反匯編從開始地址到結束地址的部分。

(gdb)disassemble
Dumpofassemblercodeforfunctionsum:
0x0000555555554722<+0>:push%rbp
0x0000555555554723<+1>:mov%rsp,%rbp
0x0000555555554726<+4>:sub$0x20,%rsp
0x000055555555472a<+8>:mov%edi,-0x14(%rbp)
0x000055555555472d<+11>:mov%esi,-0x18(%rbp)
0x0000555555554730<+14>:lea0x1bd(%rip),%rdi#0x5555555548f4
0x0000555555554737<+21>:callq0x5555555545b0
=>0x000055555555473c<+26>:mov-0x14(%rbp),%edx
0x000055555555473f<+29>:mov-0x18(%rbp),%eax
0x0000555555554742<+32>:add%edx,%eax
0x0000555555554744<+34>:mov%eax,-0x4(%rbp)
0x0000555555554747<+37>:mov-0x4(%rbp),%eax
0x000055555555474a<+40>:leaveq
0x000055555555474b<+41>:retq
Endofassemblerdump.

單步執行

執行源代碼中的一行:next
進入函數內部執行:step
逐條執行匯編指令:nexti,stepi

繼續運行

格式

continue
continue次數

指定次數可以忽略斷點,例如,continue 5 則5次遇到斷點不會停止,第6次遇到斷點才會停止。

監視點

格式

watch<表達式>

<表達式>發生變化時暫停運行,<表達式>意思是常量或變量

awatch<表達式>

<表達式>被訪問,改變時暫停運行

rwatch<表達式>

<表達式>被訪問時暫停運行

舉例

(gdb)watchc
Hardwarewatchpoint2:c
(gdb)c
Continuing.

Hardwarewatchpoint2:c

Oldvalue=21845
Newvalue=5
sum(a=2,b=3)atgdb_example.c:10
10returnc;
(gdb)

格式

刪除斷點和監視點

delete<編號>

<編號>指的是斷點或監視點

舉例

(gdb)infob
NumTypeDispEnbAddressWhat
1breakpointkeepy0x000055555555473cinsumatgdb_example.c:9
breakpointalreadyhit1time
2hwwatchpointkeepyc
breakpointalreadyhit1time
(gdb)delete2
(gdb)infob
NumTypeDispEnbAddressWhat
1breakpointkeepy0x000055555555473cinsumatgdb_example.c:9
breakpointalreadyhit1time
(gdb)

改變變量的值

格式

setvariable<變量>=<表達式>

舉例

(gdb)pc
$1=5
(gdb)setvariablec=0
(gdb)pc
$2=0
(gdb)

生成內核轉儲文件

(gdb)generate-core-file
warning:Memoryreadfailedforcorefilesection,4096bytesat0xffffffffff600000.
Savedcorefilecore.2380

有了內核轉儲文件,即使退出了GDB也能查看生成轉儲文件時的運行歷史。

gcore'pidofgdb_example'

該命令無需停止正在運行的程序,可以直接從命令行直接生成轉儲文件。當需要在其他機器上單獨分析問題原因時,或者是分析客戶現場問題時十分有用。

條件斷點

break斷點if條件

如果條件為真,則暫停運行

condition斷點編號
condition斷點編號條件

第一條指令刪除指定斷點編號的觸發條件,第二條指令給斷點添加觸發條件

反復執行

ignore斷點編號次數

在編號指定的斷點,監視點忽略指定的次數

continue與ignore一樣,也可以指定次數,達到指定次數前,執行到斷點時不暫停。

continue次數
step次數
stepi次數
next次數
nexti次數
finish
until
until地址

finish 執行完當前函數后暫停,until命令執行完當前函數等代碼塊后暫停,常用于跳出循環。、

刪除斷點或禁用斷點

clear
clear函數名
clear行號
clear文件名:行號
clear文件名:函數名
delete[breakpoints]斷點編號

clear 用于刪除已定義的斷點

disable[breakpoints]
disable[breakpoints]斷點編號
disabledisplay顯示編號
disablemem內存區域

disable 臨時禁用斷點。第3種格式禁用display命令定義的自動顯示,第4種格式禁用mem命令定義的內存區域。

enable
enable[breakpoints]斷點編號
enable[breakpoints]once斷點編號
enable[breakpoints]delete斷點編號
enabledisabledisplay顯示編號
enablemem內存區域

once 使指定的斷點只啟用一次。delete表示在運行暫停后刪除斷點。

斷點命令

格式

commands斷點編號
命令
...
end

程序在指定的斷點處暫停,就會自動執行命令。

舉例

(gdb)b17
Breakpoint3at0x5555555547b1:filegdb_example.c,line17.
(gdb)command3
Typecommandsforbreakpoint(s)3,oneperline.
Endwithalinesayingjust"end".
>pc
>end
(gdb)r
Startingprogram:/home/zhongyi/code/example/gdb_example-e'p1'
Inmain():
xis10andisstoredat0x7fffffffe2ec.
ptrpointsto0x7fffffffe2ecwhichholds10.
Inprint():
xxis10andisstoredat0x7fffffffe2bc.
ptrpointsto0x7fffffffe2ecwhichholds10.
Insum():

Breakpoint3,print(xx=10,xxptr=0x7fffffffe2ec)atgdb_example.c:17
17intd=minus(3,2);
$1=5

上例表示在17行暫停后打印c的值。

與前面的條件斷點組合使用,可以在斷點暫停時執行復雜的動作。

舉例

break17ifc==5
commands
silent
printf“xis%d
”,x
cont
end

常用命令及其縮略形式

命令 簡寫形式 說明
backtrace bt/where 顯示backtrace
break 設備斷點
continue c/cont 繼續運行
delete d 刪除斷點
finish 運行到函數結束
info breakpoints 顯示斷點信息
next n 執行下一行
print p 顯示表達式
run r 運行程序
step s 一次執行一行,包括函數內部
x 顯示內存內容
until u 執行到指定行
directory dir 插入目錄
disable dis 禁用斷點
down do 在當前棧幀中選擇要顯示的棧幀
edit e 編輯文件或函數
frame f 選擇要顯示的棧幀
forward-search fo 向前搜索
generate-core-file gcore 生成內核轉儲
help h 顯示幫助文檔
info i 顯示信息
list l 顯示函數行
nexti ni 執行下一行(以匯編代碼為單位)
print-object po 顯示目標信息
sharedlibrary share 加載共享庫的符號
stepi si 執行下一行

值的歷史

通過print命令顯示過的值會記錄在內部的值歷史中,這些值可以在其他表達式中使用。

舉例

(gdb)b16
Breakpoint1at0x79f:filegdb_example.c,line16.
(gdb)b17
Breakpoint2at0x7b1:filegdb_example.c,line17.
(gdb)b29
Breakpoint3at0x841:filegdb_example.c,line29.
(gdb)r
Startingprogram:/home/zhongyi/code/example/gdb_example
Inmain():
xis10andisstoredat0x7fffffffe2fc.
ptrpointsto0x7fffffffe2fcwhichholds10.
Inprint():
xxis10andisstoredat0x7fffffffe2cc.
ptrpointsto0x7fffffffe2fcwhichholds10.

Breakpoint1,print(xx=10,xxptr=0x7fffffffe2fc)atgdb_example.c:16
16intc=sum(2,3);
(gdb)pc
$1=1431651824
(gdb)c
Continuing.
Insum():

Breakpoint2,print(xx=10,xxptr=0x7fffffffe2fc)atgdb_example.c:17
17intd=minus(3,2);
(gdb)pc
$2=5
(gdb)c
Continuing.
Inminus():

Breakpoint3,main()atgdb_example.c:29
29return0;

最后的值可以使用$ 訪問。

通過show values 可以顯示歷史中的最后10個值

舉例

(gdb)showvalues
$1=1431651824
$2=5
$3=10
$4=10
(gdb)

值的歷史的訪問變量和說明

變量 說明
$ 值歷史中的最后一個值
$n 值歷史的第n個值
$$ 值歷史的倒數第二個值
$$n 值歷史的倒數第n個值
$_ x命令顯示過的最后的地址
$__ x命令顯示過的最后的地址的值
$_exitcode 調試中的程序的返回代碼
$bpnum 最后設置的斷點的編號

可以隨意定義變量。變量以$開頭,有英文和數字組成。

舉例

(gdb)set$i=0
(gdb)p$i
$5=0
(gdb)

命令歷史

可以把命令保存在文件中,保存命令歷史后,就可以在其他調試會話中使用。默認命令歷史文件位于./.gdb_history

sethistoryexpansion
showhistoryexpansion

可以使用csh風格的!字符

sethistoryfilename文件名
showhistoryfilename

可將命令歷史保存到文件中,可以通過環境變量GDBHISTFILE改變默認文件。

sethistorysave
showhistorysave

啟用命令歷史保存到文件和恢復的功能。

sethistorysize數字
showhistorysize

設置保存到命令歷史中的命令數量,默認為256。

初始化文件(.gdbinit)

Linux下gdb初始化文件為.gdbinit。如果存在.gdbinit文件,GDB在啟動之前將其作為命令文件運行。

順序如下:

$HOME/.gdbinit

運行命令行選項

./.gdbinit

加載通過-x選項給出的命令文件

命令定義

用define可以自定義命令,用document可以給自定義的命令加說明,利用help 命令名可以查看定義的命令。

define格式:

define命令名
命令
…………
end

document格式:

document命令名
說明
end

help格式:

help命令名

以下示例定義了名為li的命令。

舉例

(gdb)defineli
Typecommandsfordefinitionof"li".
Endwithalinesayingjust"end".
>x/10i$rbp
>end
(gdb)documentli
Typedocumentationfor"li".
Endwithalinesayingjust"end".
>listmachineinstruction
>end
(gdb)li
0x7fffffffe310:(bad)
0x7fffffffe311:rex.Wpush%rbp
0x7fffffffe313:push%rbp
0x7fffffffe314:push%rbp
0x7fffffffe315:push%rbp
0x7fffffffe316:add%al,(%rax)
0x7fffffffe318:xchg%edi,(%rax,%riz,4)
0x7fffffffe31b:idiv%edi
0x7fffffffe31d:jg0x7fffffffe31f
0x7fffffffe31f:add%al,(%rcx)
(gdb)helpli
listmachineinstruction

還可以把各種設置寫在文件中,運行調試器時讀取這些文件。

source文件名

總結

本文只是對gdb命令腳本做了一個粗淺的介紹,旨在起到拋磚引玉的效果。





審核編輯:劉清

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

    關注

    31

    文章

    5343

    瀏覽量

    120379
  • 計數器
    +關注

    關注

    32

    文章

    2256

    瀏覽量

    94576
  • Shell
    +關注

    關注

    1

    文章

    365

    瀏覽量

    23378
  • GDB調試
    +關注

    關注

    0

    文章

    24

    瀏覽量

    1447

原文標題:【調試】GDB使用總結

文章出處:【微信號:嵌入式與Linux那些事,微信公眾號:嵌入式與Linux那些事】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

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

    進入gdb后可使用的gdb命令

    gdb-optionsexecutable-file 進入gdb后可使用的gdb命令: File:裝入想要調試的可執行文件 Cd:改變工作目錄。 Pwd:返回當前工作目錄
    發表于 07-03 05:26

    GDB的常用命令是什么?

    GDB的常用命令是什么?GDB的使用條件是什么?GDB如何調試?
    發表于 12-24 07:08

    GDB調試命令手冊

    GDB調試命令手冊,感興趣的可以下載看看。
    發表于 11-05 16:36 ?9次下載

    基于linux下自定義腳本來替代rm命令

    linux下的rm命令,功能太強,同時又沒法撤消,為了避免誤操作,可以自定義腳本來替代rm命令
    的頭像 發表于 02-01 18:08 ?3748次閱讀
    基于linux下自定義<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>腳本</b>來替代rm<b class='flag-5'>命令</b>

    GDB調試命令總結

    ).singal 發送信號假定你的程序已將專用的 SIGINT(鍵盤輸入,或CTRL-C;信號2)信號處理程序設置成采取某個清理動作,要想測試該信號處理程序,你可以設置斷點并使
    發表于 04-02 14:31 ?1154次閱讀

    實例演示GDB的使用

    GDB簡介 GDB(GNU Debugger)是強大的命令行調試工具。般的,在Window
    的頭像 發表于 10-19 09:58 ?2702次閱讀
    實例演示<b class='flag-5'>GDB</b>的使用

    109實用shell腳本分享

    Shell腳本,就是利用Shell的命令解釋的功能,對純文本的文件進行解析,然后執行這些功能,也可以說Shell腳本就是
    的頭像 發表于 03-16 08:58 ?2633次閱讀

    Linux命令行與shell腳本編寫

    Linux命令行與shell腳本編寫
    發表于 01-11 16:50 ?4次下載

    如何在Linux命令行中運行Python腳本

    Python 是種高級編程語言,被廣泛應用于數據科學、機器學習、Web 開發等領域。在 Linux 操作系統中,Python 是默認安裝的解釋器,用戶可以通過命令行界面(CLI)
    的頭像 發表于 05-12 14:49 ?1689次閱讀

    shell腳本本身自帶的命令詳解

    除了以文件形式保存在/usr/bin下面的命令,shell腳本中還可以使用shell本身自帶的命令,即內置命令
    的頭像 發表于 05-23 09:32 ?1039次閱讀
    shell<b class='flag-5'>腳本</b>本身自帶的<b class='flag-5'>命令</b>詳解

    為什么shell腳本中執行命令要加exec?這個exec有什么作用呢?

    正常情況下,如果我們想要在shell腳本中執行命令,我們只用將該命令原樣寫到這個shell腳本
    的頭像 發表于 08-21 09:10 ?3145次閱讀
    為什么shell<b class='flag-5'>腳本</b>中執行<b class='flag-5'>命令</b>要加exec?這個exec有什么作用呢?

    shell腳本基本命令

    Shell腳本種可執行文件,它包含了組用某種特定語言編寫的命令,這些命令可以被解釋器(如bash)執行。以下是
    的頭像 發表于 11-08 10:08 ?2158次閱讀

    腳本調試工具有哪些?腳本調試工具怎么用?

    腳本調試是軟件開發過程中非常重要的環,它能幫助開發者快速定位并解決代碼中的錯誤。大多數編程語言都提供了各種各樣的腳本調試工具,本文將介紹
    的頭像 發表于 12-01 14:40 ?883次閱讀

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

    中,我們將介紹如何在Linux中使用GDB來調試Python程序。 、安裝GDB和Python調試符號 在使用GDB調試Python程序之
    的頭像 發表于 01-31 10:41 ?2624次閱讀
    主站蜘蛛池模板: vvvv98国产成人综合青青| 欧美激情xxxx性bbbb| 浮荡视频在线观看免费| 三级第一页| 变态重口极致另类在线| 91一级片| 午夜剧场黄| 国产单男| 欧美30p| 天天综合色一区二区三区| 国产女人和拘做受视频免费 | 免费又爽又黄的禁片1000部| 性配久久久| 男人的天堂视频在线| 人人干操| 一级毛片子| 丁香婷婷亚洲| 人人澡人人澡人人看青草| 我要看18毛片| 夜夜夜夜夜夜夜猛噜噜噜噜噜噜| 欧美性xxxx交| 日本黄色大片网站| 特黄一级大片| 在线看片成人| 成人观看天堂在线影片| 黄色大片在线视频| 欧美精品啪啪| 国产香蕉视频在线| 四只虎免费永久观看| 午夜香蕉视频| 浮荡视频在线观看免费| 国产妇女在线| 影音先锋午夜资源网站| 你懂在线| 国产福利2021最新在线观看| 四虎三级| 人人九九精品| 特级全黄一级毛片视频| 天天干天天玩天天操| 中文字幕88页| 在线天堂中文在线资源网|