繁体   English   中英

如何在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工作,因此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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM