狀況
當您輸入的是位在固定的位址,在 Visual Studio 偵錯工具中的 [監看式] 視窗中的物件的物件名稱時,您會收到類似下列的訊息:
未定義的識別項的 object_name
例如,編譯,並在 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 會掃描有病毒,這個檔案使用的已張貼檔案的日期中的 [可用的最新病毒偵測軟體。檔案儲存在加強保全的伺服器,以避免任何未經授權的更改它。