我遇到了一个问题,即在visualstudio中的一个非常大的代码库中,找出谁在为变量分配内存。例如:我有一个结构
struct test
{
char *point;
}*obj;
obj = malloc(sizeof(struct test));
obj->point = malloc(100);
变量obj
在整个代码中传递,并在某个位置重新分配obj->点,而不释放旧内存。然而,这种情况发生在太多的位置,以至于不可能跟踪到底是哪一个在做这件事。在visual studio中有没有保留一个条件断点,如果旧内存被新内存替换,我会在那里得到通知。
如果要跟踪特定对象,则可以在&obj->point
上设置数据断点。每当此指针更改时,调试器都会停止应用程序。
在Visual Studio中,在创建obj时放置一个常规断点。转到断点窗口并选择"新建->新建数据断点"。输入&obj->point
作为地址,然后选择数据大小(32/64位为4/8)。
您可以通过使用malloc的包装器函数并向包装器添加额外的参数来实现这一点,该参数显示内存分配和分配内存的代码/进程id的位置。
否则,您可以考虑在visualstudio中使用malloc的调试版本,如下所示。
使用中定义的_malloc_dbg。这只是一个malloc,它带有额外的文件名和行号参数,用于打印或跟踪位置。这将帮助您进行调试。
void *_malloc_dbg
(
size_t size,
int blockType,
const char *filename,
int linenumber
);
所有这些选项都会使您重新编写malloc完成的代码。
我想另一种选择是,每次调用malloc时都要痛苦地破坏它,并查看何时再次访问内存地址位置。希望你的代码库中没有内存位置的动态变化,这可能会由内存管理模块完成并跟踪(如果有的话)。如果没有,你可以再次检查重复的地址位置,在这一点上,你可以使用visual studio中的调用堆栈来进一步调试它
我的一个小想法是,每当您使用malloc来处理这个特定变量时,编写一个小代码来保存正在分配的地址位置。这可以使用全局变量来完成,全局变量是在分配需要跟踪的内存之前设置的。如果设置了该变量,则始终保存该内存地址,并在内存再次命中时与该地址进行比较。如果您在代码中使用了内存包装器来进行所有内存管理,那么就可以做到这一点。