簡體   English   中英

如何調試像 printf 這樣的標准 c 庫函數?

[英]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 期望它們所在的位置,您可以嘗試使用directoryset 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.

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