1. 程式人生 > >轉載_使用DDD+GDB開發ARM Linux程式

轉載_使用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-gcctest.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。 首先本機上編譯: [email protected]:~/lgraphics>arm-linux-gcc lgraphics.c -o lg -g 切換到目標機: [[email protected](none) lgraphics]# gdbserver192.168.2.31:2345 lg
Process lg created; pid = 402
Listening on port 2345 切換到本機:
[email protected]:~/lgraphics>arm-linux-gdb lg
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License,and you are
welcome to change it and/or distribute copies of it under certainconditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty"for details.
This GDB was configured as "--host=i686-pc-linux-gnu--target=arm-linux"...
(gdb) target remote 192.168.2.223:2345 lg
Remote debugging using 192.168.2.223:2345 lg
0x40001290 in _start () from /lib/ld-linux.so.2
此時,目標機上也會出現: Remote debugging from host 192.168.2.31 在本機上輸入: (gdb) bmain                                         (設定斷點到main函式)
Breakpoint 1 at 0x9c00: file lgraphics.c, line442.
(gdb)cont                                             (開始執行)
Continuing. Breakpoint 1, main () atlgraphics.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的時候怎麼除錯: 一樣本機上編譯:
[email protected]
:~/lgraphics>arm-linux-gcc lgraphics.c -o lg -g 切換到目標機: [[email protected](none) lgraphics]# gdbserver192.168.2.31:2345 lg
Process lg created; pid = 402
Listening on port 2345 切換到本機:
[email protected]:~/lgraphics> ddd-debugger arm-linux-gdb lg 然後就會啟動DDD的圖形介面,在視窗下方有一個文字輸入框,這裡就是ddd的基礎gdb的所在,在這裡輸入targetremote 192.168.2.223:2345lg,提示資訊和我們用GDB時候是一樣的。不同的是,除了這句連線目標機的指令,其他指令都不用輸入了,可以在圖形化介面裡找到,這我就不說了。另外,連線目標機的指令也可以用在DDD中設定,不用輸入,可以查詢其他介紹DDD使用的文章。下面是DDD的圖形介面,工具欄下面的是watch,程式碼可以設定斷點(紅色點),可以看到單步位置(綠色箭頭),右邊是執行控制工具條,最下面是GDB的輸入和輸出顯示。 使用DDD+GDB開發ARM <wbr>Linux程式
看到這裡,想我一樣的菜鳥們一定發現了,原來Linux程式可以這麼好調啊,簡直和CE沒有什麼差別了,呵呵。下面介紹為了使用GDB+DDD所要做的東西。我不是從零開始建立的,具體的包依存關係我也不明白,只好假設你在安裝Linux的時候已經安裝了像GCC,DDD之類的工具。GDB的原始碼包gdb-6.6.tar.bz2可以從ftp://gcc.gnu.org上下載到,還有一個要求是你已經安裝了交叉編譯器arm-linux-gcc。 下載下來後: # tar xvjf gdb-6.6.tar.bz2 # mkdir gdbbuild # cd gdbbuild # ../gdb-6.6/configure--target=arm-linux   --prefix=/home/lxz/lxzgdb 這裡,--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了。 今天就寫到這裡。



=====================================================================================
                                                                                           SPLIT
=====================================================================================

ARM Linux 交叉除錯工具及方法

一、交叉除錯工具

1、主機 : arm-linux-gdb

2、 arm: gdbserver

在開發主機上執行 arm-linux-gdb 程式,可以通過串列埠或網口與駐留在 ARM 開發板上的 gdbserver
程式進行通訊,完成 ARM 開發板上應用程式的除錯和跟蹤。

二、交叉除錯工具的生成

1、下載 gdb 原始碼

譯即可獲得以上兩個工具軟體。
gdb 原始碼的版本為: gdb-6.8
原始碼包名稱: gdb-6.8a.tar.bz2

2、編譯環境

開發主機系統: ubuntu11.10
開發主機 gcc 版本: 4.4.6
交叉編譯器版本: 4.5.1

三、配置和編譯

1、解壓原始碼

首先進入 gdb-6.8a.tar.bz2 所在的目錄,解壓後會在當前目錄生成新的原始碼目錄: gdb-6.8,在 shell
下輸入以下命令 (紅色為命令 )。
[email protected]:~/Downloads$tar -xvf gdb-6.8a.tar.bz2

2、進入原始碼目錄

進入 gdb-6.8 目錄,命令如下:
[email protected]:~/Downloads$ cd gdb-6.8
[email protected]:~/Downloads/gdb-6.8$
建立目標檔案目錄,命令如下:
[email protected]:~/Downloads/gdb-6.8$ mkdir output

3、編譯 arm-linux-gdb

