#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