天天看點

Linux下嵌入式程式仿真調試(GDB)(二)目錄前言Ubuntu下Qt的GDB環境搭建(未成功)指令行調試問題記錄總結連結位址

目錄

  • 目錄
  • 前言
  • Ubuntu下Qt的GDB環境搭建未成功
    • Qt5的設定
  • 指令行調試問題記錄
  • 總結
  • 連結位址

前言

Linux下嵌入式程式仿真調試(GDB)(一)主要介紹了GDB交叉調試環境的搭建過程,本想把交叉編譯好的gdb程式放置到Qt中來進行遠端調試,但是最終出現了錯誤。是以這裡記錄搭建Qt的遠端調試環境的過程(沒有成功),以及在指令行下使用GDB時遇到的一些問題。

Ubuntu下Qt的GDB環境搭建(未成功)

網上找到的Qt的GDB環境搭建教程很多是Qt4的GDB調試環境搭建,但是部落客使用的是Qt Creator 5.6.2,是以配置也和Qt4不一樣。如果是在Qt4的環境下可以參考用Qt 調用GDB調試 Arm程式 詳細步驟—-可單步執行每一行,其實如果大家仔細看這篇博文,會發現這篇文章中講述了把海思SDK中的檔案移植到QtCreator的過程。是以即使GDB環境搭建不成功,(如果有需要)也可以學到如何把海思的SDK弄成Qt版的程式。

Qt5的設定

部落客沒有找到所謂的

Start and Debug Remote Application

,因為部落客的菜單來漢化了一部分,是以有點坑。不過感覺是

Attach to Running Debug Server..

,但是我設定了伺服器位址和端口,圖如下所示:

Linux下嵌入式程式仿真調試(GDB)(二)目錄前言Ubuntu下Qt的GDB環境搭建(未成功)指令行調試問題記錄總結連結位址

注意:需要在建構條件中設定調試器,如圖:

Linux下嵌入式程式仿真調試(GDB)(二)目錄前言Ubuntu下Qt的GDB環境搭建(未成功)指令行調試問題記錄總結連結位址

但是我設定的

arm-linux-gnueabihf-gdb

沒有被QtCreator識别,是以也不知道是什麼問題。

最終出現如下錯誤:

Unknown debugger type "No engine"
Unable to create a debugger engine of the type "No engine"
           

當然,偶然看到一篇部落格說是因為是Ubuntu16.04 64位系統,而我的

arm-linux-gnueabihf-gdb

是32位的,會出現不相容的現象,是以我安裝了:

不過,仍然是上面的錯誤,可能其他人能夠成功吧!附【Linux開發】【Qt開發】arm-linux-gnueabihf-gdb versus gdb-multiarch

雖然知道是

arm-linux-gnueabihf-gdb

不被QtCreator識别,但是也不知道如何解決,希望有解決的朋友能夠告知!感謝!!!

指令行調試問題記錄

在指令行下調試的過程中,因為部落客也沒有深入去研究gdb的指令,是以隻是簡單講下我了解測試過的問題。在主機端和開發闆端遠端連接配接建立後,我執行了如下指令:

第一,重複一下遠端連接配接建立的指令:

// 開發闆 
mount -t nfs :/nfs /opt -o nolock
gdbserver : helloWorld
// 注:開發闆端是伺服器端,等待主機端連接配接
// 主機端
arm-linux-gnueabihf-gdb helloWorld
target remote :
           

第二:使用gdb進行調試,gdb調試指令,部落客對這些調試指令也不熟,直接附上我的gdb調試代碼。

(gdb) target remote : // 遠端連接配接

(gdb) file xxx // 這裡是加載運作程式 

(gdb) run       // 運作部落客的程式出現不支援run,沒有研究,直接continue
The "remote" target does not support "run".  Try "help target" or "continue".

(gdb) continue // continue是出現警告
Continuing.
warning: Could not load shared library symbols for  libraries, e.g. /tftpboot/grape_ffmpeg/lib/libavcodec.so.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
warning: Could not load shared library symbols for  libraries, e.g. /tftpboot/qt5-grape/plugins/platforms/libqlinuxfb.so.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
           

部落客想要解釋的就是這裡的

info sharedlibrary

set solib-search-path

為什麼會出現

warning: Could not load shared library symbols for 25 libraries?

這樣的警告呢?,部落客在網上查到很多相關的解釋,很多都是複制粘貼,一筆帶過,卻沒有說明具體的解決步驟。最後在這裡:set solib-search-path command,才明白該如何使用。雖然都是英文,但是其實人家的解釋真的非常非常簡單。

這裡翻譯一下原文:

  • set solib-search-path command

    set solib-search-path用于指定GDB查找動态庫檔案時的目錄。這個選項在gdbsever調試的使用有用。

  • syntax
set solib-search-path [Directories]
show solib-search-path
           
  • Parameters
    1. Directories

      在Linux指定目錄清單,通過(:)分隔,在Windows下使用(;)分隔,這裡的目錄清單就是查找符号時的動态連結庫目錄。

  • Typical use

    這個指令在通過gdbsever遠端調試程式的時候有用。如果遠端電腦和GDB電腦的共享庫路徑不一緻,GDB不會自動的找到動态連結庫和相關符号,除非使用

    set solib-search-path

    指定包含的目錄。

    比如,如果你從帶有GDB的電腦端複制

    /home/testuser/libtest/libTest.so

    到帶有GDBServer的電腦端,命名為

    /tmp/libTest.so

    ,你需要指定

    set solib-search-path /home/testuser/libtest

    ,來讓符号加載。

    部落客記:也就是說,如果我們交叉編譯的程式在開發闆上指定的動态連結庫的路徑和在Ubuntu下的動态連結庫的路徑不一樣,我們在電腦上使用gdb調試程式的時候,無法找到對應的開發闆的動态連結庫路徑,畢竟遠端調試沒有開發闆上的庫路徑,所有我們要在電腦端(帶GDB)使用電腦端的交叉編譯的庫路徑,指定就需要使用到set solib-search-path。

  • Default value

    solib-search-path

    的預設值是”.”,和GDB的工作路徑移植,也就是電腦端的目前目錄。

總結:如果開發闆端的路徑和電腦端的路徑不一緻,我們就需要使用

set solib-search-path

來設定電腦端的交叉編譯動态庫的路徑。

總結

對GDB隻是簡單的用了一下,本來我的問題是程式在Ubuntu下成功運作,但是在開發闆上段錯誤,一直找不到問題,也沒辦法調試,因為是多線程程式,是以不太了解調試方法,這時候想到了GDB,不過後面靈機一動,解決了,果然局部變量的值傳遞要慎用!!!

連結位址

用Qt 調用GDB調試 Arm程式 詳細步驟—-可單步執行每一行

【Linux開發】【Qt開發】arm-linux-gnueabihf-gdb versus gdb-multiarch

set solib-search-path command