在原始碼目錄下進行配置,配置完成後會在當前目錄和 gdb 目錄下生成 Makefile 檔案,命令如下:
[email protected]:~/Downloads/gdb-6.8$./configure --target=arm-linux --enable-shared
--prefix=/home/bill/Downloads/gdb-6.8/output/x86 --without-x --disable-gdbtk --without-
included-regex --without-include-gettext
編譯,命令如下:
[email protected]:~/Downloads/gdb-6.8$ make
編譯過程中會出錯,資訊如下:
cc1: warnings being treated as errors
.././gdb/cli/cli-cmds.c: In function ‘pwd_command’:
.././gdb/cli/cli-cmds.c:323: error: ignoring return value of ‘getcwd’, declared with attribute
warn_unused_result
make[2]: *** [cli-cmds.o] Error 1
make[2]: Leaving directory `/home/bill/Downloads/gdb-6.8/gdb'
make[1]: *** [all-gdb] Error 2
make[1]: Leaving directory `/home/bill/Downloads/gdb-6.8'
make: *** [all] Error 2
經過對以上資訊分析可知,編譯時把告警按錯誤看待,所以編譯失敗。解決辦法是修改 gdb-6.8/gdb
目錄下的 Makefile 的第 145 行,即註釋調” -Werror“即可
#WERROR_CFLAGS = -Werror
WERROR_CFLAGS =
安裝,目標檔案會安裝在 /home/bill/Downloads/gdb-6.8/output/x86 目錄下,命令如下:
[email protected]:~/Downloads/gdb-6.8$ make install

4、編譯 gdbserver

進入 gdbserver 目錄,命令如下:
[email protected]:~/Downloads/gdb-6.8$ make gdb/gdbserver
進行配置,命令如下:
[email protected]:~/Downloads/gdb-6.8$./configure --host=arm-linux
--prefix=/home/bill/Downloads/gdb-6.8/output/arm --without-include-regex --without-included-
gettext
編譯,命令如下:
[email protected]:~/Downloads/gdb-6.8/gdb/gdbserver$make
安裝,目標檔案 gdbserver 會安裝在 /home/bill/Downloads/gdb-6.8/output/arm 目錄下,命令如下:
[email protected]:~/Downloads/gdb-6.8/gdb/gdbserver$make install
gdbserver 進行瘦身,命令如下:
[email protected]:~/Downloads/gdb-6.8/gdb/gdbserver$arm-linux-strip /home/bill/Downloads/gdb-
6.8/output/arm/gdbserver

四、測試

以除錯測試例程為例:
原始檔: test.c
編譯目標可執行檔案: gcc -g -o test test.c,注意一定要加上” -g“,否則不能進行除錯。

1、目標板上操作

將生成的 test 檔案和 gdbserver 下載到 ARM 開發板上,在開發板的 Shell 上輸入:
#./gdbserver 192.168.1.100:2345 test
其中 192.168.1.100 為開發機的 IP 地址

2、開發機上操作

[email protected]:~/Downloads/gdb-6.8/gdb/output/x86$./arm-linux-gdb test
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-linux"...
(no debugging symbols found)
(gdb)target remote 192.168.1.5:2345
其中 192.168.1.5 為開發板的 IP 地址
連線上後開發板的串列埠上會出現以下列印:
Remote debuging from host 192.168.1.100
(gdb)



相關推薦

轉載_使用DDD+GDB開發ARM Linux程式

今天又取得了一些進展,趕快寫下來以免自己忘記。 自從Linux在我的板子上跑起來之後,我一直在想一個問題,怎麼除錯將來寫的程式。其實我在Linux開發方面真得很外行,到了今天才知道GDB到底是幹什麼用的,呵呵。我相信很多人從Bootloader除錯開始一直都使用LED啊,printf這樣的方法來除錯。我做畢

用eclipse整合開發環境開發、除錯arm linux程式

安裝交叉編譯器(arm-linux-gcc)以及整合開發環境(eclipse) 1.安裝arm-linux-gcc,不管你是從網上下載的,還是開發板光盤裡面的,都可以,版本也沒什麼限制,我的是arm-linux-gcc-4.3.2。   進入arm-linux-gcc

Linux開發LinuxArm-Linux程式開發筆記(零基礎入門篇)

Linux及Arm-Linux程式開發筆記(零基礎入門篇)  目錄 一、Arm-Linux程式開發平臺簡要介紹... 3 1.1程式開發所需系統及開發語言... 3 1.2系統平臺搭建方式... 4 二、Linux開發平臺搭建... 5 2.1安裝虛擬工作站...

gdbarm-linux-gdb命令詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

在android系統命令列中執行arm linux程式,出現/system/bin/sh: .xxx No such file or directory問題

android系統的底層就是Linux,理論上arm linux程式在android系統中也能夠執行。但是當我寫了一個“Hello World”程式並執行時,出現了下面的錯誤: system/bin/sh:./ a.out No such file or directory

arm-linux上用gdb除錯程式,出現“Program received signal SIGPIPE, Broken pipe”

        出現這種情況大多是因為程式採用CS架構(伺服器/客戶端)在讀寫操作時出現,我第一次也是在這樣的情況下遇到的。首先我們都知道套接字的通訊方式是雙工的,同端即可寫也可讀。而出現Broken pipe這種情況的原因是寫段正在寫入時,另一端已關閉套接字,這樣程序就會向

GDB arm-linux交叉編譯移植和使用方法(特別是對於正在執行的程式或者段錯誤的程式進行分析)

