代码之家  ›  专栏  ›  技术社区  ›  Dominique

如何根据CMap(CArray)对象的内存地址监视该对象

  •  0
  • Dominique  · 技术社区  · 7 年前

    我仍在使用我在中提到的同一个脚本 this other StackOverflow post .
    总体思路:

    • 使用脚本打开转储文件
    • 查看所有变量的内存地址
    • 试着获取一些信息

    这一次 dt 功能似乎在 CMap 对象:

    dt <application_name>!CMap<int,int,CUIntArray * __ptr64,CUIntArray * __ptr64> m_nCount 000000eab8748430
    Ambiguous matches found for <application_name>!CMap<int,int,CUIntArray * __ptr64,CUIntArray * __ptr64> (dumping largest sized):
    <application_name>!CMap<int,int,CUIntArray * __ptr64,CUIntArray * __ptr64>::~CMap<int,int,CUIntArray * __ptr64,CUIntArray * __ptr64>
    <application_name>!CMap<int,int,CUIntArray * __ptr64,CUIntArray * __ptr64>::CMap<int,int,CUIntArray * __ptr64,CUIntArray * __ptr64> {0x02b bytes}
    

    为了解决这个问题,我尝试在Visual Studio watch窗口中打开对象,但无论我尝试了什么,这似乎都失败了:

    (CMap<int,int,CUIntArray * __ptr64,CUIntArray * __ptr64>)0x000000eab8748430 => identifier "sCMap..." is undefined
    (CMap)0x000000eab8748430 => identifier "CMap" is undefined
    (<application_name>!CMap<int,int,CUIntArray * __ptr64,CUIntArray * __ptr64>)0x000000eab8748430 => identifier "<application_name>" is undefined
    (mfc110u!CMap<int,int,CUIntArray * __ptr64,CUIntArray * __ptr64>)0x000000eab8748430 => identifier "mfc110u" is undefined
    ...
    

    然而,这种工作方式似乎适用于其他MFC类,例如 CStringArray :

    (CStringArray*)0x000000eab87c6d10 => this is giving good results
    

    有人知道我如何展示 CMap (或 CArray )Visual Studio的监视窗口中的对象,基于其内存地址?

    1 回复  |  直到 3 年前
        1
  •  0
  •   Dominique    7 年前

    调试器似乎与CMap定义有问题,并且通过删除 __ptr64 类型定义中的条目(注意 __ptr64 ),我可以看到变量的内容:

    (CMap<int,int,CUIntArray *,CUIntArray *>*) 0x000000eab8748430
    

    我认为调试器中有一个错误:-)