对于给定的堆栈帧,是否有一种快速的方法(或一种构造方法的简单方法)来获取给定堆栈帧(堆栈和堆变量)的特定类/类型的所有实例?我想在不更改任何源代码的情况下执行此操作——附加功能仅来自 VS/VS-Debugger。
我设想这种行为在对整个大型代码库中使用的数据类型进行更改时会非常有用。
最佳答案
堆管理器
从 C++ 运行时的角度来看,堆管理器通过 HeapAlloc (MSDN) 分配字节.签名是
LPVOID WINAPI HeapAlloc(
_In_ HANDLE hHeap,
_In_ DWORD dwFlags,
_In_ SIZE_T dwBytes
);
因此,如果堆管理器分配内存,它会分配一定数量的字节,而不是分配给类型的内存。
至少对于堆上的对象来说,一件有用的事情(尽管对 Visual Studio 没有帮助)是启用 GFlags 的“用户模式堆栈跟踪数据库”。启用后,它会跟踪堆上的分配并将其与堆栈相关联。这样,您仍然看不到类型信息,但至少可以找出内存是通过哪种方法分配的。在小方法中,您可能会从 dwBytes 信息中找到它的类型 - 但您仍然必须手动完成。
调试堆管理器
如果你有一个调试版本,你可以使用 Debug Heap Manager帮助您跟踪分配情况。
不过,这也不是完全没有源码改动。您需要导入调试 header 。
Visual Studio 2013 更新 2
自 Visual Studio 2013 Update 2 以来,有一个 memory diagnostic tool ,甚至可以让您追踪丢失的元素类型。
它通过分析 PDB 来实现,但对于 PDB 不可用的库,它会失败。
关于c++ - VS Studio Debugger - 获取(并观察)一个类型的所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32742055/