如何使用shell命令在GDB中设置环境变量?

16
我想在仅有一个名为 MyVar 的变量的环境下运行 gdb。然而,该变量的内容相当复杂,包含了不可打印的ASCII码,因此最好使用例如 MyVar=$(python -c 'print("\xff...")') 进行设置。
我有两个选择:
  1. 在运行 gdb 之前,在 bash 中设置 MyVar。然后在 gdb 中,逐个删除所有其他环境变量,使用命令 unset environment NAME (非常繁琐!)。

  2. 使用命令 unset environment 清除所有环境变量。然后在 gdb 中,使用 shell 命令(如上所述)设置 MyVar (怎么做?)

你有什么想法吗?

请参见 https://dev59.com/YJLea4cB1Zd3GeqP8Oep - imz -- Ivan Zakharyaschev
1
这个回答解决了你的问题吗?从命令输出中在GDB中设置环境变量 - imz -- Ivan Zakharyaschev
2个回答

8

当从shell命令行启动gdb时,您可以指定要运行的程序及其参数(使用--args, 甚至可以通过env修改程序的环境!

我刚刚成功地这样做了:

gdb --ex=run --args env LD_BIND_NOW=1 LD_DEBUG=libs \
apt-get install --yes $(cat pkgs-to-install-to-crash-apt)

--ex=run 是要求 gdb 立即运行它。

在您的情况下,您需要执行 env -i

它与建议的 env -i VAR=... gdb program 不同,因为只有您检查的程序处于特殊环境下,而不是 gdb。


3
尽管我的答案被接受了,但我更喜欢这个答案,因为它不会影响gdb本身。 - jamieguinan
需要注意的一点是:如果您想在主入口点处中断,那么您必须使用除 start 命令之外的其他命令,否则您将停止在 env 的入口点处,在它用某些 exec*() 替换程序之前。 - Johan Boulé

7

第二种选项是可行的

(gdb) unset environment
(gdb) python gdb.execute("set environment Myvar=\xff")
(gdb) show environment 
Myvar=ÿ

使用env(1)可以完成选项1。

$ env -i MyVar=$(python -c 'print("xyz")') gdb
(gdb) show environment
MyVar=xyz
LINES=35
COLUMNS=80

然后您只需要清除LINES和COLUMNS。

谢谢。你知道 LINES 和 COLUMNS 是什么意思吗?我想它们是由 GDB 设置的环境变量。 - Shuzheng
是的,它们是终端的行和列,GDB在内部设置它们。请参见此处此处 - jamieguinan
再次感谢。所有新版本的GDB都带有Python支持吗?还是需要通过插件安装? - Shuzheng
看起来是7版本及以上。 - jamieguinan
2
如果您需要使用自定义环境运行程序,则最好不要在env下运行整个gdb,而是只运行程序,并使用gdb --args env ...,如https://dev59.com/HFMI5IYBdhLWcg3wrNkk#60571461中所示。 - imz -- Ivan Zakharyaschev
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接