如何在 GDB 中调试程序时获取程序的环境

How to get environment of a program while debugging it in GDB

我正在 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

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

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

备注

Gdb 维护一个环境数组,最初是从它自己的环境中复制的,它用于启动每个新的子进程。 show environmentset environment 在此环境下工作,因此 set environment 将更改一个环境变量,以便 下次 您启动正在调试的程序。程序启动后,加载程序会将环境复制到程序的地址 space,并且使用 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 之外,从不同的终端轻松完成。

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

您可以通过全局变量environ

查看运行劣质进程的当前环境