如何在 GDB 中调试程序时获取程序的环境
How to get environment of a program while debugging it in GDB
我正在 linux 上用 GDB 调试一个程序。我正在使用 getenv
和 setenv
调用来读取和设置环境变量。例如,我正在调用 setenv("TZ", "UTC", 1);
来为时区设置 TZ 环境变量。
为了检查是否设置了 env 变量,我正在使用 GDB 命令 show environment
。这将打印所有环境变量及其值。但它没有显示 TZ
正在设置。
甚至命令 show environment TZ
说 Environment variable "TZ" not defined.
他们是另一种检查被调试程序环境的方法吗?
p *(char *) getenv("TZ")
返回正确的值 UTC
。
gdb 命令 show environment
显示属于 gdb
[见注释] 的环境,而不是正在调试的程序的环境。
调用 getenv
似乎是打印 运行 程序环境的一种完全合理的方法。
备注
Gdb 维护一个环境数组,最初是从它自己的环境中复制的,它用于启动每个新的子进程。 show environment
和 set 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
查看运行劣质进程的当前环境
我正在 linux 上用 GDB 调试一个程序。我正在使用 getenv
和 setenv
调用来读取和设置环境变量。例如,我正在调用 setenv("TZ", "UTC", 1);
来为时区设置 TZ 环境变量。
为了检查是否设置了 env 变量,我正在使用 GDB 命令 show environment
。这将打印所有环境变量及其值。但它没有显示 TZ
正在设置。
甚至命令 show environment TZ
说 Environment variable "TZ" not defined.
他们是另一种检查被调试程序环境的方法吗?
p *(char *) getenv("TZ")
返回正确的值 UTC
。
gdb 命令 show environment
显示属于 gdb
[见注释] 的环境,而不是正在调试的程序的环境。
调用 getenv
似乎是打印 运行 程序环境的一种完全合理的方法。
备注
Gdb 维护一个环境数组,最初是从它自己的环境中复制的,它用于启动每个新的子进程。 show environment
和 set 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