症状
当您键入位于在 Visual Studio 调试器中的监视窗口中的固定地址处的对象的对象名称时,您将收到类似于以下内容的消息:
是未定义的标识符对象名称用于
例如,可以通过编译和基于 x86 的系统上运行下面的代码重现此问题:
Relocate.asm
.586
.MODEL FLAT
PUBLIC _fixed_struct
_fixed_struct = 04000000h
END
Main.cpp
#include <Windows.h>
#define SHM_ADDRESS 0x04000000
#define SHM_SIZE_BYTES 1024
#define SHM_NAME L"TEST_NAME"
extern "C"
{
extern struct fixed_struct_type {
int a;
int b;
int c;
} fixed_struct;
}
void AttachShm()
{
HANDLE mapfile = CreateFileMapping(
INVALID_HANDLE_VALUE, // current file handle (use System page file)
NULL, // default security (not inheritable)
PAGE_READWRITE, // read/write permission
0, // size of File (high-order doubleword)
SHM_SIZE_BYTES, // size of File (low-order doubleword)
SHM_NAME); // name of mapping object
MapViewOfFileEx(
mapfile, // handle to mapping object
FILE_MAP_ALL_ACCESS, // read/write permission
0, // address offset (high-order doubleword)
0, // address offset (low-order doubleword)
SHM_SIZE_BYTES, // size of common block
(LPVOID)SHM_ADDRESS); // suggested starting address
}
int main(int argc, char* argv[])
{
AttachShm();
fixed_struct.a = 30;
// Put a breakpoint on the next line, view fixed_struct.a in watch window
return 0;
}
原因
在 Visual Studio 的早期版本中,调试器使用相对地址,而不是绝对地址的所有变量。这引起了位于固定地址找不到当前堆栈框架的活动范围内的变量。
解决方案
此修复程序仅适用于 Visual Studio 2015年更新 3。如果您想要查看绝对地址,则必须使用 Visual Studio 2015年更新 3 或更高版本。
解决方法是从 Microsoft 下载中心下载:
Microsoft 扫描此文件中的病毒,使用发布该文件的日期是可用的最新病毒检测软件。该文件存储在安全增强型服务器,以防止任何未经授权的更改。