我有一个问题,即在Visual Studio的极大代码库中找出谁为变量分配内存。 例如: 我有一个结构
struct test
{
char *point;
}*obj;
obj = malloc(sizeof(struct test));
obj->point = malloc(100);
变量obj
在整个代码周围传递,并且在某些地方重新分配obj->点而不释放旧内存。然而,这种情况发生在很多地方,以至于无法跟踪哪一个实际上在做这件事。在视觉工作室中是否存在,以保持条件断点,如果旧存储器被替换为新存储器,我将收到通知
答案 0 :(得分:5)
如果您要跟踪特定对象,则可以在&obj->point
上设置数据断点。只要此指针发生更改,调试器就会停止应用程序。
在Visual Studio中,在创建obj时放置常规断点。转到断点窗口并选择“New-> New Data Breakpoint”。对于地址,输入&obj->point
并选择数据大小(32/64位为4/8)。
答案 1 :(得分:0)
您可以通过使用malloc的包装函数并向包装器添加其他参数来实现此目的,该包装器显示内存分配以及分配它的代码/进程ID的位置。
否则,您可以考虑在visual studio中使用malloc的调试版本,如下所示。
使用中定义的_malloc_dbg。 这只是malloc,其中包含用于打印或跟踪位置的文件名和亚麻码的附加参数。这将有助于您进行调试。
void *_malloc_dbg
(
size_t size,
int blockType,
const char *filename,
int linenumber
);
所有这些选项都可以让您在完成malloc的代码上进行返工。
我猜的另一个选择是每次调用时都会痛苦地破坏malloc,并且每当再次访问内存地址时都会看到它。希望您的代码库中没有动态更改内存位置,如果存在,可能会由内存管理模块进行跟踪。如果没有,您可以再次检查地址位置重复,此时您可以使用visual studio中的调用堆栈进一步调试它。
我有一个小小的想法是编写一个小代码来保存每当你为这个特定变量使用malloc时分配的地址位置。这可以使用全局变量来完成,该变量在分配您需要跟踪的内存之前设置。如果设置了该变量,则始终保存该内存地址,并在再次触发内存时与该地址进行比较。如果您已在代码中使用内存包装器进行所有内存管理,则可以执行此操作。