windows应用程序堆损坏的调试

本文讲述了作者在使用iexplore.exe时遇到堆损坏问题,通过编写并分析1.exe示例,展示了如何使用windbg进行调试,包括设置gflags、观察崩溃点和处理崩溃的两种方法:自动弹出调试器和生成崩溃dump。
摘要由CSDN通过智能技术生成

最近遇到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

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值