【问题标题】:How to set environment variable within GDB using shell command?如何使用 shell 命令在 GDB 中设置环境变量?
【发布时间】:2019-08-30 18:15:37
【问题描述】:

我想在其环境中仅使用一个变量 MyVar 运行 gdb

但是,变量的内容相当复杂,包含不可打印的 ASCII,因此最好使用例如设置。 MyVar=$(python -c 'print("\xff...")').

我有两个选择:

  1. 在运行gdb 之前,在bash 中设置MyVar。然后在gdb 中,使用unset environment NAME 单独删除所有其他环境变量(非常乏味!)。

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

有什么想法吗?

【问题讨论】:

标签: linux command-line gdb environment-variables command-substitution


【解决方案1】:

选项 2 是possible

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

选项 1 可以通过 env(1) 完成。

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

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

【讨论】:

  • 谢谢。你知道 LINES 和 COLUMNS 是什么意思吗?我想它们是 GDB 设置的环境变量。
  • 对,就是终端的行列,GDB内部设置的。见herehere
  • 这很奇怪,我无法让选项 2 工作。执行完 Python 命令后,我检查了show environment 并且那里没有环境变量。选项 1 也很奇怪。该堆栈不同于在禁用 ASLR 的情况下运行 env -i MyVar="..." prog - 有什么想法吗?
  • 我编辑了答案以显示选项 2 的示例。我现在实际上比选项 1 更喜欢它!至于 ASLR,那不是你原来的问题,但如果我用 echo 0 | sudo tee /proc/sys/kernel/randomize_va_space 禁用它,那么我每次都会从这个程序中得到相同的输出:#include <stdio.h>void foo() { int x = 0; printf("&x = %p\n", &x); }int main() { foo(); return 0; }
  • 如果你需要运行自定义环境的程序,最好不要在env下运行整个gdb,而只运行gdb --args env ...下的程序,如@987654325所示@
【解决方案2】:

从shell命令行启动gdb时,可以指定运行哪个程序with which arguments (with --args),甚至可以借助env修改程序的环境!

我就是这样成功的:

gdb --ex=run --args env LD_BIND=now 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。

【讨论】:

  • 尽管我的回答被接受了,但我更喜欢这个,因为它不会影响 gdb 本身。
猜你喜欢
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 2021-03-01
  • 2020-03-07
  • 2014-10-27
  • 2011-04-04
  • 2014-07-30
相关资源
最近更新 更多