【问题标题】:When does gdb mark a variable as "not available"?gdb 何时将变量标记为“不可用”?
【发布时间】:2011-05-26 20:33:26
【问题描述】:

我对 GDB 还很陌生,还没有找到类似的问题,而且我的谷歌搜索是徒劳的,所以就这样吧。

我正在使用 GDB 通过 COM 端口连接到基于 PowerPC 的远程板,并且我遇到了断点。这是我的(非常编辑的)GDB 会话。

(gdb) where
#0 WaitForStuff () at graphfile.c:1234
#1 0x00012af4 in WaitForOtherStuff () at graph.c:2345
#2 0x001d0a7c in DrawScreens (DefaultScreenFct=0x2bef02 <DefaultFct>,
SecondScreenFct=0x2bef02 <DefaultFct>, DrawBothPages=Variable "DrawBothPages"
is not available.
[...]
(gdb)

这是第 2 帧的函数声明:

void DrawScreens(void (*DefaultScreenFct)(void), void (*SecondScreenFct)(void),
const BOOLEAN DrawBothPages);

这就是我迷失的地方:为什么这个变量“不可用”,我怎样才能让它“可用”?我已经使用带有 -g3 开关的 GCC 编译了程序,以防我需要更多信息,但我得到了同样的错误。我还删除了我们使用的 -O 标志。会不会是BOOLEAN typedef(只是unsigned char)?或者可能是参数的constness?我觉得奇怪的是,GDB 甚至不给我一个我可以看的地址。

谢谢!

【问题讨论】:

  • 尝试 -O0 作为 gcc 标志。这是为了“不优化”。没有 -O 标志并不一定意味着优化
  • 当您使用-v 选项时,GCC 所说的是target:
  • 去掉了优化,你确定文件被重新编译了吗?增量构建可能不会导致重新编译。
  • @Michael Blurr : Target: powerpc-eabi 这是正确的目标。

标签: c gdb


【解决方案1】:

-O 在 GCC 中开启 优化(相当于-O1)。

您想使用-O0 关闭优化(这是默认设置)。

此外,PowerPC 的 ABI 可能会在寄存器中传递参数。我不知道-O0 是否会导致 GCC 将参数镜像到函数中的堆栈内存位置。

【讨论】:

  • 我的错!这就是我的意思:我删除了 CFLAGS 中的 -O 标志,所以现在我使用默认情况。我将编辑我的问题以使其更清楚。
  • @SolarBear:不要删除它。明确声明-O0
【解决方案2】:

通常它在一个寄存器中,并且已经被刷新或别名为其他东西。

【讨论】:

  • 您是否有任何来源或材料支持该答案?而且,问题本身的任何解决方案?
  • @SolarBear:根据有关 PPC 和 GDB 的经验和文档,我可以支持他的评论。
猜你喜欢
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2021-07-07
相关资源
最近更新 更多