簡體   English   中英

gdb 中沒有加載符號?

[英]No symbols loaded in gdb?

這是錯誤

g++ -o -g home debugTest.cpp
/usr/bin/ld: home: _ZSt4cout: invalid version 4 (max 0)
/usr/bin/ld: home: error adding symbols: bad value
collect2: error: ld returned 1 exit status
make: *** [Makefile:2: home] Error 1

非常令人困惑的是,當我在-o之后添加-g時會發生這種情況,反之亦然。 我仍然得到“沒有加載任何符號”。 顯然沒有這些符號我無法運行run ,我顯然需要運行run調試。 這種“外部”調試只是因為我認為使用 VSC 調試 C++ 並不那么容易。 你可以在這個中看到更多。

謝謝。

編輯

這是我運行gdb home (home 是可執行的)時得到的結果,反之亦然-o-g的順序。

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from home...
(No debugging symbols found in home)
(gdb) 

運行fileexec-file home曾經給我“家中沒有符號”,但現在它詢問我是否要刪除 table for file或 import new table for exec-file 當我選擇后者時,我得到了相同的消息, no debugging symbols

選項順序很重要的原因是-o接受一個選項參數,該參數是 output 文件的名稱。 所以當你輸入:

gcc -o -g home debugTest.cpp

你說的是,我想生成一個 output 文件名-g作為輸入,我想使用文件homedebugTest.cpp 這顯然是不對的。

您需要將選項參數放在它作為參數的選項旁邊,因此它必須是:

gcc -g -o home debugTest.cpp

或者你可以把它完全放在另一邊,像這樣:

gcc -o home -g debugTest.cpp

但是你不能在選項 ( -o ) 和它的參數 ( home ) 之間放置一些東西。

至於你的調試問題, debugTest.cpp文件里有什么? 如果你運行./home ,它會做什么?

預計到達時間

很抱歉,我無法重現您的問題,因此您的環境或系統中一定有一些您沒有與我們溝通的內容。 我拿了您提供的源代碼並嘗試了它,它工作正常:

$ g++ -g -o home debugTest.cpp

$ gdb home
GNU gdb (GDB) 8.2.1
  ...

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from home...done.
(gdb) run
Starting program: /tmp/home
Name
[Inferior 1 (process 479404) exited normally]
(gdb) br main
Breakpoint 1 at 0x5555555552c4: file debugTest.cpp, line 6.
(gdb) run
Starting program: /tmp/home

Breakpoint 1, main () at debugTest.cpp:6
6       int main(){
(gdb) n
7         std::string name = "Name";
(gdb) n
8         print(name);
(gdb) n
Name
9         return 0;
(gdb) n
7         std::string name = "Name";
(gdb) n
10      }
(gdb) n
0x00007ffff7be30b3 in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) n
Single stepping until exit from function __libc_start_main,
which has no line number information.
[Inferior 1 (process 479447) exited normally]
(gdb) q

g++-o選項需要一個參數,即 output 文件的所需名稱。 根據命令行解釋的標准 POSIX 約定,並且在我閱讀它們時與g++文檔一致,必須緊跟命令行上的-o (POSIX 允許將它們合並為單個參數,但我不認為g++承認)。

-o和它的參數之間插入另一個選項是不正確的。 我對您的示例的期望是g++會將-g解釋為要創建的 output 文件的名稱,但它可能會執行其他操作,例如使用a.out ,默認名稱為 Z78E6221F6393D1356661 文件。 無論哪種方式,在這種情況下,我希望它將home解釋為輸入文件的名稱。 它不是 C++ 源文件,它將作為 object 文件或(可能)包含在鏈接中的共享庫簡單地傳遞給 linker。 先前存在的home就是您要調試的文件。 據推測,它是在沒有調試符號的情況下構建的和/或在構建后被剝離。

您可以將-g選項放在-o之后,但它也必須遵循 output 文件名:

g++ -o home -g debugTest.cpp

-o home必須被視為一個有凝聚力的單元,而不是被拆分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM