c++ - 在 gdb 的上层范围内检查类成员

标签 c++ gdb

有一个类方法,其中有一个 switch/case。对于表示,像

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 所在的行?

最佳答案

#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 上时,很难打印外部作用域中的变量。 upframes 之间移动时不起作用,而不是在 scopes 之间移动。我不知道简单的方法,但有解决方法。

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

关于c++ - 在 gdb 的上层范围内检查类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14032136/

相关文章:

c - 使用 gdb 调试回调

c++ - 在不知道派生类的情况下从父类调用派生类函数

c++ - 使用动态内存分配和指针查找最大值、最小值、平均值

linux - gdb 似乎忽略了可执行功能

GDB 在 macOS Sierra 上不起作用

c - __strcpy_sse2_unaligned 与 -fno-builtin

linux - 如何在 Raspberry Pi 上使用 gdbserver?

c++ - opengl3 2 个点 vector 的颜色相同

C++ 捕获 fork 子 cout

c++ - 结构作为基类 - C/C++ 互操作性