![](/img/trans.png)
[英]How can I know the value of a variable in bison while debugging with 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
工作,因此set environment
将在下次启动正在调试的程序时更改环境变量。 一旦程序启动,加载器就会将环境复制到程序的地址空间中,并且使用setenv
任何更改都将应用于该数组,而不是由gdb
维护的数组。
在Linux上,每个进程的环境都可以通过pseudofile /proc/PID/environ
,其中PID
由进程的pid替换。 该文件的值是以空字符结尾的字符串列表,因此将其打印出来需要少量工作。
在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
检查正在运行的劣质流程的当前环境
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.