- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在互联网上搜索了解决方案并找到了一些结果,但仍然出现错误。我的 C 程序中有一个局部变量 n 和一个未定义的全局变量。我遇到的错误或错误:
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
最佳答案
这会更容易判断您是否发布了一些代码,但我们假设它看起来像这样:
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
(GCcflags,但相当标准)编译它,以在您使用调试器进行探索时禁用所有优化:这通常是那么与 C 代码匹配就容易多了。除非编译器中存在错误,否则您可以使用这些标志来使所有内容正常工作,然后在最后重新打开优化。
恐怕我不知道您看到的 m
错误是怎么回事。该地址看起来相当令人惊讶:也许您需要告诉我们更多有关您的环境(linux?嵌入式?)的信息,并发布一些您的代码。
关于c - "Cannot access memory at address 0x600b0c"& "No symbol "n "in current context."如果使用 gdb 编译时存在全局变量和局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34102117/
我是一名优秀的程序员,十分优秀!