2010年8月17日 星期二

使用GDB來Debug

  • 編譯gdb主程式

    在gdb的程式碼目錄下,依照下列步驟編譯。

    #tar jxf gdb-6.8.tar.bz2 #cd gdb-6.8 #export PATH=/usr/local/arm/3.4.1/bin:$PATH (將arm-linux-gcc的路徑加入PATH環境變數) (作自動配置,指定目標平台為arm-linux,執行檔加上"arm-linux-"前置號,安裝於目錄/usr/lcal/arm/3.4.1) #./configure --target=arm-linux --program-prefix=arm-linux-  --prefix=/usr/local/arm/3.4.1 #make #make install 

    這樣就建立了可以除錯ARM架構的gdb工具,並將 arm-linux-gdb 執行程式置於 /usr/local/arm/3.4.1/bin 路徑下。

  • 編譯gdbserver程式

    gdbserver主要是在ARM Linux平台上執行,用來與PC端的gdb程式溝通,在gdb的程式碼下的 "gdb/gdbserver"目錄,有gdbserver的程式碼,可依照下列步驟編譯出ARM平台的gdbserver程式

    #cd gdb/gdbserver #./configure --host=arm-linux #make #arm-linux-strip -s gdbserver (去掉除錯資訊,減少code size) 將gdbserver複製到ARM的檔案系統中,並加上 x 屬性 

    這樣就建立了可與gdb主程式溝通的gdbserver,請將gdbserver放到ARM Linux的檔案系統中。

    //用來Debug的方法

    在PC上進行程式編譯,使用arm-linux-gcc編譯成ARM執行檔

    #arm-linux-gcc -g -O0 -o hello.gdb hello.c  (hello.gdb 包含debug資訊,供gdb做除錯用) #cp hello.gdb hello #arm-linux-strip -s hello (去除debug資料,減少code size,將hello放到ARM Linux系統中執行) 

    編譯時記得要加上 -g-O0 參數(第一個是字母'O',第二個是數字'0'),-g : 加上debug 資料到執行檔,-O0表示不要作最佳化,這樣才能讓Debug時的程式執行順序與我們的程式碼一致。之後複製一份hello執行檔,並去除debug資料,減少code size這個hello執行檔放到Embedded Linux的檔案中,之後可以使用gdbserver帶起hello程式。而hello.gdb留在PC端,透過gdb載入程式與Debug資料作除錯用。

    在ARM平台上執行gdbserver,開啟網路port:3333,並帶起hello執行檔,等待gdb主程式連線。port號碼可自訂,選一個不衝突的就可以了。

    (At ARM Linux) # gdbserver  :3333 hello Process hello created; pid = 390 Listening on port 3333 

    現在就可以在PC上執行gdb主程式,並透過網路作除錯。本文介紹使用ddd工具作除錯介面

    (At PC Linux) # ddd --debbugger arm-linux-gdb hello.gdb  (指定ddd使用arm-linux-gdb除錯,並載入具有Debug 資料的hello.gdb檔) 

    執行時會遇到的問題。
    1.一直出現Program received signal SIG32, Real-time event 32.這樣的訊息。
    找不到arm-linux-insight。直接在gdb模式下面入:
    handle SIG32 pass noprint nostop

    还有一种解决方法
    编译时不带--static选项,会出现SIG32警告
    $ arm-linux-gcc -g threads.c -o threads-shared -lpthread
    编译时使用--static选项,则不会
    $ arm-linux-gcc -g threads.c -o threads-static -lpthread --static
    这种方法我没有试过


    出現warning: `/lib/ld-linux.so.2': Shared library architecture unknown is not compatible with target architecture arm.
    可以使用add-symbol-file /home/winging/DVR8181/arm-linux-2.6/target/rootfs-cpio/lib/ld-linux.so.2