gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:38:37 28 4
gpt4 key购买 nike

我正在 Linux 上的 GDB 中调试一个程序。我正在使用 getenvsetenv 调用来读取和设置环境变量。例如我调用 setenv("TZ", "UTC", 1); 来设置时区的 TZ 环境变量。

要检查是否设置了 env 变量,我正在使用 GDB 命令 show environment。这将打印所有环境变量及其值。但它没有显示 TZ 正在设置。

即使命令 show environment TZ未定义环境变量“TZ”。

他们是另一种检查被调试程序环境的方法吗?

p *(char *) getenv("TZ") 返回正确的值 UTC.

最佳答案

gdb 命令show environment 显示一个属于gdb [见注释] 的环境,而不是被调试程序的环境。

调用 getenv 似乎是打印正在运行的程序环境的一种完全合理的方法。

注意

Gdb 维护一个环境数组,最初是从它自己的环境中复制的,它用于启动每个新的子进程。 show environmentset environment 在这个环境下工作,所以 set environment 会为下一次改变一个环境变量您启动正在调试的程序。程序启动后,加载程序会将环境复制到程序的地址空间中,并且使用 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 之外,从不同的终端轻松地做到这一点。

关于c++ - 如何在 GDB 中调试程序时获取程序的环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32917033/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com