2012-09-27 68 views
0

我有兩個不同版本的庫假設 libxyz.soGDB加載不正確庫

在兩個不同的位置

1) /home/maverick/dev/libxyz.so (development Version) 
2) /home/maverick/prod/libxyz.so (Production Version) 

我有編好的程序編譯和鏈接與適當的版本的設置庫的數量取決於LD_LIBRARY_PATH。例如,如果我想我的程序與libxyz.so我改變我的LD_LIBRARY_PATH添加/家庭/特立獨行的/ dev的開發版本的鏈接,如果我想和督促版本鏈接更改LD_LIBRARY_PATH添加/家庭/特立獨行/ PROD代替。

我用開發版和

ldd MyProg 

輸出連接編譯了一個程序是

libxyz.so => /home/maverick/dev/libxyz.so 

如果我運行該程序加載從

/home/maverick/dev/libxyz.so 
的libxyz.so

並運行良好。 就這一點我LD_LIBRARY_PATH包含的/ home /特立獨行的/ dev不是/家/特立獨行/ PROD

但是當我試圖通過GDB調試這個程序

gdb MyProg 

它加載從位置

的libxyz.so
/home/maverick/prod/libxyz.so 

我在調試期間無法使GDB加載正確版本的庫。所以到現在我在做什麼,首先啓動該程序(即負載dev的版本),並附加GDB到PID這種方式其工作正常。但如果它運行像

gdb MyProg 

忽略了最低

我想盡一切事情解決這個問題,例如如何設置SYSROOT,solib搜索路徑的GDB,但沒有什麼工作。 如果事實上,當我成立了SYSROOT指向庫GDB的調試版本給了像

.dynamic section for XXX is not at the expected address 

一些消息的任何建議,將不勝感激。

回答

1

我難以作出GDB調試過程中加載庫的正確版本。

讓我猜測:您正在使用tcsh,對不對?

該問題很可能來自yoour ~/.cshrc重置LD_LIBRARY_PATH/home/maverick/prod

當您在GDB中執行程序run時,它會執行$SHELL -c your-program [args...](以便您可以使用I/O重定向)。

解決辦法:不要碰環境中您.cshrc非交互的shell,例如啓動它:

if ($?prompt == 0) exit 
+0

是的,我用tcsh – Maverick

+0

當GDB執行 $ SHELL -c你的程序[參數...] 做我的殼(TCHS)從.tcshrc文件讀取它的包膜或者用它目前的環境? 如果它從.tcshrc中讀取,則問題在於三。 coz in .tcshrc LD_LIBRARY_PATH仍然保存/ home/maverick/prod。 – Maverick

+0

它的工作,謝謝你。 問題的根源在於GDB以這種方式運行程序 $ SHELL -c your-program [args ...] 很好的知道。 – Maverick