前言
????????調(diào)試設(shè)備代碼的時(shí)候,經(jīng)常碰到程序異?;蛘吖δ軐?duì)不上,以前這種時(shí)候就是加打印消息,然后重新編譯把程序放進(jìn)去跑,通過打印消息來判斷代碼出問題的點(diǎn)在哪里,但是有的時(shí)候可能需要反復(fù)加多次才能定位到問題點(diǎn),而使用gdb調(diào)試就可以很快找到問題,非常效率,雖然GDB調(diào)試的文章已經(jīng)很多了,但還是想寫寫來記錄一下。
前期工作
????????我使用的是主機(jī)端使用gdb,設(shè)備端使用gdbserver的方式去調(diào)試,所以需要在先編譯一個(gè)arm版本的gdbserver
我所使用的編譯器:arm-linux-gnueabihf-gcc
gdb源碼版本:gdb-8.3
編譯生成的程序我已經(jīng)上傳到我的gitee,如果不想編譯的話可以直接下載我的用
arm環(huán)境GDB調(diào)試: arm環(huán)境下使用gdb調(diào)試 (gitee.com)
gdbserver編譯
? ? ? ? 只需要交叉編譯gdbserver即可,因?yàn)橐话隳惆惭b的arm編譯器是帶gdb的,可以查看你的交叉編譯器選項(xiàng),就會(huì)發(fā)現(xiàn)一般有arm-linux-gnueabihf-gdb這個(gè)程序,當(dāng)然你也可以重新編譯一個(gè)arm版本的gdb,這個(gè)不影響,我實(shí)測(cè)下來,都可以使用。
進(jìn)入源碼目錄,再到gdb-8.3/gdb/gdbserve這個(gè)目錄下,打開終端,輸入命令裁剪
./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --prefix=/opt/gdb/gdbserver-lib
# --host:該軟件將運(yùn)行的平臺(tái),填你的交叉編譯器
# --target:該軟件所處理的目標(biāo)平臺(tái),填你的交叉編譯器
# --prefix:目標(biāo)文件生成路徑
裁剪完后直接編譯安裝
make
make install
最后會(huì)在指定目錄下生成程序
把這個(gè)程序放到arm開發(fā)板,如果覺得程序太大了的話,可以執(zhí)行strip命令,減小程序大小
arm-linux-gnueabihf-strip arm-linux-gnueabihf-gdbserver
GDB調(diào)試
我們寫一段程序測(cè)試一下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char buf[] = "hello world";
char data[100];
char *data2;
for(int i = 0; i < strlen(buf); i++)
data[i] = buf[i];
printf("data:%s\n", data);
strcpy(data2, data);
printf("data2:%s\n", data2);
return 0;
}
用arm編譯器編譯,注意編譯的時(shí)候加上-g,支持gdb調(diào)試
arm-linux-gnueabihf-gcc -o gdbtest test.c -g
接著放到arm開發(fā)板使用gdbserver運(yùn)行
# 執(zhí)行命令格式為./gdbserver :端口號(hào) 程序
./gdbserver :1234 gdbtest
然后在主機(jī)先執(zhí)行命令
arm-linux-gnueabihf-gdb -tui
# -tui 在GDB調(diào)試中顯示源代碼
?進(jìn)入gdb后,輸入指令連接開發(fā)板
# 格式 target remote 開發(fā)板ip:端口號(hào)(端口號(hào)需一致)
target remote 10.10.10.174:1234
這時(shí)候就可以查看源碼打斷點(diǎn)進(jìn)行調(diào)試了
輸入c直接運(yùn)行,可以看到程序此時(shí)發(fā)生了段錯(cuò)誤,所以如果實(shí)際中編程程序掛掉的話,可以先打斷點(diǎn),然后在單步執(zhí)行,很快就能定位到段錯(cuò)誤的位置。
GDB調(diào)試core文件
一般情況下,在開發(fā)階段正常,但是在測(cè)試的時(shí)候程序就可能掛掉,但是不可能一直開著gdbserver去跑,而且問題不一定好復(fù)現(xiàn),這個(gè)時(shí)候就要靠core文件去定位問題點(diǎn)了,在運(yùn)行程序前設(shè)置core文件
ulimit -c unlimited
# 設(shè)置進(jìn)程生成core文件的大小限制。將其設(shè)置為 "unlimited" 表示不限制core文件的大小,即進(jìn)程崩潰時(shí)可以生成任意大小的core文件
echo '/tmp/core.%e.%p.%t' | tee /proc/sys/kernel/core_pattern
# 生成的core文件會(huì)保存在 /tmp 目錄下,并以 "core.可執(zhí)行文件名.進(jìn)程ID.時(shí)間戳" 的格式命名。
然后直接執(zhí)行執(zhí)行程序
可以看到,在我指定的目錄下,生成了core文件,把這個(gè)core文件拷貝到主機(jī),然后執(zhí)行命令
arm-linux-gnueabihf-gdb gdbtest core.gdbtest.6934.1705905673
然后使用bt命令就可看到段錯(cuò)誤的位置了
這樣就可以迅速定位到問題點(diǎn)了。
總結(jié)
????????GDB調(diào)試是一個(gè)很強(qiáng)大的工具,這里只是簡(jiǎn)單的講了一下gdb的用法,還有很多功能,本人也還在繼續(xù)學(xué)習(xí)使用。文章來源:http://www.zghlxwxcb.cn/news/detail-824044.html
? ? ? ? 希望我的文章可以幫助到你?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-824044.html
到了這里,關(guān)于arm環(huán)境使用GDB調(diào)試的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!