今天要分享給大家的是gdb動態調試( 動態調試就是在不終止正在運行的進程的情況下,來對這個正在運行的進程進行調試,我一般習慣稱之為在線調試 )在平時開發Linux應用程序時,不管是桌面Linux應用開發,還是嵌入式Linux應用開發,在我們接到新需求開始擼代碼的時候(一般這時候都是在公司編碼測試,可以運行帶調試信息的debug版程序),都可以使用該技能進行代碼的調測,簡單實用。
為了給大家演示方便,我簡單寫了個測試程序,代碼如下:
#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;
}
為了不讓程序自動結束,我創建了一個線程,然后使用如下命令進行編譯,生成帶調試信息的可執行程序文件。
gcc -g -o main main.c -lpthread
使用&符號,讓程序在后臺運行,記下程序的進程號PID(或者使用ps -e | grep main命令查詢):
gdb動態調試有多種使用方式,感興趣的小伙伴可以直接找度娘搜索下,下面是最常用的一種方式:
gdb < 可執行程序名 > < 進程ID >
比如:gdb < 可執行程序名 > 1234
這條命令會把進程ID為1234的進程與gdb聯系起來,也就是說,這條命令會把進程ID為1234的進程的地址空間附著在gdb的地址空間中,然后使這個進程在gdb的環境下運行,這樣的話,gdb就可以清楚地了解該進程的執行情況、函數堆棧、內存使用情況等等。
從上面我們查到main進程的PID為21310,直接執行gdb main 21310即可開啟main進程的動態調試。
這時候我們借助強大的gdb可以做的事情就非常多了:
- 查看某個全局變量的值(gdb的print命令顯示結構體變量是非常的nice)
- 修改某個全局變量的值(也可以單獨修改結構體變量的某個成員)
- 直接執行某個函數(無參函數、有參函數都可以)
- 設置斷點
- ......
以上這些常用的功能基本可以滿足我們的調試需求,使用效果如下:
編譯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(需要交叉編譯,交叉編譯工具鏈換成對應的即可)
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可執行程序文件比較大(默認是帶著調試信息的),可以用strip命令裁剪下即可,不影響使用!
好了,今天就先寫到這吧,gdb動態調試在不打斷程序運行的情況下,進行在線調測還是很有用的,一般在排查問題、動態改變程序執行邏輯、單元/集成測試等都可以使用,用起來非常的香!
-
嵌入式
+關注
關注
5046文章
18821瀏覽量
298627 -
Linux
+關注
關注
87文章
11123瀏覽量
207921 -
程序
+關注
關注
115文章
3720瀏覽量
80361 -
代碼
+關注
關注
30文章
4671瀏覽量
67771
發布評論請先 登錄
相關推薦
評論