gpt4 book ai didi

c - "Cannot access memory at address 0x600b0c"& "No symbol "n "in current context."如果使用 gdb 编译时存在全局变量和局部变量

转载 作者:行者123 更新时间:2023-11-30 15:14:21 25 4
gpt4 key购买 nike

我在互联网上搜索了解决方案并找到了一些结果,但仍然出现错误。我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com