我想調試printf函數,所以當我踏上printf函數內(gdb調試器),它表明我這個:如何調試像printf這樣的標準c庫函數?
__printf (format=0x80484d0 " my name is Adam") at printf.c:28
28 printf.c: No such file or directory.
這樣做有什麼意義呢?
而當我再次開始步驟時,還有更多像這樣的陳述。
請幫我理解這一點。
我想調試printf函數,所以當我踏上printf函數內(gdb調試器),它表明我這個:如何調試像printf這樣的標準c庫函數?
__printf (format=0x80484d0 " my name is Adam") at printf.c:28
28 printf.c: No such file or directory.
這樣做有什麼意義呢?
而當我再次開始步驟時,還有更多像這樣的陳述。
請幫我理解這一點。
我覺得這很清楚。有一個地方,gdb預計的源代碼,所以下載glibc的源代碼,並把它放在那裏。我認爲錯誤信息包含完整路徑。
如果它是一個Linux發行版,它實際上相當簡單,因爲通常源代碼包也被髮送。否則,您需要自己查找源代碼,請注意,它必須與用於編譯c庫組件的完全相同,而不僅僅是相同的版本,因爲分發者通常會更改源。
並不像聽起來那麼簡單:需要*完全*與用於編譯庫的源代碼相同。通常,這意味着你想獲得你的操作系統/發行版的調試符號和源代碼包:) –
@MarcusMüller如果它是一個Linux發行版,它實際上相當簡單,因爲通常源代碼包也被髮送。接下來我會將這個評論的第一部分放在答案中,而我並沒有說這很容易,只是錯誤信息清楚瞭解問題所在。 –
那麼,爲了讓調試器向您顯示編譯到您使用的二進制文件中的代碼,您需要在某處使用原始代碼。
你似乎沒有那個,所以你的調試器找不到它。
請注意,你通常不要想調試你std庫函數的源代碼,但只能調用它們的方式。爲此,操作系統的通常「調試符號」包是最佳的。
好評。這就像OP懷疑這個錯誤在標準庫中,當他的代碼很可能出現時。但是,或許OP想要檢查這些功能是如何工作的。 –
你爲什麼要調試printf?你期望隱藏在那裏的錯誤? –
您應該假設系統提供的函數,特別是像'printf()這樣的核心函數沒有錯誤,並且問題出在您的代碼中,而不是函數本身。如果您使用的是現代編譯器,請確保使用盡可能多的警告選項進行編譯,並且在有任何警告的情況下甚至不嘗試運行代碼。 (使用GCC,我需要'gcc -O3 -g -std = c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes ...'來保持清潔,即使是來自SO問題的代碼也是如此。有時,來自SO的代碼必須是對待不同,但不經常) –
是否沒有libs的調試版本? –