【问题标题】:C program: getenv return NULL in GDB/DDDC 程序:getenv 在 GDB/DDD 中返回 NULL
【发布时间】:2019-03-30 22:00:52
【问题描述】:

我尝试在我的 C 代码中调用 getenv,这可以在终端中返回正确的 env 字符串,而在 GDB/DDD 中返回 NULL。

void main() {
  char * a = getenv("ANCHOR_STEM");
  if (strlen(a)>0)
    printf("%s\n", a);
}

GDB/DDD 从同一个终端启动。 即使我“显示环境”,这个环境也存在。

有人知道吗?

操作系统/工具版本信息: RHEL Linux 主机名 1 2.6.32-754.3.5.el6.x86_64 #1 SMP Thu Aug 9 11:56:22 EDT 2018 x86_64 GNU/Linux GNU gdb (GDB) 7.12 gcc (GCC) 6.3.0

【问题讨论】:

  • 与问题无关,但您的 main 返回类型错误。它必须返回int。参数列表是(void)(int argc, char *argv[])。空参数列表已过时。

标签: c linux gdb


【解决方案1】:

包括正确的头文件

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

将警告视为错误。

【讨论】:

  • 感谢您的反馈,我已经将它们包括在内,只是没有在此处发布,抱歉造成混乱..
【解决方案2】:

如果 getenv 返回 NULL 那是因为它没有找到环境变量。但你还是要小心。该指令if (strlen(a)&gt;0) 变为非法,如果getenv(....) 失败。 getenv 发回 NULL 并且该指令使程序崩溃。在执行这行if (strlen(a)&gt;0) -> 之前最好测试指针的有效性,这不一定有用。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char * a = getenv("ANCHOR_STEM");
    if( NULL != a ){
        (void)puts(a);
        return EXIT_SUCCESS;
    }
    (void)puts("none");
    return EXIT_FAILURE;
}

【讨论】:

    【解决方案3】:

    即使我“显示环境”,这个环境也存在。

    当 GDB 调用你的程序时,它会启动一个新的 shell 来运行这个程序。

    当目标程序的环境发生变化时,这通常是您的 shell 初始化文件(~/.bashrc~/.kshrc 等)更改环境的结果。

    改变非交互式 shell 的环境是一个非常糟糕的主意。 Documentation 如何避免它。

    【讨论】:

    • 感谢 GDB 专家,我通过“set startup-with-shell off”解决了这个问题。一定是我的.cshrc 中有什么乱七八糟的gdb。顺便说一句,我喜欢猛犸象。
    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 2015-12-09
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    相关资源
    最近更新 更多