在 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
Run Code Online (Sandbox Code Playgroud)
可以看出,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
Run Code Online (Sandbox Code Playgroud)
所以我不认为我的启动脚本是问题所在。
所以我不认为我的启动脚本是问题所在。
是的,他们是这个问题(我知道一个事实,即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 认为不安全的环境变量,以及 setuid 二进制文件的未设置。事实证明,实际上gdb被调用的是suid-root:
-rwsr-sr-x 1 root root 5975928 Mar 15 2012 /usr/bin/gdb
Run Code Online (Sandbox Code Playgroud)
这解释了这个问题。