อาการ
เมื่อคุณพิมพ์ชื่อวัตถุของวัตถุที่อยู่ที่เป็นที่อยู่ถาวรในหน้าต่างWatchในดีบัก 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 สแกนแฟ้มนี้เพื่อป้องกันไวรัส โดยใช้ซอฟต์แวร์ตรวจสอบไวรัสล่าสุด ณวันที่มีการโพสต์แฟ้มนั้น ๆ มี แฟ้มเก็บอยู่บนเซิร์ฟเวอร์ที่สนับสนุนความปลอดภัยที่ช่วยป้องกันการเปลี่ยนแปลงใด ๆ ที่ไม่ได้รับอนุญาต