一、内存泄漏
内存泄漏是进程运行一段时间后退出,并且看到内存特别大,基本上大几百M或者超过1G,dump异常堆栈都是在申请内存的时候崩溃,下面看下如何定位分析泄漏原因
1.1 使用!heap -s看下总体内存大小
1.2 使用!heap -stat -h 命令查看具体堆使用情况
1.3 查看比较大占用内存后,使用!heap -flt s 218查看具体大小内存的堆使用地址
1.4 使用!heap -p -a address查看具体地址堆栈
1.5 如果没看到堆栈,可以使用gflags设置对应进程的参数,这样在崩溃的时候能看到堆栈
1.6 如果还是无法定位堆栈,就调试下断点,尝试复现抓到泄漏堆栈
bp ntdll!RtlAllocateHeap "j (poi(esp+c)=218) '';'gc'"
二、进程异常退出,解析UnhandledExceptionFilter参数定位异常堆栈
2.1 看到异常堆栈在UnhandledExceptionFilter函数,可以看该函数参数
LONG UnhandledExceptionFilter( [in] _EXCEPTION_POINTERS *ExceptionInfo );、
typedef struct _EXCEPTION_POINTERS {
PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
2.2 其中ExceptionInfo.ContextRecord可以看到异常信息
dx -r1 (_EXCEPTION_POINTERS *)(address)
然后 .cxr 0x18bef38可以看到异常堆栈
三、
标签:EXCEPTION,POINTERS,小计,堆栈,内存,heap,进程,异常 From: https://www.cnblogs.com/ciyze0101/p/18300974