国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

Linux應用調(diào)試使用gdb和gdbserver命令詳解

2020-10-28 18:44:12
字體:
供稿:網(wǎng)友

1.gdb和gdbserver調(diào)試原理

通過linux虛擬機里的gdb,來向開發(fā)板里的gdbserver發(fā)送命令,比如設(shè)置斷點,運行setp等,然后開發(fā)板上的gdbserver收到命令后,便會執(zhí)行應用程序做相應的動作,來實現(xiàn)調(diào)試的功能

和之前學的裸板GDB調(diào)試 一樣,只不過之前學的是在win下的,本次是在linux里的gdb

1.1同樣,它們都會需要一個帶調(diào)試信息的編譯文件.

通過Makefile里的arm-linux-gcc  -g 來的,     -g:表示編譯文件里包含gdb調(diào)試信息

1.2為什么需要調(diào)試信息的編譯文件?

比如讀開發(fā)板的應用程序里的變量a:

首先gdb通過應用程序的帶調(diào)試信息的編譯文件,來找出變量a存的地址位置

然后將地址發(fā)送給開發(fā)板里的gdbserver,來讀出a地址的值

2.安裝gdb和gdbserver

首先進入官網(wǎng)下載gdb-7.4: http://ftp.gnu.org/gnu/gdb/

2.1在虛擬機上安裝GDB:  

# tar xjf gdb-7.4.tar.bz2   //解壓# cd gdb-7.4/    //進入gdb-7.4目錄#./configure --target=arm-linux    //GDB需要在pc本機里運行,并調(diào)試開發(fā)板里的應用程序,所以--target設(shè)為arm-linux#make     //編譯#mkdir tmp    #make install prefix=$PWD/tmp  //安裝到./tmp目錄下sudo cp tmp/bin/arm-linux-gdb /bin/ //復制到/bin目錄下/bin/arm-linux-gdb -v   //-v: 確定一下gdb的版本VID,是否是7.4

2.2 在開發(fā)板上安裝GDBServer:

cd gdb/gdbserver/     //在gdb-7.4目錄下輸入./configure --target=arm-linux --host=arm-linux  //設(shè)GDBServer的工作環(huán)境make  //編譯

出現(xiàn)以下錯誤:

指在linux-arm-low.c里,沒有找到PTRACE_GETSIGINFO 定義

2.3 解決:

1)

#echo $PATH     //來查看PATH環(huán)境變量

找到編譯器gcc位于/work/tools/gcc-3.4.5-glibc-2.3.6/bin

2)

#cd /work/tools/gcc-3.4.5-glibc-2.3.6/    # grep "PTRACE_GETSIGINFO" * -nR

在gcc根目錄下,搜索到在linux/ptrace.h中定義:

3)

#vi linux-arm-low.c

添加: #define PTRACE_GETSIGINFO 0x4202

4)最后重新make,生成gdbserver命令文件

然后將gdbserver命令文件,放入我們開發(fā)板的根目錄/bin中,便能使用了

cp gdbserver /nfs_root/bin/  //nfs_root:開發(fā)板的nfs系統(tǒng)根目錄

3.測試程序如下(test_debug.c)

#include <stdio.h>void C(int *p){   *p = 0x12;}void B(int *p){  C(p);}void A(int *p){  B(p);}void A2(int *p){  C(p);}int main(int argc, char **argv){  int a;  int *p = NULL;  A2(&a); // A2 > C  printf("a = 0x%x/n", a);  A(p); // A > B > C  return 0;}

其中A2(&a)會調(diào)用A2()->C(),然后將a賦值為0x12.

A(p)會調(diào)用A()->B()->C(),由于p是個空指針,這里將會出錯.

接下來,我們便以這個應用程序為例.

4.編譯

#arm-linux-gcc -g -o test_debug test_debug.c //-g:附帶調(diào)試信息

5.調(diào)試test_debug.c

在開發(fā)板上:

首先,需要讓gdbserver建立本地服務器,以及要測試的哪個文件:

#gdbserver 192.168.2.107:2345 ./test_debug//192.168.2.107:本地IP地址//2345:端口號,用來讓gdb來連接用的//./test_debug:要測試的哪個文件

在虛擬機上:

#/bin/arm-linux-gdb ./test_debug // 啟動gdb,指定調(diào)試文件為test_debug#target remote 192.168.2.107:2345 //與gdbserver建立連接

5.1連接成功,便使用gdb命令來調(diào)試

常用命令如下所示(參考http://blog.sciencenet.cn/blog-619295-813770.html):

列出所有源代碼

break [file]:[row]

打斷點,比如:

break test_debug.c:21     //在test_debug.c文件的第21行處打斷點
info br

查看斷點

info file

列出當前的文件,共享庫。

delete <num>

刪除第幾個斷點,如下圖所示:

c

啟動程序運行

step

單步執(zhí)行

next 

單步執(zhí)行,和step不同的是,比如:當前行里有函數(shù)調(diào)用時,next直接執(zhí)行下一句,step會進入函數(shù)

print a

打印a變量的值

quit

退出gdb

6.也可以通過gdb+coredump來調(diào)試test_debug.c

當程序運行出錯時,便會生成core文件,并將程序里的運行狀況存到core中,也就是coredump,供給gdb來調(diào)試

6.1首先,通過ulimit來查看coredump的資源大小    

ulimit命令(user limit),主要用來限制用戶的各個進程資源.

在開發(fā)板里,輸入

如上圖所示,可以看到coredump的資源大小為0,也就是說,當程序運行出錯時,不會生成core文件

6.2設(shè)置core文件

設(shè)置core文件的資源大小為無限制,輸入:

ulimit -c unlimited //-c:對應coredump

6.3生成core文件

執(zhí)行:

#./test_debug

出現(xiàn)段錯誤,并生成core文件,如下圖所示:

6.4 進入虛擬機

將core拷貝過來,然后執(zhí)行:

#/bin/arm-linux-gdb ./test_debug ./core

然后輸入bt,便可查看調(diào)用關(guān)系:

總結(jié)

以上所述是小編給大家介紹的Linux應用調(diào)試使用gdb和gdbserver命令詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網(wǎng)網(wǎng)站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 民勤县| 卢湾区| 内丘县| 林芝县| 唐海县| 平潭县| 合江县| 新疆| 沈丘县| 贵南县| 原阳县| 昌江| 永修县| 进贤县| 密山市| 江源县| 通辽市| 定兴县| 民乐县| 濉溪县| 嘉善县| 宁晋县| 革吉县| 石首市| 靖远县| 五华县| 乾安县| 荔浦县| 兴城市| 博白县| 同仁县| 沈阳市| 延津县| 云梦县| 宁远县| 曲水县| 阜康市| 澄迈县| 伊川县| 泰宁县| 南投市|