我在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
将改变环境变量 下次 你启动正在调试的程序。程序启动后,加载程序会将环境复制到程序的地址空间中,并进行任何更改 setenv
适用于该数组,而不是由该数组维护的数组 gdb
。
附录:如何打印调试程序的整个环境
在Linux上,每个进程的环境都可以通过伪文件获得 /proc/PID/environ
,哪里 PID
由进程的pid替换。该文件的值是以空字符结尾的字符串列表,因此将其打印出来需要少量工作。
在gdb里面,一旦你开始运行要调试的程序,就可以得到它的pid info proc
然后用它来打印整个环境:
(gdb) info proc
process 6074
...
(gdb) shell xargs -0 printf %s\\n < /proc/6074/environ
XDG_VTNR=7
KDE_MULTIHEAD=false
...
当然,我可以在gdb之外,从不同的终端轻松完成。
您可以使用更改GDB的环境视图 set environment TZ =UTC
但这不会影响正在运行的程序,只会影响下次启动劣质进程时使用的环境。
您可以通过全局变量检查正在运行的劣质流程的当前环境 environ