最近遇到iexplore.exe的崩溃,windbg查看崩溃原因是堆损坏,参见《软件调试》,给出分析方法。
自己写一个1.exe,会触发堆损坏,代码如下
#include <cstdlib>
#include <cstdio>
void func(char *p) {
int i = 14;
for (; i<9999; i++) {
printf("i=%d\n", i);
p[i] = 0;
}
}
int main() {
char *p = (char*)malloc(15);
func(p);
delete p;
return 0;
}
一启动1.exe,可以看到数字刷到8000多的时候才会崩溃。但是实际上数字在16的时候就已经堆损坏了。
我们打开windbg(x86)的文件夹,将gflag.exe拖曳到cmd命令框中,执行
gflag.exe /p /enable 1.exe /full
再去执行1.exe,可以看到,当数字在16的时候,就会崩溃(或弹出调试器)。
为了查明ie崩溃的问题,我们需执行
gflag.exe /p /enable iexplore.exe /full
再去执行ie,当ie触发堆损坏的时候,自然就会崩溃或弹出调试器。
至于在崩溃的时候怎么办?一种方法是自动弹出调试器(事先在Windbg(x86)里执行Windbg.exe -I大写的i)
另一种办法是留下崩溃dmp,得事先执行
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v "DumpFolder" /t REG_EXPAND_SZ /d "C:\Windows\Temp" /f
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v "DumpCount" /t REG_DWORD /d 9 /f
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v "DumpType" /t REG_DWORD /d 2 /f