进程异常退出分析小计
一、内存泄漏
内存泄漏是进程运行一段时间后退出,并且看到内存特别大,基本上大几百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可以看到异常堆栈
三、堆破坏参考(https://blog.csdn.net/u010607621/article/details/135186904)
测试在写入25的时候异常了,dump堆栈如下
同时可以看到写内存的栈
gflags.exe /p /enable testException.exe /full 开启堆校验
执行完成后gflags如图
再次运行可以看到崩溃在异常堆栈了
四、莫名其妙退出了,并且没有产生dump,gflag抓下,是被杀了,还是有其他崩溃异常
五、修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps,使所有异常都产生dump
DumpType为2,DumpFolder为崩溃后生成的dump目录