【问题标题】:How to get environment of a program while debugging it in GDB如何在 GDB 中调试程序时获取程序的环境
【发布时间】:2015-12-31 05:54:36
【问题描述】:

我正在 Linux 上的 GDB 中调试一个程序。我正在使用getenvsetenv 调用来读取和设置环境变量。例如我调用setenv("TZ", "UTC", 1); 来设置时区的TZ 环境变量。

要检查是否设置了 env 变量,我正在使用 GDB 命令show environment。这将打印所有环境变量及其值。但它没有显示 TZ 正在设置。

甚至命令show environment TZEnvironment variable "TZ" not defined.

他们是另一种检查被调试程序环境的方法吗?

p *(char *) getenv("TZ") 返回正确的值 UTC

【问题讨论】:

  • 不应该是p (char*)getenv("TZ")吗?
  • 看起来 environ 为 NULL。 environ@@GLIBC_2.0 在我的案例中是指向真实环境的那个。 stackoverflow.com/questions/6203455/…
  • environ 对我来说很好用,但它可能与 glibc 版本(除其他外)有关。
  • @punekr12:好的,我在答案中添加了一种打印整个环境的方法。 HTH。

标签: c++ c linux gdb environment-variables


【解决方案1】:

gdb 命令show environment 显示的环境属于gdb [见注释],而不是被调试程序的环境。

调用getenv 似乎是打印正在运行的程序环境的一种完全合理的方法。

注意

Gdb 维护一个环境数组,最初是从它自己的环境中复制的,它用于启动每个新的子进程。 show environmentset environment 在这个环境中工作,所以set environment 将在下次你启动被调试的程序时改变一个环境变量。程序启动后,加载程序会将环境复制到程序的地址空间中,并且使用setenv 所做的任何更改都将应用于该数组,而不是gdb 维护的数组。

附录:如何打印被调试程序的整个环境

在 Linux 上,每个进程的环境都可以通过伪文件 /proc/PID/environ 获得,其中 PID 被进程的 pid 替换。该文件的值是一个以 null 结尾的字符串列表,因此将其打印出来需要少量工作。

在 gdb 中,一旦你开始运行要调试的程序,你可以使用info proc 获取它的 pid,然后用它来打印整个环境:

(gdb) info proc
process 6074
...
(gdb) shell xargs -0 printf %s\\n < /proc/6074/environ
XDG_VTNR=7
KDE_MULTIHEAD=false
...

当然,我也可以在 gdb 之外,从不同的终端轻松地做到这一点。

【讨论】:

  • 我需要查看程序的所有环境变量进行调试,该怎么做?
  • @punekr12:使用全局变量environ,即char**;每个元素指向 var=value 形式的字符串
  • @punekr12:但除非你的程序迭代变量environ,否则这毫无意义。只需在您感兴趣的变量上使用getenv。这将与程序看到的完美匹配。
  • show environment 不是 GDB 自己的环境,它是它会给它启动的进程的环境,参见 sourceware.org/gdb/current/onlinedocs/gdb/Environment.html -- 虽然它作为 GDB 自己环境的副本启动,但可以修改使用set environmentunset environment,GDB自身环境没有变化。
  • @JonathanWakely:我必须从 proc fs 中获取环境来向自己证明 gdb 不只是在自己的环境中设置变量 :) 你是对的,它没有。
【解决方案2】:

您可以使用set environment TZ =UTC 更改 GDB 的环境视图,但这不会影响正在运行的程序,只会影响下一次启动劣质进程时将使用的环境。

您可以通过全局变量environ检查正在运行的劣质进程的当前环境

【讨论】:

    猜你喜欢
    • 2014-08-12
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 2017-11-05
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多