C程序:getenv在GDB / DDD中返回NULL

时间:2018-10-26 07:35:14

标签: c linux gdb

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

    $scope.addContactForm.contactNumber.$setValidity('required', false);

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

有人知道吗?

OS / Tools版本信息: RHEL Linux主机名1 2.6.32-754.3.5.el6.x86_64#1 SMP 2018年8月9日星期四11:56:22 EDT 2018 x86_64 GNU / Linux GNU gdb(GDB)7.12 gcc(GCC)6.3.0

3 个答案:

答案 0 :(得分:1)

包括适当的头文件

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

将警告视为错误。

答案 1 :(得分:1)

  

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

GDB调用您的程序时,它将启动一个新的 shell 来运行该程序。

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

为非交互式shell更改环境是一个非常糟糕的主意。 Documentation关于如何避免这种情况。

答案 2 :(得分:0)

如果getenv返回NULL,则是因为找不到环境变量。但还是要小心如果if (strlen(a)>0)失败,则该指令getenv(....)变为非法。 getenv发回NULL,此指令使程序崩溃。最好在执行此行if (strlen(a)>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;
}