[英]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)
運行file
或exec-file home
曾經給我“家中沒有符號”,但現在它詢問我是否要刪除 table for file
或 import new table for exec-file
。 當我選擇后者時,我得到了相同的消息, no debugging symbols
。
選項順序很重要的原因是-o
接受一個選項參數,該參數是 output 文件的名稱。 所以當你輸入:
gcc -o -g home debugTest.cpp
你說的是,我想生成一個 output 文件名-g
作為輸入,我想使用文件home
和debugTest.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.