2012-12-25 40 views
0

有一个类方法,其中包含一个开关/案例。对于表示,像检查gdb中上方范围内的类成员

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; 
} 

东西的问题是:如果我想从上范围检查数据,如K,从开关/案范围内。我是否总是在上范围的某处放置一个断点,例如在赋值k = 2的线上?

回答

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 
+0

很好的答案!我只是希望OP在问这个问题。确实接受了 –

+0

... –

0

您输入'up'调用堆栈。调用会做相反的事情。这是你要求的吗?

+0

无凭“起来”,我出了一流的功能范围。我想以某种方式留在功能范围内。基本上,如果我把一个断点放在'执行路径A'这一行的地方,我想要检查本地函数作用域中的变量,在这种情况下k ... –

+0

你假想的'up-print k'应该做什么那'起来;打印k; down'不?它会从不同的范围打印'k'吗? –

+0

@ n.m。我的观点正确 –