VS Studio Debugger - 获取(并观察)一个类型的所有实例
VS Studio Debugger - Get (and watch) all instances of a type
对于给定的栈帧,有没有一种快速的方法(或者一种简单的构造方法)来获取给定栈帧的某个class/type的所有实例(栈和堆变量) ?我想在不更改任何源代码的情况下执行此操作——附加功能仅来自 VS/VS-Debugger.
我预想这种行为在对整个大型代码库中使用的数据类型进行更改时会非常有用。
堆管理器
从 C++ 运行时的角度来看,堆管理器通过 HeapAlloc (MSDN) 分配字节。签名是
LPVOID WINAPI HeapAlloc(
_In_ HANDLE hHeap,
_In_ DWORD dwFlags,
_In_ SIZE_T dwBytes
);
所以如果堆管理器分配内存,它会分配字节,而不是类型的内存。
一件有用的事情(虽然对 Visual Studio 没有帮助),至少对堆上的 objects 来说是启用 GFlags 的 "User mode stack trace database"。启用后,它会跟踪堆上的分配并将其与堆栈相关联。这样,您仍然看不到类型信息,但至少可以找出内存是通过哪种方法分配的。在小方法中,您可能会从 dwBytes 信息中找到它是哪种类型 - 但您仍然必须手动执行。
调试堆管理器
如果您有调试版本,可以使用 Debug Heap Manager 来帮助您跟踪分配情况。
不过,这也不是完全没有源码改动。您需要导入调试 headers.
Visual Studio 2013 更新 2
自 Visual Studio 2013 更新 2 以来,有一个 memory diagnostic tool,它甚至可以让您追踪丢失的 objects 类型。
它通过分析 PDB 来做到这一点,但对于 PDB 不可用的库,它会失败。
对于给定的栈帧,有没有一种快速的方法(或者一种简单的构造方法)来获取给定栈帧的某个class/type的所有实例(栈和堆变量) ?我想在不更改任何源代码的情况下执行此操作——附加功能仅来自 VS/VS-Debugger.
我预想这种行为在对整个大型代码库中使用的数据类型进行更改时会非常有用。
堆管理器
从 C++ 运行时的角度来看,堆管理器通过 HeapAlloc (MSDN) 分配字节。签名是
LPVOID WINAPI HeapAlloc(
_In_ HANDLE hHeap,
_In_ DWORD dwFlags,
_In_ SIZE_T dwBytes
);
所以如果堆管理器分配内存,它会分配字节,而不是类型的内存。
一件有用的事情(虽然对 Visual Studio 没有帮助),至少对堆上的 objects 来说是启用 GFlags 的 "User mode stack trace database"。启用后,它会跟踪堆上的分配并将其与堆栈相关联。这样,您仍然看不到类型信息,但至少可以找出内存是通过哪种方法分配的。在小方法中,您可能会从 dwBytes 信息中找到它是哪种类型 - 但您仍然必须手动执行。
调试堆管理器
如果您有调试版本,可以使用 Debug Heap Manager 来帮助您跟踪分配情况。
不过,这也不是完全没有源码改动。您需要导入调试 headers.
Visual Studio 2013 更新 2
自 Visual Studio 2013 更新 2 以来,有一个 memory diagnostic tool,它甚至可以让您追踪丢失的 objects 类型。
它通过分析 PDB 来做到这一点,但对于 PDB 不可用的库,它会失败。