今天要分享給大家的是gdb動(dòng)態(tài)調(diào)試( 動(dòng)態(tài)調(diào)試就是在不終止正在運(yùn)行的進(jìn)程的情況下,來對(duì)這個(gè)正在運(yùn)行的進(jìn)程進(jìn)行調(diào)試,我一般習(xí)慣稱之為在線調(diào)試 )在平時(shí)開發(fā)Linux應(yīng)用程序時(shí),不管是桌面Linux應(yīng)用開發(fā),還是嵌入式Linux應(yīng)用開發(fā),在我們接到新需求開始擼代碼的時(shí)候(一般這時(shí)候都是在公司編碼測(cè)試,可以運(yùn)行帶調(diào)試信息的debug版程序),都可以使用該技能進(jìn)行代碼的調(diào)測(cè),簡(jiǎn)單實(shí)用。
為了給大家演示方便,我簡(jiǎn)單寫了個(gè)測(cè)試程序,代碼如下:
#include < stdio.h >
#include < pthread.h >
typedef struct
{
int a;
char b;
char *c;
} TEST;
int data;
TEST test;
int fun(void)
{
printf("global variable data = %dn", data);
}
int fun2(int val)
{
data = val;
printf("set global variable data = %dn", data);
}
void *thread()
{
while(1)
{
//printf("thread is runningn");
sleep(1);
}
}
int main(int argc, char *argv[])
{
pthread_t tid;
data = 100;
test.a = 10;
test.b = 'a';
test.c = "hello world";
pthread_create(&tid, NULL, thread, NULL);
pause();
return 1;
}
為了不讓程序自動(dòng)結(jié)束,我創(chuàng)建了一個(gè)線程,然后使用如下命令進(jìn)行編譯,生成帶調(diào)試信息的可執(zhí)行程序文件。
gcc -g -o main main.c -lpthread
使用&符號(hào),讓程序在后臺(tái)運(yùn)行,記下程序的進(jìn)程號(hào)PID(或者使用ps -e | grep main命令查詢):

gdb動(dòng)態(tài)調(diào)試有多種使用方式,感興趣的小伙伴可以直接找度娘搜索下,下面是最常用的一種方式:
gdb < 可執(zhí)行程序名 > < 進(jìn)程ID >
比如:gdb < 可執(zhí)行程序名 > 1234
這條命令會(huì)把進(jìn)程ID為1234的進(jìn)程與gdb聯(lián)系起來,也就是說,這條命令會(huì)把進(jìn)程ID為1234的進(jìn)程的地址空間附著在gdb的地址空間中,然后使這個(gè)進(jìn)程在gdb的環(huán)境下運(yùn)行,這樣的話,gdb就可以清楚地了解該進(jìn)程的執(zhí)行情況、函數(shù)堆棧、內(nèi)存使用情況等等。
從上面我們查到main進(jìn)程的PID為21310,直接執(zhí)行g(shù)db main 21310即可開啟main進(jìn)程的動(dòng)態(tài)調(diào)試。

這時(shí)候我們借助強(qiáng)大的gdb可以做的事情就非常多了:
- 查看某個(gè)全局變量的值(gdb的print命令顯示結(jié)構(gòu)體變量是非常的nice)
- 修改某個(gè)全局變量的值(也可以單獨(dú)修改結(jié)構(gòu)體變量的某個(gè)成員)
- 直接執(zhí)行某個(gè)函數(shù)(無參函數(shù)、有參函數(shù)都可以)
- 設(shè)置斷點(diǎn)
- ......
以上這些常用的功能基本可以滿足我們的調(diào)試需求,使用效果如下:

編譯x86電腦上用的gdb
cd /home/tools/gdb/gdb-8.2
mkdir build
cd build
../configure --prefix=/home/tools/gdb/gdb_install_x86/
make && make install
編譯arm終端上用的gdb(需要交叉編譯,交叉編譯工具鏈換成對(duì)應(yīng)的即可)
cd /home/tools/gdb/gdb-8.2
mkdir build
cd build
../configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc CPP=arm-linux-gnueabihf-cpp CXX=arm-linux-gnueabihf-g++ --prefix=/home/tools/gdb/gdb_install_arm/
make && make install
另外,如果感覺生成的gdb可執(zhí)行程序文件比較大(默認(rèn)是帶著調(diào)試信息的),可以用strip命令裁剪下即可,不影響使用!
好了,今天就先寫到這吧,gdb動(dòng)態(tài)調(diào)試在不打斷程序運(yùn)行的情況下,進(jìn)行在線調(diào)測(cè)還是很有用的,一般在排查問題、動(dòng)態(tài)改變程序執(zhí)行邏輯、單元/集成測(cè)試等都可以使用,用起來非常的香!
-
嵌入式
+關(guān)注
關(guān)注
5209文章
20668瀏覽量
337139 -
Linux
+關(guān)注
關(guān)注
88文章
11818瀏覽量
219574 -
程序
+關(guān)注
關(guān)注
117文章
3849瀏覽量
85473 -
代碼
+關(guān)注
關(guān)注
30文章
4977瀏覽量
74391
發(fā)布評(píng)論請(qǐng)先 登錄
QEMU+GDB調(diào)試ARM程序
使用GDB調(diào)試Linux應(yīng)用程序
使用OpenOCD調(diào)試DEMO_FX3_U3V_CAM01時(shí)出錯(cuò),是哪里的原因?
ARM平臺(tái)如何玩轉(zhuǎn)GDB遠(yuǎn)程調(diào)試?
gdb調(diào)試器解析
Linux應(yīng)用的GDB調(diào)試的原理及過程分析
實(shí)例演示GDB的使用
OpenHarmony系統(tǒng)使用gdb調(diào)試init
ARM平臺(tái)如何玩轉(zhuǎn)GDB遠(yuǎn)程調(diào)試?
在ubuntu中調(diào)試GDB
GDB調(diào)試工具的原理
如何使用GDB調(diào)試工具
gdb動(dòng)態(tài)調(diào)試演示
評(píng)論