有一个类方法,里面有一个开关/案例。用于表示,例如
class class_name {
int k;
public:
int method();
class_name():k(0) {}
};
int class_name::method() {
k = 2; // class private data member, an integer
switch(k){
case 0:
// to examine k at this point
// perform path A
break;
case 1:
// perform path B
break;
} // switch(k)
return 0;
}
问题是:如果我想从switch / case的范围内检查来自较高范围的数据,例如k。我是否总是在较高范围的某处放置一个断点,例如在赋值k = 2的行上?
答案 0 :(得分:3)
#include <stdio.h>
struct z
{
z() : k(42) {}
int k;
int mm ();
};
int z::mm()
{
int k = 0;
{
int k = 1;
{
int k = 2;
printf ("%d\n", k);
}
}
}
int main()
{
z zp;
zp.mm();
}
当您在printf
停止时,很难在外部作用域中打印变量。 up
在框架之间移动时不起作用,而不是范围。我不知道一个简单的方法,但有一些解决方法。
info locals
将打印函数本地的所有变量。
(gdb) info locals
k = 2
k = 1
k = 0
这对于简单的整数变量来说已经足够了,但是如果我们有指针并想要取消引用它们呢?
(gdb) where
#0 z::mm (this=0xbfffec8c) at q.C:18
#1 0x080484a5 in main () at q.C:26
好的,我们排在第18行,我们对此了解多少?
(gdb) info scope 18
Scope for 18:
Symbol k is a variable at frame base reg $ebp offset 8+-28, length 4.
Symbol k is a variable at frame base reg $ebp offset 8+-24, length 4.
Symbol k is a variable at frame base reg $ebp offset 8+-20, length 4.
Symbol this is a variable at frame base reg $esp offset 4+0, length 4.
啊哈,有三个符号(无论如何)名为k
,$ebp
看起来像一个寄存器名称,旁边的数字必须是偏移量。
(gdb) p *(int*)($ebp+8-20)
$1 = 0
(gdb) p *(int*)($ebp+8-24)
$2 = 1
(gdb) p *(int*)($ebp+8-28)
$3 = 2
看起来我们在这里有一个胜利者。
哦,总能说
(gdb) p this->k
$4 = 42
答案 1 :(得分:0)
你键入来“调高”调用堆栈。调用将反过来。那是你要的吗?