9

以前にVisualStudioでデバッグモードを使用したことがありますが、メモリウィンドウを使用する必要はありませんでした。a = b + cを計算し、b=8およびc=-2にする単純なアプリケーションがある場合、時計を使用せずにメモリウィンドウ内のアドレスa、b、およびcとそれらの値を見つけるにはどうすればよいですか?

試してみると、あまり意味のない「ぎこちない」ものがたくさん見られました。スクリーンショットは次のとおりです。

ここに画像の説明を入力してください

同じことをしたいのですが、Linux環境でこれを実現するにはどうすればよいですか?

4

4 に答える 4

16

CtrlVisual Studio で変数のアドレスを見つける方法の 1 つは、QuickWatch ウィンドウを使用することです (ホット キー+ Alt+がわからない場合は、デバッグ メニューの下にありますQ)。と入力&aすると、変数のアドレスが表示されますa。その後、メモリ ウィンドウにそのアドレスを入力できます。&aまたは、単にメモリ ウィンドウに入力することもできます。

ただし、メモリ ウィンドウですべての変数を表示するには、連続したメモリが表示されるため、互いに数バイト以内にある必要があります。スタック上のローカル変数の場合、通常は問題になりません。整数変数の場合、メモリ ウィンドウを右クリックしてレイアウトを変更することで、読みやすい形式でより簡単に表示できます (たとえば、符号付き表示で 4 バイト整数を選択します)。

そうは言っても、ウォッチ ウィンドウを使用する方がはるかに簡単に思えます。なぜなら、すべてがすでに適切にラベル付けされており、どの値がどの変数に関連付けられているかを簡単に判断できるからです。

于 2012-09-17T23:05:38.393 に答える
9

私はたくさんの「ちんぷんかんぷん」を見ました:小さな例が役立つかもしれません(特に次の読者のために:)

  1. 次のコードをコピーして貼り付け、デバッグします。

    struct MyStruct
    {
        int age;
        char code_1;
        char code_2;
        char code_3;
    };
    
    int main()
    {
        int int_variable = 65;
    
        int* adresse_int_variable = &int_variable;
    
        int int_variable2 = 10000;
    
        char char_variable_1 = 'A';
    
        char char_variable_2 = 'B';
    
        cout << " sizeof(int_variable) " << sizeof(int_variable) << endl;
        cout << " sizeof(char_variable_1) " << sizeof(char_variable_1) << endl;
    
        MyStruct mystruct;
        mystruct.age = int_variable2;
        mystruct.code_1 = 'A';
        mystruct.code_2 = char_variable_2;
        mystruct.code_3 = int_variable;
        return 0;
    }
    
  2. Visual Studio デバッガーを実行し、すべての変数にウォッチを追加します (各変数を右クリックし、[ウォッチの追加] をクリックします)。開いていない場合は、ウォッチ ウィンドウを開き (メニュー [デバッグ] → [ウィンドウ] → [*ウォッチ])、変数adresse_int_variableをウォッチ ウィンドウからメモリ ウィンドウにドラッグ アンド ドロップします。以下を取得します。

    ここに画像の説明を入力してください

  3. 41このアドレスに値が表示されることがわかります。16 進数では、0x41 は 65 に相当します。したがって、変数のアドレスにはint_variable事実上 65 が含まれていることがわかります。

  4. メモリウィンドウに入力&int_variable2すると、次のようになります。

    ここに画像の説明を入力してください

    int_variable2値を保持し10000、16 進数では0x2710です。char_variable_1次に、変数and に保存されている値を探します。およびchar_variable_2が表示されます。これが方法であり、 ASCII テーブルにエンコードされています。メモリ内ではとは同じであることに注意してください。0x410x42ABint_variablechar_variable_1

  5. 最後に&mystructメモリ ウィンドウに入力すると、次のように表示されます。

    ここに画像の説明を入力してください

    mystructこれは、4 つの変数 (anintと 3 つcharの s)を保持する変数のメモリに対応します。age変数 ( )と次の3 つの10000 = 0x2710文字が表示されます。ウィンドウの右側に、メモリの文字列表現が表示されることに注意してください(そうでない場合は、ウィンドウを右クリックして ANSI をクリックします)。AB650x410x420x41ABA

  6. より複雑な変数を試して、エンディアンデータ構造のアライメントについて読んでください。MSDNのメモリ ウィンドウ ページも参照してください。

于 2017-08-30T20:17:57.050 に答える
0

char * を使用してそれを実行し、[メモリ] ウィンドウでそのアドレスを開いてみてください。その出力を解釈する方が簡単です。Linux 環境に関しては、GDB でこのチュートリアルを使用できると思います: http://www.ofb.net/gnu/gdb/gdb_56.html

このようなものを時々見るのは非常に興味深いです:)

于 2012-09-17T23:06:42.267 に答える
0

逆アセンブル コードを見て、レジスタの値を把握する必要がありました。

于 2012-10-19T01:51:35.213 に答える