0

スイッチ/ケースを含むクラスメソッドがあります。表現のために、のようなもの

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がある行にブレークポイントを設定しますか?

4

2 に答える 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.

ああ、という名前の3つの記号(それが意味するものは何でも)があり、レジスター名のよう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
于 2012-12-25T19:05:16.600 に答える
0

コール スタックを「上に」移動するには、up と入力します。呼び出すと逆になります。それはあなたが求めているものですか?

于 2012-12-25T16:06:49.627 に答える