用gdb調試代碼


title: 用gdb調試代碼
tags:

  • gdb
    date: 2017-08-09 15:09:22

gdb調試

$ gdb execfile

開始調試execfile;

list

list,簡寫為l,顯示源文件;命令格式:

list | l [arg1,arg2]

arg1為起始行號,arg2為結束行號;顯示arg1行到arg2行之間的代碼;

未設置arg1和arg2 時,默認顯示10行;

(gdb) l
#顯示1-10行代碼
break

break,簡寫b,設置斷點;命令格式:

break | b  location

location可以是function(函數名) | linenum(行號) | address(偏移地址);

(gdb) b _start
(gdb) b *_start + 4
(gdb) b 14
run、stepi、info
run

run,簡寫r,運行程序;

stepi

stepi,簡寫si,執行一條指令;命令格式:

stepi | si [N]

N意味著執行N條指令(或者到程序結束處);

(gdb) si
# 執行一條指令
(gdb) si 4
# 執行四條指令
info

info,簡寫i,顯示一些調試信息;

info registers -- List of integer registers and their contents
#可以簡寫為 i r
info breakpoints -- Status of specified breakpoints (all user-settable breakpoints if no argument)
#簡寫 i b
print

print,簡寫pExamining Data,打印寄存器中的值或打印變量中的值;命令格式:

print | p [/fmt] $registers | variable

registers表示寄存器,如eax,ebx,ecx,edx,esi, edi, esp, ebp, eflags等;
fmt參數如下表:

format letter description
o octal
x hex
d decimal
u unsigned decimal
t binary
f float
a address
i instruction
c char
s string
z hex,zero padded on the left
(gdb) p $eax
#打印寄存器eax中的值
(gdb) p Snippet
#打印Snippet中的值
examine

x,全稱:examine;Examining Memory,打印內存單元中的值;命令格式:

x/nfu address

address表示內存單元地址;
n是一個整數,表示顯示幾個內存單元;默認是1;
f表示格式化,見上表;默認是x;
u表示內存單元大小,見下表:

unit letter description
b Bytes
h HalfWords(two bytes)
w Words(four bytes, default)
g Giant words(eight bytes)
(gdb) x/5cb &Snippet
#從Snippet所在的地址開始打印連續的5個以字節為單位的內存單元,并以字符的形式顯示;
(gdb) x/5cb 0x6000c8;
#從地址為0x6000c8的內存單元開始打?。?
display

displayAutomatic Display,自動顯示,每次運行完一條指令自動打印顯示列表中的值;命令格式:

display[/fmt] expr | address

display會根據設置的fmt,expr或者address自動判斷是調用x還是print。

(gdb) display/5xb &Snippet
#等價于每次執行完一條指令后,自動執行一次x/5xb &Snippet;
(gdb) display/x $ebx
#相當于每次執行一條指令后,自動執行一次p/x $ebx;
quit

quit,簡寫q,退出gdb;

shell

需要在gdb中執行shell命令時,可以使用shell;命令格式:

shell command

TUI模式

gdb提供TUI(Text User Interface)模式,方便調試代碼;

進入TUI模式

利用gdb -tui execfile命令進入gdb,可以開啟TUI模式;
進入gdb之后通過快捷鍵ctrl+x a或者使用命令tui enable開啟TUI模式;

layout

可以利用layout命令調整TUI中的布局;通過help layout可以查看幫助;命令格式:

layout next | prev | layoutname

next下一個布局,prev上一個布局,layoutname見下表:

layoutname description
src 源碼布局
asm 匯編布局
split 源碼,匯編,cmd布局
regs 寄存器布局
winheight

調整布局的大小,命令格式:

winheight winname [+ | -] lines

winname見下表:

winname description
src 源碼窗口
asm 匯編窗口
cmd 命令窗口
regs 寄存器窗口

+表示窗口winname增大lines行,-表示窗口winname減小lines行;

focus

利用focus可以讓焦點關注不同的窗口;命令格式:

focus next | prev | winname

next下一個窗口,prev上一個窗口,winname見上表;
當cmd不被focus時,在cmd中方向鍵不起作用,若要使用方向鍵,此時方向鍵命令同emacs一樣(ctrl+p向上,ctrl+n向下,ctrl+f向右,ctrl+b向左);

refresh

refresh刷新窗口;

關閉TUI模式

ctrl+x a既可以開啟TUI,也可以關閉TUI;
tui disable關閉TUI模式;

參考:
Debugging with GDB
Quick GDB Information

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 程序調試的基本思想是“分析現象->假設錯誤原因->產生新的現象去驗證假設”這樣一個循環過程,根據現象如何假設錯誤原...
    Manfred_Zone閱讀 16,568評論 0 26
  • 作者: liigo原文鏈接: http://blog.csdn.net/liigo/archive/2006/01...
    wuqingyi閱讀 1,827評論 0 4
  • Ubuntu的發音 Ubuntu,源于非洲祖魯人和科薩人的語言,發作 oo-boon-too 的音。了解發音是有意...
    螢火蟲de夢閱讀 99,466評論 9 467
  • 概述 GDB是一個由GNU開源組織發布的、UNIX/Linux操作系統下的、基于命令行的、功能強大的程序調試工具。...
    咕咕鷄閱讀 20,901評論 0 8
  • 如果你不想要,想退出要趁早 ——如果你有想到我們有未來的話,絕不會有合不合適這一說了 是草草的樹洞: 半個月前掰的...
    豆花妹妹呀閱讀 666評論 0 8