2012-12-03 72 views
2

調試我的應用程序時,如果我在GDB中斷並嘗試打印errno,即使是在檢查errno的函數內部,我也會得到以下錯誤從GDB:無法在gdb中打印errno,抱怨缺少共享庫,但它存在

(gdb) print errno 
Cannot find shared library `/usr/lib/debug/lib/libc-2.11.1.so' in dynamic linker's load module list 

事情我已經嘗試:

  1. 檢查文件是否存在,它是約7.3MB。
  2. 將/ usr/lib/debug/lib /添加到我的LD_LIBRARY_PATH的前面。沒有效果。
  3. 設置LD_PRELOAD =/usr/lib/debug/lib/libc-2.11.1.so會導致我的應用在啓動時發生段錯誤。
  4. 如果我在二進制文件上運行ldd,它說它使用'/lib/libc.so.6',aptitude(我正在運行Ubuntu)告訴我libc6-dbg 是安裝了
  5. 檢查我沒有在.gdbinit中設置自定義lib路徑,我沒有。

該應用程序似乎運行良好,所以我無法想象libc本身是搞砸了。有任何想法嗎?

+0

看起來像你的shell啓動文件重挫LD_LIBRARY_PATH。檢查這個鏈接,[http://ipucu.enderunix.org/view.php?id=1720&lang=en]。希望有用。 –

+0

@SunEric:AFAICT,系統路徑(如/ usr/lib)總是自動搜索。我還在#2中指出,明確地將路徑添加到LD_LIBRARY_PATH並不能修復錯誤。 –

回答

9

文件/usr/lib/debug/lib/libc-2.11.1.so確實不是包含glibc的調試版本。它僅包含 libc的調試部分,但沒有實際的可執行代碼。把它寫進LD_PRELOADLD_LIBRARY_PATH錯誤要做的事情。不要那樣做。

你可以閱讀關於單獨的調試文件here

(GDB)打印錯誤號
不能在動態鏈接程序的加載模塊列表中找到共享庫`/usr/lib/debug/lib/libc-2.11.1.so」

這是一個GDB中的bug。

您應該知道GDB將尋找變量errno,但您的應用程序不使用任何此類變量。相反,errno#define d宏,擴展爲*(__errno_location()),而GDB不知道這一點。

試試這個:

(gdb) p __errno_location() 
$1 = (int *) 0x7ffff78396a8 

(gdb) x/x $1 
0x7ffff78396a8: 0x00000000