簡體   English   中英

如何使用 gdb 調試帶有遞歸生成文件的代碼庫

[英]How to use gdb to debug a codebase with recursive makefiles

我得到了一個由 c++ 和 QT 模塊組成的巨大代碼。 要編譯,我需要運行 ./configure 然后 make。

./configure 在目錄和子目錄中生成幾個 makefile 並運行 make 遞歸地運行目錄中的 make。

現在我想更改 test.h 中的一小部分代碼。 可執行文件位於不同的文件夾中。

這是問題所在;

# gdb foo
Reading symbols from /xx/yy/zz/foo

(gdb) break ../qq/zz/test.h:53
No source file named ../qq/zz/test.h
Make breakpoint pending on future shared library load? (y or [n])

我也試過絕對路徑,但也沒有用。

然后我這樣做了:

(gdb) add-symbol-file  ../qq/zz/someObjFile.o
The address where ../qq/zz/someObjFile.o has been loaded is missing

然后我嘗試了這個:

(gdb) symbol-file ../qq/zz/someObjFile.o
Load new symbol table from "../qq/zz/someObjFile.o"? (y or n) y
Reading symbols from  "../qq/zz/someObjFile.o" ...done
(gdb) break test.h:53
Cannot access memory at address 0x20

我已經看到一些線程通過查找實際內存地址來回答“無法訪問地址處的內存”,但我認為這不是我需要的。 我錯過了一些更簡單的東西。

如果有幫助:

我正在使用 GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 並且 someObjFile.o 是由 makefile 在 test.h 存在的文件夾中生成的目標文件(test.h 包含在 someObjFile.cpp 文件中)

任何提示表示贊賞。

在您運行程序之前,GDB 不會從.so文件加載符號。 此外,文件可以通過文件名而不是路徑來引用。

嘗試

b main
r
...
...
# GDB stops
b test.h:57

此外,有時在大型項目中,GDB 會對行號感到困惑。 嘗試在函數上設置斷點。

(gdb) break ../qq/zz/test.h:53
No source file named ../qq/zz/test.h
Make breakpoint pending on future shared library load? (y or [n])

通常意味着有問題的代碼被內置於一個共享庫,並且您還沒有裝載的共享庫

您應該對 GDB 提出的問題回答“ yes ”,或者只運行一次應用程序(這將使 GDB 加載並保留該運行中使用的所有庫的調試符號),然后為第二次運行設置斷點。

然后我這樣做了:

激烈的活動不能代替理解。 由於您缺乏理解,因此在 GDB 中輸入各種“隨機”命令不太可能對您有所幫助。

更新:

再次出現與“沒有名為...的源文件”相同的錯誤

好吧,也有可能someObjFile.o中的代碼實際上從未加載到您的進程中。 確認這一點的一種簡單方法是將assert(0)放在test.h第 53 test.h 如果您的程序仍在運行,那么(假設您在構建時不使用-DNDEBUG )您可以確定第 53 行實際上從未執行過。

暫無
暫無

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

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