今天要分享給大家的是gdb動態(tài)調(diào)試( 動態(tài)調(diào)試就是在不終止正在運行的進程的情況下,來對這個正在運行的進程進行調(diào)試,我一般習(xí)慣稱之為在線調(diào)試 )在平時開發(fā)Linux應(yīng)用程序時,不管是桌面Linux應(yīng)用開發(fā),還是嵌入式Linux應(yīng)用開發(fā),在我們接到新需求開始擼代碼的時候(一般這時候都是在公司編碼測試,可以運行帶調(diào)試信息的debug版程序),都可以使用該技能進行代碼的調(diào)測,簡單實用。
為了給大家演示方便,我簡單寫了個測試程序,代碼如下:
#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;
}
為了不讓程序自動結(jié)束,我創(chuàng)建了一個線程,然后使用如下命令進行編譯,生成帶調(diào)試信息的可執(zhí)行程序文件。
gcc -g -o main main.c -lpthread
使用&符號,讓程序在后臺運行,記下程序的進程號PID(或者使用ps -e | grep main命令查詢):

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

這時候我們借助強大的gdb可以做的事情就非常多了:
- 查看某個全局變量的值(gdb的print命令顯示結(jié)構(gòu)體變量是非常的nice)
- 修改某個全局變量的值(也可以單獨修改結(jié)構(gòu)體變量的某個成員)
- 直接執(zhí)行某個函數(shù)(無參函數(shù)、有參函數(shù)都可以)
- 設(shè)置斷點
- ......
以上這些常用的功能基本可以滿足我們的調(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(需要交叉編譯,交叉編譯工具鏈換成對應(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動態(tài)調(diào)試在不打斷程序運行的情況下,進行在線調(diào)測還是很有用的,一般在排查問題、動態(tài)改變程序執(zhí)行邏輯、單元/集成測試等都可以使用,用起來非常的香!
-
嵌入式
+關(guān)注
關(guān)注
5186文章
20133瀏覽量
328397 -
Linux
+關(guān)注
關(guān)注
88文章
11622瀏覽量
217831 -
程序
+關(guān)注
關(guān)注
117文章
3836瀏覽量
84738 -
代碼
+關(guān)注
關(guān)注
30文章
4940瀏覽量
73080
發(fā)布評論請先 登錄
QEMU+GDB調(diào)試ARM程序
使用GDB調(diào)試Linux應(yīng)用程序
使用OpenOCD調(diào)試DEMO_FX3_U3V_CAM01時出錯,是哪里的原因?
ARM平臺如何玩轉(zhuǎn)GDB遠(yuǎn)程調(diào)試?
gdb調(diào)試器解析
Linux應(yīng)用的GDB調(diào)試的原理及過程分析
實例演示GDB的使用
OpenHarmony系統(tǒng)使用gdb調(diào)試init
ARM平臺如何玩轉(zhuǎn)GDB遠(yuǎn)程調(diào)試?
在ubuntu中調(diào)試GDB
如何使用GDB調(diào)試工具

gdb動態(tài)調(diào)試演示
評論