1. 程式人生 > 其它 >gdb除錯時指定原始碼在linux哪個目錄,GDB原始碼查詢路徑

gdb除錯時指定原始碼在linux哪個目錄,GDB原始碼查詢路徑

在gdb程式的時候,有時候會發現原始碼檔案找不到,對於那些帶除錯資訊的系統庫或者第三方庫,很多時候當你真正想gdb去追他原始碼的時候你會發現gdb根本找不到這些原始碼路徑。這個時候有兩種選擇:

【1】如果gdb這個時候告訴你找不到這個帶除錯資訊庫的原始檔路徑,此時給出的路徑地址是絕對路徑,比如

/home/rickyk/qt-4.8./src/corelib/tools/qstring.cpp: 沒有那個檔案或目錄

這種提示的,你就應該用gdb提供的

set substitute-path

這個其實很好理解,就是替換規則,你如果想檢視當前的替換規則,你可以

show substitute-path

比如此時我們需要qstring.cpp這個檔案,但由於某種原因,目前我們不能在/home/rickyk/qt-4.8.6/src/corelib/tools/qstring.cpp中找到,但我們確可以在/home/rickyk/qt-everywhere-opensource-src-4.8.6/src/corelib/tools/qstring.cpp中找到,我們就

set substitute-path /home/rickyk/qt-4.8. /home/rickyk/qt-everywhere-opensource-src-4.8.

這是什麼意思?其實就是讓gdb在看到/home/rickyk/qt-4.8.6的時候他會做自動替換成/home/rickyk/qt-everywhere-opensource-src.4.8.6,也就是說gdb可以正確知道這個檔案了。此時我們再show substitute-path可以看到此時的轉換規則已經被我們加進去了

(gdb) show substitute-path

List of all source path substitution rules:

`/home/rickyk/qt-4.8.' -> `/home/rickyk/qt-everywhere-opensource-src-4.8.6'.

【2】如果此時的gdb彈出的錯誤資訊不是絕對路徑的概念,而是相對路徑的概念

./a.cpp 沒有那個檔案或目錄

那麼此時你可以用gdb的第二個原始碼路徑法寶----directory(dir) dirName來指定,也就是說如果我們此時的a.cpp不在當前目錄下,而是在當前目錄下的bak資料夾下,我們只要

dir bak

這個時候我們的gdb就會把你加進去的dir整個替換到相對路徑的前面,自己做拼接,也就是說,現在的./a.cpp變成了./bak/a.cpp。

注意兩者的差別,對於絕對路徑來說,你需要給出替換規則給他做字串替換,對於相對路徑來說,你需要給他目錄來讓他做拼接,也有點prefix的意思,這裡的prefix由你給出,但相對路徑整體結構由gdb給出,然後完成拼接操作。

PS: 同時你需要在.gdbinit上加上一句

set auto-load safe-path /

這樣你才能讓gdb去正確的在別的目錄進行讀取原始碼 。(這裡面的原因我目前不是很清楚,總之就是我一開始使用set substitute-path的時候怎麼用都不成功,加上這句之後才可以,有同學知道的也可以告訴我原因),我看了下auto-load的介紹

set auto-load safe-path[directories]

Set the list of directories (and their subdirectories) trusted for automatic loading and execution of scripts. You can also enter a specific trusted file. Each directory can also be a shell wildcard pattern; wildcards do not match directory separator - see FNM_PATHNAME for system function fnmatch (see fnmatch). If you omit directories, ‘auto-load safe-path’ will be reset to its default value as specified during gdb compilation.

The list of directories uses path separator (‘:’ on GNU and Unix systems, ‘;’ on MS-Windows and MS-DOS) to separate directories, similarly to thePATHenvironment variable.

感覺這是在設定自動可以讀取的script路徑,不知道這對於set substitute-pah有什麼影響。按照參考連結的說法,設定這個命令應該是讓gdb去讀取可信賴路徑的.gdbinit才對。

參考連結: http://stackoverflow.com/questions/16595417/loading-gdbinit-from-current-directory

https://vecr.ece.villanova.edu/vecr/doc/gdb/Auto_002dloading-safe-path.html

 

使用gdb除錯程式時,執行gdb  可執行程式   程式程序號

報錯:

解決方案:

gdb  -iex  'set auto-load safe-path /'   可執行程式   程式程序號