进程异常退出分析小计

一、内存泄漏

  内存泄漏是进程运行一段时间后退出,并且看到内存特别大,基本上大几百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目录

 

posted on 2024-07-13 23:25  ciyze0101  阅读(22)  评论(0编辑  收藏  举报

导航