測試程式碼中的test1是用來定位堆疊段錯誤,Delay函式是用來定位程式阻塞,都可以用gdb定位出來,如下:  (1)測試程式執行時首先會有個段錯誤:./gdbtest & [[email protected] user0]$ [65334.020000] pgd = c3e14000 [

visual GDB配合 visual studio 2013開發 linux程式

visualGDB官網: https://visualgdb.com 參考網址: http://www.cnblogs.com/robinex/p/7875934.html VS外掛VisualGDB破解版下載、安裝和使用說明 https://blog.csdn.net/su

ARM+linux環境下程式開發和燒錄

一  方法一( 串列埠通訊 ):         1.  在PC開發端的linux環境中寫好原始碼。         2.  使用交叉編譯器arm-linux-gcc編譯之。         3.  用超級終端或者DNW建立ARM開發板與PC開發端的連線給ARM開發

Windows下ARM Linux應用程式開發環境搭建說明

這是因為工作寫的一個文件,主要是我們開發人員都不會Linux不會vi也不會命令列,於是研究了一下Windows系統除錯ARM Linux程式的辦法,在這共享一下。1. 概述嵌入式Linux系統的應用程式開發,編譯器一般是gcc,一般都說是要在Linux虛擬機器中進行開發和編譯。本文提供了一種能夠在Wind

通過buildroot+qemu搭建ARM-Linux虛擬開發環境

inux http lex .org linux 通過 clone .gz download 1. 配置工作環境 sudo apt install gcc build-essential bison flex gettext tcl sharutils libncur

[ARM-Linux開發]深入理解 sudo 與 su 之間的區別

在早前的一篇文章中,我們深入討論了 sudo 命令的相關內容。同時,在該文章的末尾有提到相關的命令 su的部分內容。本文,我們將詳細討論關於 su 命令與 sudo 命令之間的區別。 在開始之前有必要說明一下,文中所涉及到的示例

Linux程式宕掉後如何通過gdb查看出錯資訊

我們在編寫服務端程式的時候,由於多執行緒並且環境複雜,程式可能在不確定條件的情況下宕掉,還不好重新,這是我們如何獲取程式的出錯資訊,一種方法通過打日誌,有時候一些錯誤日誌也不能體現出來,這時就用到我們的core dump檔案了。 通常情況下coredmp包含了程式執行時的

Linux下使用gdb除錯C/C++程式

在筆者工作實踐中,使用gdb除錯C++程式和除錯C程式,他們稍有不同,下面是使用總結。 一、編譯選項 -g         生成除錯資訊 -gstabs+   以stabs格式生成除錯資訊,並且包含僅供gdb使用的額外除錯資訊生成除

ICTCLAS2016 linux C++版本 使用教程 Eclipse下開發C/C++程式之標頭檔案,庫檔案引用

歡迎使用NLPIR/ICTCLAS2014分詞系統 NLPIR分詞系統前身為2000年釋出的ICTCLAS詞法分析系統,從2009年開始,為了和以前工作進行大的區隔,並推廣NLPIR自然語言處理與資訊檢索共享平臺,調整命名為NLPIR分詞系統。張華平博士先後傾力打造十餘

ARM-Linux基本開發步驟

拿到一塊YC2440(s3c2440)的開發板,經過幾天的學習,我對arm-linux系統開發步驟有了一些認識。就以開發這個開發板為例,arm-linux開發工作大概分4個部分 1.       硬體(hardware) 2. 

windows系統tomcat上開發的j2ee程式,如何適配linux系統上奔跑的websphere7

公司需要將幾個windows系統tomcat中介軟體下開發的j2ee系統部署到linux系統websphere7中介軟體下去執行。 這就需要做系統的適配工作。由於時間比較久了,具體問題就不詳細寫了。把這個適配工作主要可能涉及到的方面,遇到的問題表現做了一個小的總結,希望能夠幫到有需要的同學。

在桌面Linux環境下開發圖形介面程式的方案對比

在Linux下開發GUI程式的方法有很多,比如Gnome桌面使用GTK+作為預設的圖形介面庫,KDE桌面使用Qt作為預設的圖形介面庫,wxWidgets則是另一個使用廣泛的圖形庫,此外使用Java中的Swing/AWT元件也可以用於開發Linux下的GUI應用。 本文將依次

移植SSH到ARM Linux開發

編譯器arm-linux-gcc和arm-none-linux-gnueabi-gcc成功。         在移植到友善2440的時候很容易,因為他4.3.2交叉編譯器等庫檔案做等好。但是在移植到天漠devkit8000時,遇到非常多的問題。一個月之前遇到問題沒有找到

Linux 程式設計師的自我修養:玩轉 GDB 除錯

我從學生時代到進入軟體開發這個行業,不知不覺已經十餘年了。這些年,先後在網遊公司做過遊戲伺服器,為上海某交易所做過金融交易系統、在金融證券公司做過股票證券交易系統和即時通訊軟體、在音視訊直播公司做過直播伺服器,各種專案使用的伺服器作業系統都是 Linux,開發語言是 C/C++。 正如從