GDB 重置 LD_LIBRARY_PATH

标签 gdb

在 Ubuntu 上运行 GDB 7.4-2012.02 并且遇到我无法在其他平台上复制的奇怪行为。

bash$ export LD_LIBRARY_PATH=my_path
bash$ export LD_LIBRARY_PATH2=my_path2
bash$ gdb
GNU gdb (Ubuntu/Linaro 7.4-2012.02-0ubuntu2) 7.4-2012.02
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>.
(gdb) shell echo $LD_LIBRARY_PATH

(gdb) shell echo $LD_LIBRARY_PATH2
my_path2

可以看出,GDB 正在重置 LD_LIBRARY_PATH 但没有重置其他导出的变量。为什么要这样做?是否有一些我不知道是什么原因导致的设置?我的 ~/.gdbinit 是空的,即使使用 gdb -n 行为仍然存在.

此外,在退出登录 shell 后:
bash$ echo $LD_LIBRARY_PATH
my_path
bash$ $SHELL -c 'echo $LD_LIBRARY_PATH'
my_path
bash$ $SHELL
hi from .bashrc
bash$ echo $LD_LIBRARY_PATH
my_path

所以我不认为我的启动脚本是问题所在。

最佳答案

So I don't think my startup scripts are the issue.



是的,它们就是问题所在(我知道 GDB 不会干扰您的 LD_LIBRARY_PATH 环境)。

更新:

毕竟启动脚本不是问题。

经过一些调试,user2601195 发现以下变量都没有设置:GCONV_PATH , GETCONF_DIR , HOSTALIASES , LD_AUDIT , LD_DEBUG , LD_DEBUG_OUTPUT , LD_DYNAMIC_WEAK , LD_LIBRARY_PATH , LD_ORIGIN_PATH , LD_PRELOAD
这些是 glibc considers insecure 的环境变量, 并取消 setuid 二进制文件的设置。原来,实际上是gdb被调用的是 suid-root:
-rwsr-sr-x 1 root root 5975928 Mar 15 2012 /usr/bin/gdb

这解释了这个问题。

关于GDB 重置 LD_LIBRARY_PATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23018336/

相关文章:

gdb - 在退出信号上设置 GDB 断点

c++ - 如何调试段错误

c++ - 如何查看 GDB 中自动变量的内存地址?

linux - 没有 gcc 的 gdb

c++ - 在 gdb 中使用 [] 运算符和 unordered_map 给出未解析的运算符

c - 在不断增长的日志文件上使用 tcpdump

c++ - 在 gdb 上格式化检查内存

emacs - 使用Emacs和Gdb设置断点,为什么提示总是 "Current buffer has no process"?

c++ - vector.size() 的 GDB 错误值