"无法访问地址0x600b0c" &安培; "没有符号" n"在当前的背景下。"在全球范围内使用gdb编译时的局部变量

时间:2015-12-05 06:42:13

标签: c gdb

我在互联网上搜索解决方案并找到了一些结果,但仍然收到错误。 我的C程序中有一个局部变量n和全局变量undefined。 我得到的错误或错误:

    print f("Enter value m & n : ");
    (gdb) set variable n = 2
     No symbol "n" in current context.
    (gdb) set variable m = 2
    Cannot access memory at address 0x600b0c

1 个答案:

答案 0 :(得分:1)

如果您发布了一些代码,这会更容易判断,但让我们假设它看起来像这样:

int m;

int read_nums (void)
{
    printf ("Enter value of m and n: ");
    int n = scanf ("%d");
    m = scanf ("%d");
    return n + m;
}

您的GDB实例位于第一行,因此n目前不在范围内。使用优化编译器,如果您的代码如下所示,则仍然如此:

int m;
int read_nums (void)
{
    int n;
    printf ("Enter value of m and n: ");
    n = scanf ("%d");
    m = scanf ("%d");
    return n + m;
}

编译器会在编译过程的早期转换程序以最小化变量的范围。

如果您尝试使用GDB设置n的值,则变量可能会在scanf行之后生效。在这种情况下,使用GDB的next命令进行步骤直到设置为止,然后使用set命令(或类似p n = 2)更改它。

对于像我写的那样简单的代码,编译器将完全忽略n,它将生成更像这样的东西:

int m;
int read_nums (void)
{
    printf ("Enter value of m and n: ");
    return scanf ("%d") + (m = scanf ("%d"));
}

n从未存在过。要在事后设置该值,您必须允许生成基于n的任何值,然后相应地设置该值。

如果您可以轻松地重新编译代码,您可以考虑使用-O0 -g3(GCC标记,但合理标准)来编译它,以便在您使用调试器时禁用所有优化:它通常很多那么更容易与C代码匹配。除非编译器中存在错误,否则您可以使用这些标志处理所有内容,然后在最后重新开启优化。

我担心我不知道你看到的m错误发生了什么。地址看起来相当令人惊讶:也许你需要告诉我们更多关于你的环境(linux?embedded?)并发布你的一些代码。