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

pun*_*r12 14 c c++ linux gdb environment-variables

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

ric*_*ici 12

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
...
Run Code Online (Sandbox Code Playgroud)

当然,我可以在gdb之外,从不同的终端轻松完成.

  • @punekr12:使用全局变量 `environ`,它是一个 `char**`;每个元素都指向一个形式为 `var=value` 的字符串 (2认同)
  • `proc/PID/environ` 不*提供**当前**环境变量。根据 [`man 5 proc`](https://man7.org/linux/man-pages/man5/proc.5.html) :“*此文件包含当前执行时设置的 **初始环境程序已启动** [...]。如果[...]进程修改其环境[...],**此文件将不会反映这些更改**。* (2认同)