今天用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幫你做了字符串替換。
相關的參考來自
http://sourceware.org/gdb/onlinedocs/gdb/Source-Path.html
gdb t_video_format_insert -c /data/coredump/backup/core_t_video_format_