0

プログラムスタック範囲のスパンを見積もろうとしています。私の戦略は、スタックが下向きに成長するため、現在のスタック フレームへのローカル変数を作成し、そのアドレスを参照として使用できると想定することでした。

 int main()
 {
   //Now we are in the main frame.
   //Define a local variable which would be lying in the top of the stack
    char a;
   //Now define another variable
    int b; //address should be lower assuming stack grows downwards

   //Now estimate the stack size by rlimit
   struct rlimit stack_size;
   getrlimit(RLIMIT_STACK,&stack_size);

   //A crude estimate would be stack goes from &a to &a - stack_size.rlim_cur

   printf("%p \n",&a);
   printf("%p \n",&b);
   printf("stack spans from %u to %u",&a,&a - stack_size.rlim_cur);
   return 0;
 }

興味深いことに、gdb を使用して a と b のアドレスの値をデバッグすると、b のアドレスは a よりも高い値になります。また、スタック ポインタは常に同じ場所に残ります。

 0xbfca65f4 
 0xbfca660f
 Stack spans from 0xbfca65f4 to 0xbbca65f4.

 ebx            0xb7faeff4  -1208291340
 esp            0xbffff670  0xbffff670

誰かが私がどこで間違っているのか理解できますか? 前もって感謝します!

4

1 に答える 1

2

このアプローチはほとんどの場合うまくいきます。あなたの間違いは、同じ呼び出しフレームで と のa両方を調べているだけです。bコンパイラがスタック上で期待どおりに自動変数を並べ替える理由はありません。データの局所性または配置の目的で順序を選択する可能性があります。

ある自動オブジェクトのアドレスmainと別の呼び出しフレームの別のアドレスを比較すると (インライン化される可能性のあるものではないことを確認してmainください!)、予想に近い結果が得られるはずです。

于 2013-01-31T03:13:02.423 に答える