一:背景
上一篇我们聊到了如何去找 热点函数,这一篇我们来看下当你的程序出现了 非托管内存泄漏 时如何去寻找可疑的代码源头,其实思路很简单,就是在 HeapAlloc 或者 VirtualAlloc 时做 Hook 拦截,记录它的调用栈以及分配的内存量, PerfView 会将这个 分配量 做成一个 权重,最后可以根据 权重 高低来找到有问题的调用栈。
二:案例演示
为了方便讲述,我们演示一个 Windows 的 Nt堆 内存泄漏,让 C# 调用 C++ 代码时故意泄漏内存,代码如下:
#include <iostream>
extern "C"
{
_declspec(dllexport) int calc_size(int size);
}
int calc_size(int size) {
int* buffer = new int[size];
return 2 * size;
}
然后在 C# 中导入这个 C++ 的 dll。
internal class Program
{
[DllImport("ConsoleApplication2.dll", CallingConvention = CallingConvention.Cdecl)]
extern static int calc_size(int size);
订阅专栏 解锁全文
4349

被折叠的 条评论
为什么被折叠?



