使用DDD開發ARM Linux程式

2021-05-22 08:26:32 字數 3271 閱讀 5744

使用ddd+gdb開發arm linux程式

今天又取得了一些進展,趕快寫下來以免自己忘記。

自從linux在我的板子上跑起來之後,我一直在想乙個問題,怎麼除錯將來寫的程式。其實我在linux開發方面真得很外行,到了今天才知道gdb到底是 幹什麼用的,呵呵。我相信很多人從bootloader除錯開始一直都使用led啊,printf這樣的方法來除錯。我做畢設時,就是在mtdblock 裡面劃出乙個user分割槽,然後把編譯好的程式放入檔案系統映像,通過bootloader用串列埠下到nand裡,然後mount上除錯,實在很花時間。 今天,白痴的我終於找到了一條捷徑,已經不咳嗽了!

先介紹下ddd和gdb,gdb是一種用於除錯linux下程式的工具,它不僅能除錯c/c++,還可以除錯pascal等很多其他語言。我們看個例子: 假設有乙個程式叫做test.c,要用gdb除錯它,首先,編譯的時候需要加上產生debug資訊選項「-g」,如#arm-linux-gcc test.c -o test -g;然後,由於我們並不是開發本機程式,在目標機(arm)上需要用乙個server啟動這個含有除錯資訊的程式,當然,本機和目標機之間得有一定的數 據共享方式(如nfs)和一定的通訊方式(如乙太網或串列埠);最後,在本機上啟動乙個gdb客戶端,就可以登陸到目標機的server上除錯程式了。 gdb的原理網上也有很多文章說,可以搜尋下,但是我是初學者,就不去看那些內容了。為了讓大家更加明確gdb和ddd的區別,我們先看乙個gdb的除錯 過程:

我通過乙太網除錯,本機ip位址192.168.2.31,目標機(arm開發板ip位址192.168.2.223),本機通過nfs共享開發目錄lgraphics。

首先本機上編譯:

lxz@lxzlinux:~/lgraphics

> arm-linux-gcc lgraphics.c -o lg -g

切換到目標機:

[root@(none) lgraphics]# gdbserver 192.168.2.31:2345 lg

process lg created; pid = 402

listening on port 2345

切換到本機:

lxz@lxzlinux:~/lgraphics

在本機上輸入:

(gdb) b main                                          (設定斷點到main函式)

breakpoint 1 at 0x9c00: file lgraphics.c, line 442.

(gdb) cont                                              (開始執行)

continuing.

breakpoint 1, main () at lgraphics.c:442   (遇到斷點,並顯示斷點程式行)

442             int i, j, b = 0;

(gdb) step                                              (單步執行)

445             linitgraph("/dev/fb0");           (顯示目前程式行)

好了,看到這裡,差不多就明白gdb是幹什麼的、怎麼用了吧。我相信你會和我一樣對gdb介面的不友好表示憤慨,想想windows下的開發工具,哪一種 除錯的時候還是文字介面的。幸運的是,有一些勤快的人,幫我們寫了很多gdb的圖形化前端,我們更本不用像上面這樣使用gdb。

開始說ddd。ddd是一種gdb的圖形化前端,就是一種用圖形介面幫你輸入繁瑣的gdb除錯指令工具。當然,也有很多文章說ddd多麼不足,用insight來取代它之類的。我的suse裡恰好就有ddd,我也不管那麼多了,先用了。看看用ddd的時候怎麼除錯:

一樣本機上編譯:

lxz@lxzlinux:~/lgraphics

> arm-linux-gcc lgraphics.c -o lg -g

切換到目標機:

[root@(none) lgraphics]# gdbserver 192.168.2.31:2345 lg

process lg created; pid = 402

listening on port 2345

切換到本機:

lxz@lxzlinux:~/lgraphics

> ddd -debugger arm-linux-gdb lg

然後就會啟動ddd的圖形介面,在視窗下方有乙個文字輸入框,這裡就是ddd的基礎gdb的所在,在這裡輸入target remote 192.168.2.223:2345 lg,提示資訊和我們用gdb時候是一樣的。不同的是,除了這句連線目標機的指令,其他指令都不用輸入了,可以在圖形化介面裡找到,這我就不說了。另外, 連線目標機的指令也可以用在ddd中設定,不用輸入,可以查詢其他介紹ddd使用的文章。下面是ddd的圖形介面,工具欄下面的是watch,**可以設 置斷點(紅色點),可以看到單步位置(綠色箭頭),右邊是執行控制工具條,最下面是gdb的輸入和輸出顯示。

看到這裡,想我一樣的菜鳥們一定發現了,原來linux程式可以這麼好調啊,簡直和ce沒有什麼差別了,呵呵。下面介紹為了使用gdb+ddd所要做的東 西。我不是從零開始建立的,具體的包依存關係我也不明白,只好假設你在安裝linux的時候已經安裝了像gcc,ddd之類的工具。gdb的源**包 gdb-6.6.tar.bz2可以從

ftp://gcc.gnu.org

這裡,--prefix引數是需要安裝的目錄,然後

# make

# make install

這樣,arm-linux-gdb這個工具就在/home/lxz/lxzgdb/bin裡頭了,你可以把這個路徑新增到path裡面去

接下來建立gdbserver,在gdbbuild的上一級目錄下

# mkdir gdbserverbuild

# cd gdbserverbuild

# cc=arm-linux-gcc ../gdb-6.6/gdb/gdbserver/configure --host=arm-linux --prefix=/home/lxz/lxzgdbserver

一樣,--prefix引數是需要安裝的目錄,然後

# make

# make install

有的文章裡說,要去除arm-linux-strip的除錯資訊

# cd /home/lxz/lxzgdbserver/bin

# arm-linux-strip gdbserver

把這個gdbserver複製到你的開發板上,就ok了。

本文出處:

使用DDD GDB開發ARM Linux程式

自從linux在我的板子上跑起來之後,我一直在想乙個問題,怎麼除錯將來寫的程式。其實我在linux開發方面真得很外行,到了今天才知道gdb到底是 幹什麼用的,呵呵。我相信很多人從bootloader除錯開始一直都使用led啊,printf這樣的方法來除錯。我做畢設時,就是在mtdblock 裡面劃出...

搭建arm linux開發平台

在網上找了很多資料,才建立了自己的linux開發平台,這裡要感謝網路上的大牛們提供的資料,讓我少走了很多彎路,現在把我 搭建平台的步驟說明如下,主要是給自己乙個備份,呵呵。先介紹一下我使用的開發平台 開發板使用 帶s3c2440cpu的開發板,linux2.6 pc機上安裝的是ubuntu10.10...

ARM Linux開發 Linux鏈結

鏈結有兩種方式 硬鏈結和軟鏈結。一 軟鏈結 軟鏈結又叫做符號鏈結。基本命令為 plain ln s sourceplace newplace 軟鏈結可以鏈結任何檔案或者目錄,還可以鏈結不同檔案系統的檔案或者目錄。軟鏈結的特點 1.要建立鏈結時,newplace必須是存在的 而當sourceplace...