gpt4 book ai didi

debugging - 除了查找可重现的内存泄漏之外,我还可以使用 Visual C++ 调试 CRT 分配 Hook 做哪些有用的事情?

转载 作者:行者123 更新时间:2023-12-02 23:20:08 25 4
gpt4 key购买 nike

Visual C++ 调试运行时库功能所谓的 allocation hooks 。工作方式如下:定义一个回调并调用 _CrtSetAllocHook() 来设置该回调。现在,每次完成内存分配/释放/重新分配时,CRT 都会调用该回调并传递一些参数。

我成功地使用分配 Hook 找到了 reproduceable memory leak - 基本上,CRT 报告在程序终止时有一个分配编号为 N 的未释放 block (N 在每个程序运行中都相同),因此我在 Hook 中编写了以下内容:

int MyAllocHook( int allocType, void* userData, size_t size, int blockType, 
long requestNumber, const unsigned char* filename, int lineNumber)
{
if( requestNumber == TheNumberReported ) {
Sleep( 0 );// a line to put breakpoint on
}
return TRUE;
}

因为每次我都可以在 if 语句内放置一个断点并等到它被击中,然后检查调用堆栈,因此每次都会使用完全相同的分配号报告泄漏。

使用分配 Hook 我还可以做哪些其他有用的事情?

最佳答案

您还可以使用它来查找不可重现的内存泄漏:

  • 创建一个数据结构,将分配的指针映射到附加信息
  • 在分配钩子(Hook)中,您可以查询当前的调用堆栈(StackWalk 函数)并将调用堆栈存储在数据结构中
  • 在解除分配 Hook 中,删除该分配的调用堆栈信息
  • 在应用程序结束时,循环数据结构并报告所有调用堆栈。这些是分配内存但未释放内存的地方。

关于debugging - 除了查找可重现的内存泄漏之外,我还可以使用 Visual C++ 调试 CRT 分配 Hook 做哪些有用的事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4154941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com