[英]How to debug standard c library functions like printf?
我想調試 printf 函數,所以當我進入 printf 函數(gdb 調試器)時,它向我展示了這個:
__printf (format=0x80484d0 " my name is Adam") at printf.c:28
28 printf.c: No such file or directory.
這是什么意思?
當我再次開始 step 時,會有更多這樣的陳述。
請幫助我理解這一點。
我認為這很清楚。 有一個gdb期望源代碼的地方,所以下載glibc的源代碼並將其放在那里。 我認為錯誤消息包含完整路徑。
如果它是一個 linux 發行版,它實際上相當簡單,因為通常也會提供源包。 否則你需要自己找到源代碼,注意它必須與用於編譯 c 庫組件的完全相同,而不僅僅是相同的版本,因為分發者經常對源代碼進行更改。
好吧,為了讓調試器向您展示編譯成您正在使用的二進制文件的代碼,您需要在某處使用原始代碼。
你似乎沒有那個,所以你的調試器找不到它。
請注意,您通常不想調試 std 庫函數的源代碼,而只想調試它們的調用方式。 為此,操作系統的常用“調試符號”包是最佳的。
正如其他人所回答的那樣,GDB 無法找到源文件。
對於 C 運行時庫,Linux 發行版可能會提供您可以安裝的debuginfo RPM,它可能允許 GDB 查看文件。 例如:
$ yum search glibc-debuginfo
...
glibc-debuginfo.x86_64 : Debug information for package glibc glibc-debuginfo-common.x86_64 : Debug information for package glibc
...
glibc
包和glibc-debuginfo
是一對匹配的。 沒有明確的依賴關系,但是glibc-debuginfo
包將無法工作,除非它與相同版本的glibc
匹配。
如果您在某處解壓了源代碼,但不是 GDB 期望它們所在的位置,您可以嘗試使用directory
或set substitute-path
命令讓 GDB 知道源代碼的位置。
directory
命令告訴 GDB 在它試圖查找的任何源文件路徑之前添加一個前綴。 例如,如果源樹實際上位於/tmp
,則可以使用:
(gdb) directory /tmp
set substitute-path
命令用於告訴 GDB 將源文件路徑中匹配的前綴替換為不同的路徑前綴。 例如,如果編譯的源文件在/build/path/source.c
,但在調試時源文件實際上在/usr/home/alice/release-1.1/source.c
,那么您可以使用:
(gdb) set substitute-path /build/path /usr/home/alice/release-1.1
該命令假定您只指定了完整的路徑名,因此它不會在/build/pathological/source.c
上執行替換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.