現象
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 ダウンロード センターからダウンロード可能です。
マイクロソフトでは、アップロード時点の最新のウイルス検査プログラムを使用して、配布ファイルのウイルス チェックを行っています。ファイルはセキュリティが強化されたサーバー上に置かれており、ファイルに対して認証されていない変更を加えることができないようになっています。