2011-12-05 50 views
8

我從嵌入式設備使用gdbserver的調試:GDB不顯示函數名

./gdbserver HOST:5000 /home/test_app 

在我的電腦,我用這種方式執行GDB:

arm-none-linux-gnueabi-gdb test_app 

一旦應用程序執行,我收到我要調試的內存設計缺陷,但它是不可能知道什麼線生產出來:

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 715] 
0x31303030 in ??() 
(gdb) bt 
#0 0x31303030 in ??() 
#1 0x0000dff8 in ??() 
#2 0x0000dff8 in ??() 
Backtrace stopped: previous frame identical to this frame (corrupt stack?) 

(我必須說,我totall y新的GDB)

+1

你用什麼標誌編譯? GDB知道從哪裏獲取源文件,以便它可以顯示停止的行嗎? –

+1

我不明白。你的電腦是ARM?而且你根本沒有連接到GDB服務器。 –

+1

請問您可以發佈您的編譯器執行線和完整的GDB命令嗎?我同意Tomalak Geret'kal的看法,這裏肯定缺少一些東西,至少連接到GDB服務器和設置源目錄的命令。 – thiton

回答

10

確定,如果調試符號缺少這通常發生...只是爲了確保運行以下命令

file <your_executable> 

,你會得到你的二進制格式一樣,拱等信息..信息的最後部分描述了二進制文件是否被刪除。對於在GDB中調試,二進制文件不應該被剝離。

nm --debug-sym <your_executable> | grep debug 

如果您有一些如下所示的有效打印,則表示存在調試符號。

00000000 N .debug_abbrev 
00000000 N .debug_aranges 
00000000 N .debug_frame 
00000000 N .debug_info 
00000000 N .debug_line 
00000000 N .debug_loc 
00000000 N .debug_pubnames 
00000000 N .debug_str 

此外,當你調用GDB你應該follwing線

Reading symbols from <your_executable>...done. 

此時,你應該能夠列出源與list命令。

確保gdb和gdbserver具有相同的版本號。

arm-none-linux-gnueabi-gdb --version 
./gdbserver --version 

如果以上屬實,你仍然沒有得到回溯,有什麼不與你的堆棧回事。嘗試運行一些靜態分析,在您的代碼/新添加的代碼上使用valgrind。

+0

感謝您的信息!恐怕我剝了它... – funkadelic

+0

我不認爲這個答案是真的。我發現了幾個帶有可見功能名稱的剝離文件(但沒有源文件可重現) – Blauhirn

5

您需要構建您的應用程序啓用調試符號。 gcc的開關是-g

+0

這絕對是一個方面,但有更多與gdbserver交叉調試。 OP還沒有發佈足夠的信息來回答這個問題。 – thiton

+0

我現在無法發佈我使用的完整編譯選項,但是我使用了-g。 – funkadelic