Windows 64 位地址 space
Windows 64bit address space
我正在开发一个带有几个 dll 的 64 位应用程序。
来自win 32,加载dll的默认基地址
是 0x10.000.000 然后当冲突发生时他们移动了。
Wintellect 的 John Robbins 建议使用唯一地址设置 dll,因此内存 space 使用在不同的 运行 上是相同的。
他在有关调试 .net 2.0 应用程序的书中建议,基地址应由 dll 名称的第一个字母引导。
a-c 0x60.000.000
d-f 0x61.000.000
g-i 0x62.000.000
j-l 0x63.000.000
m-o 0x64.000.000
p-r 0x65.000.000
s-u 0x66.000.000
v-x 0x67.000.000
y-z 0x68.000.000
我认为 64 位已经改变了。 (至少地址)。
有没有人找到更好的解决方案?
(所以来自另一台电脑上的 运行 的地址可以映射到我的地址吗?
- 或者我可以加载在某处制作的小型转储。)
自从您转向 64 位后,我猜您的目标是 Windows Vista 或更高版本,因为 XP 64 位从未如此流行(扩展支持已结束)。
在 Windows Vista 中,引入了地址 space 随机化 (ASLR),这提高了安全性,因为猜测内存位置变得更加困难。
ASLR 将随机化基地址并通过 /DYNAMICBASE
(MSDN) 启用。因此,不再需要自己生成或计算基地址。
如您所说,变基可能已经在 32 位应用程序中发生。这和 ASLR 不会对调试故障转储产生影响。调试器将能够解析符号。
我正在开发一个带有几个 dll 的 64 位应用程序。
来自win 32,加载dll的默认基地址 是 0x10.000.000 然后当冲突发生时他们移动了。
Wintellect 的 John Robbins 建议使用唯一地址设置 dll,因此内存 space 使用在不同的 运行 上是相同的。
他在有关调试 .net 2.0 应用程序的书中建议,基地址应由 dll 名称的第一个字母引导。
a-c 0x60.000.000
d-f 0x61.000.000
g-i 0x62.000.000
j-l 0x63.000.000
m-o 0x64.000.000
p-r 0x65.000.000
s-u 0x66.000.000
v-x 0x67.000.000
y-z 0x68.000.000
我认为 64 位已经改变了。 (至少地址)。
有没有人找到更好的解决方案?
(所以来自另一台电脑上的 运行 的地址可以映射到我的地址吗?
- 或者我可以加载在某处制作的小型转储。)
自从您转向 64 位后,我猜您的目标是 Windows Vista 或更高版本,因为 XP 64 位从未如此流行(扩展支持已结束)。
在 Windows Vista 中,引入了地址 space 随机化 (ASLR),这提高了安全性,因为猜测内存位置变得更加困难。
ASLR 将随机化基地址并通过 /DYNAMICBASE
(MSDN) 启用。因此,不再需要自己生成或计算基地址。
如您所说,变基可能已经在 32 位应用程序中发生。这和 ASLR 不会对调试故障转储产生影响。调试器将能够解析符号。