gpt4 book ai didi

c# - 如何知道为引用和值类型分配内存的位置?

转载 作者:行者123 更新时间:2023-11-30 15:29:51 25 4
gpt4 key购买 nike

据我所知,int 变量(值类型)是否直接在(引用类型)中声明>),在上分配的变量内存。

但是如果类中有一个方法,并且变量是在方法内部声明的,或者它是一个参数,则分配在堆栈上的内存。

public class A
{
int x; // heap

public void Func(int y) // stack
{
int z; // stack
}
}

我如何查看内存分配的位置?

最佳答案

当你说“内存所在的位置”时,我假设你的意思是给变量的实际虚拟地址,以及它驻留在私有(private)字节中的已提交 block 或区域。虽然这充其量是微不足道的,因为它可能会四处移动(这就是为什么 native 互操作开发人员必须在使用前固定内存),您可以查找类似于以下内容的变量位置:

给定源(和断点):

Source

允许反汇编(Option-->Debugging-->General-->Show disassembly...)右键单击(上下文菜单):选择“转到反汇编”

enter image description here

注意z的赋值:

mov dword ptr [ebp-44h],eax

打开寄存器窗口(调试-->Windows-->寄存器)。注意 EBP(基指针)的值 == 0x05C0EF18。

Registers

使用 calc(程序员模式)从上面确定 [ebp-44h]。0x05C0EF18 - 0x44 == 0x05C0EED4

查看该内存位置(Debug-->Windows-->Memory-->Memory 1)粘贴结果值(此实例为 0x05C0EED4)。

memory

注意值

 87 d6 12 00 // <-- Little Endian  (00 12 d6 87 <-- Big Endian)
// 0x0012D687 (hex) == 1234567 (decimal)

我们可以确定(现在)z 位于 0x05C0EED4并在其位置存储了 1234567(十进制)。

但是 x 有点复杂。 x 位于 EAX+4。

// Similar exercise as above... 
// values get moved into registers, then the assignment...
mov eax,dword ptr [ebp-3Ch] // [ebp-3Ch] == 0x05C0EF18 - 0x3C == 0x05C0EEDC
// Move the value at 0x05C0EEDC (7c d4 40 02) to EAX
// [7c d4 40 02] (Big Endian) --> [02 40 d4 7c] (Little Endian)
// [02 40 d4 7c] (Little Endian) == 0x0240d47c or 37803132 (decimal)

mov edx,dword ptr [ebp-40h] // [ebp-40h] == 0x05C0EF18 - 0x40 == 0x05C0EED8
// Move the value at 0x05C0EED8 (87 d6 12 00) to EDX
// [87 d6 12 00] (Big Endian) --> [00 12 d6 87] (Little Endian)
// [00 12 d6 87] (Little Endian) == 0x0012d687 or 1234567 (decimal)

mov dword ptr [eax+4],edx // [EAX == 0x0240d47c] + 4 = 0x240D480
// Move the value at EDX (0x0012d687 or 1234567 (decimal)) to
// EAX+4 (x variable located at 0x240D480)
// (currently holds [b1 cb 74 00] (Big Endian)
// which is equal to 7654321 (decimal)

memory memory memory

然而,同样有趣的是虚拟内存映射。使用 sysinternals 中的 vmmmap.exe 可以更好地了解保留页面和提交页面。然后,您可以在 GC 等中查看不同的世代。

Virtual Memory

希望这对您有所帮助!

关于c# - 如何知道为引用和值类型分配内存的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23135594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com