2012-09-27 67 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