I have used debug mode in Visual Studio before, but I never had to use the memory window. If I had a simple application that calculates a=b+c and made b =8 and c=-2, how can I find the addresses a, b, and c in memory window and their values without using watches?
When I tried, I saw tons of "gibberish" that I cannot make much sense of. Here's a screenshot:
If I wanted to do the same, but in a Linux environment, how could I achieve this?
To see the debug output window, in Microsoft Visual Studio, click View, click Other Windows, and then click Output. You can view the debug output in this window only if the debugger is attached to the process that is writing to the output window.
The primary tools for detecting memory leaks are the C/C++ debugger and the C Run-time Library (CRT) debug heap functions. The #define statement maps a base version of the CRT heap functions to the corresponding debug version. If you leave out the #define statement, the memory leak dump will be less detailed.
I saw tons of "gibberish": a small example may help (especially for the next readers :)
Copy/paste the following code and debug it:
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;
}
Run the Visual Studio debugger, add watch to all variables (right click each variable and click "Add Watch"). Now if it is not open, open the watch window (menu Debug → Window → *Watch), and drag/drop the variable adresse_int_variable
from the watch window to the memory window. You'll obtain the following:
You'll observe that the value 41
appears at this address. In hexadecimal, 0x41 is equal to 65. So you see that the address of variable int_variable
effectively contains 65. (Note that in reality the memory contains bits: 01000001, but it is represented in hexadecimal to ease of the reading.)
Enter &int_variable2
in the memory window, you'll get:
int_variable2
holds the value 10000
, and in hexadecimal it is 0x2710
. Now look for values stored for variables char_variable_1
and char_variable_2
: you see 0x41
and 0x42
. This is the way A
and B
are encoded in the ASCII Table. Note that in memory int_variable
and char_variable_1
are the same.
Finally enter &mystruct
in the memory window, and you'll see:
This corresponds to the memory of the mystruct
variable, that holds four variables (an int
and three char
s). You see the age
variable (10000 = 0x2710
) and the three following characters: A
, B
and 65
that are stored as 0x41
, 0x42
, 0x41
(from right to left). Note that in the right part of the window you can see ABA
as string representation of the memory (if not right click the window and click ANSI).
Try with more complex variables, read about endianness and data structure alignment. See also the memory window page on MSDN.
One way to find the address of a variable in Visual Studio is to use the QuickWatch window (under the debug menu if you don't know the hot key, Ctrl + Alt + Q). If you type &a
, it will display the address of variable a
. You can then enter that address in the memory window. Or you could just enter &a
in the memory window.
But to see all variables with the memory window, they would need to be within a few bytes of each other since it shows contiguous memory. For local variables on the stack, that would not usually be a problem. For integer variables, you can more easily view them in a readable format by right clicking on the memory window and changing the layout (for example, choose 4-byte integers with a signed display).
Having said all that, it seems like it would be much simpler to use the watch window since everything is labeled nicely already and it is easy to tell which value is associated with which variable.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With