GDB基礎(chǔ)
學(xué)工具和框架最好去官網(wǎng)學(xué)嘱吗。
系統(tǒng)化的學(xué)習(xí)才能成長(zhǎng)点待,碎片化學(xué)習(xí)只會(huì)焦慮昭殉。
GDB是什么東西
GDB, the GNU Project debugger, allows you to see what is going on `inside' another program while it executes -- or what another program was doing at the moment it crashed.
GDB can do four main kinds of things (plus other things in support of these) to help you catch bugs in the act:
- Start your program, specifying anything that might affect its behavior.
- Make your program stop on specified conditions.
- Examine what has happened, when your program has stopped.
- Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.
Those programs might be executing on the same machine as GDB (native), on another machine (remote), or on a simulator. GDB can run on most popular UNIX and Microsoft Windows variants, as well as on Mac OS X.
- GDB可以在運(yùn)行程序時(shí)檢查程序內(nèi)部到底發(fā)生了什么
- GDB可以做如下四件事情
- 開(kāi)始并設(shè)置參數(shù)
- 打斷點(diǎn)诱咏,令程序在特殊情況下停止
- 當(dāng)程序停止時(shí)檢查發(fā)生了什么
- 更改程序中的內(nèi)容,嘗試糾正一個(gè)錯(cuò)誤的影響,然后繼續(xù)檢查另一個(gè)錯(cuò)誤
GDB支持哪些語(yǔ)言
- Ada、Assembly吠昭、C胧瓜、C++、D府喳、Fortran、Go钝满、Objective-C、OpenCL弯蚜、Modula-2孔轴、Pascal路鹰、Rust
GDB下載安裝
官網(wǎng):GDB: The GNU Project Debugger
查看自己系統(tǒng)中是否有g(shù)db:
gdb -v
Windows下安裝
- 比較麻煩贷洲,需要去官網(wǎng)下載源碼晋柱,自己編譯⊙憔海或者下載他人編譯好的二進(jìn)制文件钦椭。
- 在Windows下安裝編譯GDB調(diào)試工具_(dá)gdb windows編譯_ZeroZone零域的博客-CSDN博客
RedHat系列Linux發(fā)行版
包括RedHat、RHEL浓领、FedoraCore玉凯、CentOS
sudo yum -y install gdb
Debian系列發(fā)行版
包括Debian势腮、Ubuntu
sudo apt -y install gdb
常見(jiàn)命令快速上手
man gdb
查看使用手冊(cè)編譯時(shí)需要使用
gcc -g
联贩,加上-g
才能調(diào)試,否則變量函數(shù)名等都會(huì)變成地址捎拯。gdb 二進(jìn)制文件
將編譯好的為文件使用gdb調(diào)試
斷點(diǎn)調(diào)試相關(guān)
r
泪幌、run
運(yùn)行程序quit
退出gdb程序b
、break
打斷點(diǎn)署照,后面可接函數(shù)名祸泪、行數(shù),例如break main
建芙、break 233
l
没隘、list
展示10行代碼,便于打斷點(diǎn)info b
查看已打斷點(diǎn)信息n
禁荸、next
讓停止的程序向后運(yùn)行一行c
右蒲、continue
讓停止的程序繼續(xù)運(yùn)行,直到遇到下一個(gè)斷點(diǎn)或退出p
赶熟、print
打印變量值瑰妄、變量地址等,例如print &value[1]
s
映砖、step
步入具體的函數(shù)進(jìn)行調(diào)試j
间坐、jump
跳轉(zhuǎn)到指定行u
、until
運(yùn)行到指定行fi
邑退、finish
結(jié)束當(dāng)前調(diào)用函數(shù)d
竹宋、delete
刪除斷點(diǎn)
實(shí)用技巧
shell 命令
在gdb中運(yùn)行命令clear
清屏set logging on
開(kāi)啟日志功能,記錄gdb輸出地技,默認(rèn)在gdb.exe
中-
觀察點(diǎn)watchpoint蜈七,查看變量是否變化,例如
watch *地址
info wathpoints
查看當(dāng)前觀察點(diǎn)
調(diào)試core文件
在程序掛掉時(shí)進(jìn)行調(diào)試
-
大部分系統(tǒng)有資源限制乓土,無(wú)法直接調(diào)試core文件
ulimit -a
顯示目前資源限制的設(shè)定如果受到限制就需要用
ulimit -c unlimited
命令解除宪潮,之后就會(huì)生成core文件然后使用
gdb 二進(jìn)制文件 core文件
進(jìn)行調(diào)試
調(diào)試正在運(yùn)行的程序
-
ps -ef | grep 運(yùn)行文件名
查看進(jìn)程號(hào)pid -
gdb -p 進(jìn)程號(hào)
調(diào)試該進(jìn)程
線程相關(guān)
首先使用
pstree -p 進(jìn)程號(hào)
查看子線程id溯警,pstack
查看單個(gè)線程的棧結(jié)構(gòu)gdb attach 線程ID
將運(yùn)行的線程放入gdb中info 線程ID
查看線程信息backtrace
查看當(dāng)前線程的調(diào)用堆棧frame
切換到當(dāng)前調(diào)用線程的指定堆棧thread
切換到指定線程thread apply 線程號(hào) 命令
讓一個(gè)或者多個(gè)線程執(zhí)行GDB命令commandthread apply all ml
讓所有被調(diào)試線程執(zhí)行GDB命令set scheduler-locking off
不鎖定任何線程,所有線程都執(zhí)行狡相,這是默認(rèn)值set scheduler-locking on
只有當(dāng)前被調(diào)試程序會(huì)執(zhí)行