gdb什么时候将变量标记为“不可用”?

时间:2011-05-26 20:33:27

标签: c gdb

我是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);

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

谢谢!

2 个答案:

答案 0 :(得分:4)

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

您希望使用-O0关闭优化(并且是默认设置)。

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

答案 1 :(得分:2)

通常它位于一个寄存器中,并且已被刷新或别名。