7

GDB では、 info registers または info all-registers すべてのレジスタ シンボル名とその値が表示されます。

質問:

そのレジスタに格納されている変数名を (つまり、ソース コードから)取得するにはどうすればよいですか? (またはソースコードの行番号など)

例えば:

int my_reg = /* something */;
float another_reg = /* something else */;
...

その後、おそらく、次のinfo all-registers ように返されます。

R0             0x0      0
R1             0xfffbf0 16776176
R2             0x0      0
R3             0x0      0
R4             0x6      6

どのレジスタ (R0? R2? R4?) が "関連付けられている" かを判断するにはどうすればよいですmy_regか?

4

2 に答える 2

2

デバッグ シンボルにアクセスできる場合 (およびその読み取り方法を理解している場合、つまり、デバッグ シンボルを解析するコードを持っている場合)、どのレジスタがどのレジスタに対応しているかを正確に追跡できます。ただし、コンパイラが何らかの理由で物事を移動することを決定するため、これはある行から次の行に変更される可能性が非常に高くなります (たとえば、一部の計算は R1 で始まり、R2 で結果が終了します。 R1 の値を保持します [または、R1 にも元の値が必要です - 考えてみてくださいarray[x++]- の新しい値がありx、できればレジスタにあり、xインデックス作成に使用する必要がある古い値もある必要があります。のベースアドレスに追加するレジスタarray

すべての変数がレジスタに格納されるわけではありません (プロセッサと「使用可能なレジスタ」によって異なります)。

デバッガーは、各変数がいつでもどこにあるかを認識しますが、次のように非常に混乱する場合があります。

int array[10000];
... 
for(int i = 0; i < 10000; i++)
{
   array[i] = rand();
}

最適化中に次のように変換される場合があります。

int array[10000]; 
int *ptr = array;
int *ptr2 = &array[10000];
while(ptr < ptr2)
{
   *ptr++ = rand();
}

今すぐ印刷してみてくださいi... ;)

于 2013-06-20T00:29:54.583 に答える