2012-12-23 81 views
10

我試圖遠程調試在地址爲192.168.98.64的計算機上運行的應用程序。在該機器上我運行:GDB遠程調試,似乎無法找到符號

 
gdbserver serveripaddr:4444 progname 
從服務器

然後我跑「廣發行」,然後在gdb的提示符下運行:

 
(gdb) target remote 192.168.98.64:4444 
Remote debugging using 192.168.98.64:4444 
[New Thread 28432] 
warning: Could not load vsyscall page because no executable was specified 
try using the "file" command first. 
0xb775e810 in ??() 
(gdb) break internal[TAB] 

試圖設置時,我期待TAB鍵的按壓我的斷點提出了一個以內部開始的相應函數列表,但它沒有提供任何東西。這個代碼已經用-g打開了調試。我究竟做錯了什麼?

回答

8

我跑

你應該給GDB正在調試的可執行文件(它最好是未剝離的版本)「廣發行」:

gdb /path/to/progname 
(gdb) target remote 192.168.98.64:4444 
3

我只是遇到了這個在我使用交叉編譯的gdb時遇到了問題(如果遠程主機具有不同的體系結構,則通常需要這樣做)。在這種情況下,需要從遠程主機編譯的二進制文件中讀取符號。我想通了,我下面的作品(也如果主機上的架構是相同的):

在遠程主機:

gdbserver [host]:[port] [remote-path-to-binary-from-gdbserver-workdir] 

,然後在本地主機上(交叉編譯) GDB:

shell sleep 5 
target remote [host]:[port] 
symbol-file remote:[remote-path-to-binary-from-gdbserver-workdir] 
directory [local-root-directory-for-source-files] 
continue 

更換[*]與您的數據。您可以將其用作gdb腳本(因此在第一行中爲sleep),或者在gdb命令行中輸入它。可選的目錄行告訴它將本地源目錄添加到源的搜索路徑。如果您使用指向源代碼的前端,這會很有用。

1

當調試遠程時,gdb客戶端不知道從哪裏加載符號。你有兩個選擇:

1. specify executable when starting gdb 

gdb <executable> 
(gdb) target remote <IP>:<port> 
(gdb) load <executable> 
gdb should know symbols now 
(gdb) b main 
(gdb) mon reset 
(gdb) contnue 
it should break at main 
(gdb) bt 

2. use file command to tell about the symbols. 

gdb 
(gdb) target remote <IP>:<port> 
(gdb) load <executable> 
(gdb) file <executable> 
gdb should know symbols now 
(gdb) b main 
(gdb) mon reset 
(gdb) contnue 
it should break at main 
(gdb) bt 

PS:請確保您已編譯的可執行文件與調試符號-g -O0

+0

如果我不使用'在編譯時-g'然後我就可以僅僅通過標籤moove我手動定義。調試符號究竟是什麼? GDB是否爲源文件的每一行創建一個標籤'1:','2:','3:'...? – 71GA

+1

符號是在二進制文件(調試模式)中編譯以將指令關聯到代碼文本的信息。這樣你就可以在調試器中看到人類可讀的信息。爲了達到這個目的,你必須用'-g'編譯並放在源代碼目錄中,這樣'gdb'才能找到調試二進制指向的源文件。 –

相關問題