1. 程式人生 > 其它 >GDB指定和修改搜素原始碼檔案的路徑(set substitute-path)

GDB指定和修改搜素原始碼檔案的路徑(set substitute-path)

今天用gdb檢視core檔案,發現找不到原始檔。記錄一下相關命令

在gdb裡面檢視原始碼, list 一下提醒找不到相關檔案,列出來的是絕對路徑的完整檔名。 help files   看一下幫助,可以載入符號,原始檔等,自己看一下。 dir 設定原始碼路徑無效,show directories  看到設定成功,但是還是找不到檔案。 應該是絕對路徑的問題。 因為igcc 根據你編譯的時候指定的是絕對路徑還是  ../../XXX.cpp之類的相對路徑,在生成debug_info的時候,也把這個路徑儲存為debug_info 裡面的檔名字,就是最後 gdb list 裡面找到的檔名字。 這個可以list  檢視是不是絕對路徑,然後可以用命令  readelf -p .debug_str  exe_or_so_file  看到裡面儲存是是完整的絕對路徑。 gdb 的dir 命令新增的原始碼搜尋路徑只對相對路徑的情況有效。 一個解決辦法就是在gcc的時候,使用相對路徑那麼gdb裡面你就可以使用 dir來設定了。像些CMake之類的,它喜歡使用絕對路徑,有人可以寫個指令碼讓它使用相對路徑,參考  
http://stackoverflow.com/questions/9607155/make-gcc-put-relative-filenames-in-debug-information
如果gcc裡面-g  生成的debug_info 使用的絕對路徑了,最簡單的辦法就是你把原始碼也放到相應的位置上去了。 但如果你不想使用這個絕對路徑,那也還是有辦法的。  GDB還提供另外一個選擇,可以讓你修改原始碼搜尋路徑,把原始碼絕對路徑裡面的一個path對映到另一個path上去,這樣即使你debug info了裡面的是絕對路徑,原始碼也可以放到另外的目錄。 這就是命令 set substitute-path from_path  to_path 比如 list顯示的原始碼是   /home/aaa/1.cpp 那麼設定了  set substitute-path /home/aaa/   /home/bbb/

之後,即使你的原始檔1.cpp 放在 /home/bbb下面也是可以找到的了。因為gdb幫你做了字串替換。