我在互联网上搜索解决方案并找到了一些结果,但仍然收到错误。 我的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
答案 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?)并发布你的一些代码。