Windbg 分析内存异常问题

windbug截取崩溃与分析崩溃文件 一、截取崩溃 1.设置windbug截取环境。 C:\Program Files (x86)\Debugging Tools for Windows (x86)\windbg.exe -i 环境设置好之后,程序宕机之后,便会弹出windbug。 2.截取dump文件 .dump -ma d:\test.dmp(d:\test.dmp是路径) 二、分析dump 1.设置符号路径: .sympat... 阅读详情
使用windbug调试内存问题的时候有的时候需要查看变量的值,
下面我们通过一个例子来总结一下相关的指令使用。
#include <windows.h>
#include <stdio.h>include <conio.h>

VOID SimulateMemoryCorruption();

class CAppInfo
{
public:
    CAppInfo( LPWSTR wszAppName,  LPWSTR wszVersion)
    {
        m_wszAppName = wszAppName;
        m_wszVersion = wszVersion;
    }

    VOID PrintAppInfo()
    {
        wprintf(L"\nFull application Name: %s\n", m_wszAppName);
        wprintf(L"Version: %s\n", m_wszVersion);
    }

private:
    LPWSTR m_wszAppName;
    LPWSTR m_wszVersion;
};

CAppInfo* g_AppInfo;

int __cdecl wmain(int argc, WCHAR* args[])
{
    wint_t iChar = 0;
    const wchar_t* myName = L"MyAppName";
    const wchar_t* myVersion = L"1.0";


    g_AppInfo = new CAppInfo(const_cast<LPWSTR>(myName), const_cast<LPWSTR>(myVersion));
    if (!g_AppInfo)
    {
        return 1;
    }

    wprintf(L"Press: \n");
    wprintf(L"    1    To display application information\n");
    wprintf(L"    2    To simulated memory corruption\n");
    wprintf(L"    3    To exit\n\n\n>");

    while ((iChar = _getwche()) != '3')
    {
        switch (iChar)
        {
        case '1':
            g_AppInfo->PrintAppInfo();
            break;

        case '2':
            SimulateMemoryCorruption();
            wprintf(L"\nMemory Corruption completed\n");
            break;

        default:
            wprintf(L"\nInvalid option\n");
        }
        wprintf(L"\n\n> ");
    }
    return 0;
}


VOID SimulateMemoryCorruption()
{
    const char* pszWrite = "Corrupt";
    BYTE* p = (BYTE*)g_AppInfo;
    CopyMemory(p, pszWrite, strlen(pszWrite));
}

编译以后生成exe和pdb 文件(在debug模式下编译)
添加好符号路径,然后使用windbg 来启动exe 程序
在这里插入图片描述
当第二次输入1的时候会发生异常,windbg会捕获一个异常
在这里插入图片描述
可以看出异常处的的地址 ds:002b:72726f43=??? 里面的内容有问题。用指令查看堆栈的调用情况
在这里插入图片描述
从里面可以看到windbgTest1!CAppInfo::PrintAppInfo+0x3a 地址处出现了问题,从源代码中可以看到问题的异常似乎和m_wszAppName,m_wszVersion两个参数有关。

  VOID PrintAppInfo()
    {
        wprintf(L"\nFull application Name: %s\n", m_wszAppName);
        wprintf(L"Version: %s\n", m_wszVersion);
    }

指令取出 CAppInfo* g_AppInfo ,变量的地址
在这里插入图片描述
然后查看里面的参数:
在这里插入图片描述
接在需要查看0x72726f43 和0x00747075 两处的内存中的内容
在这里插入图片描述
查看g_AppInfo 实例的内存布局
在这里插入图片描述
我们以文本的格式查看内存处的内容
在这里插入图片描述
似乎 g_AppInfo 类对象的实例被字符串“Corrupt ”覆盖了

    const char* pszWrite = "Corrupt";
    BYTE* p = (BYTE*)g_AppInfo;
    CopyMemory(p, pszWrite, strlen(pszWrite));

这一段代码正好就是覆盖了这个部分。
备注:
类CAppInfo包含两个LPWSTR(长指针到宽字符)类型的私有成员变量m_wszAppName和m_wszVersion,以及一个构造函数和一个公有成员函数PrintAppInfo。由于LPWSTR在Windows平台上通常是一个指向宽字符(即wchar_t)的指针,它的大小在32位系统上通常是4字节(指针大小)。因此,每个LPWSTR成员将占用4字节。此外,由于PrintAppInfo成员函数不占用类的实例内存(它们通常存储在代码段中),因此它们在类的内存布局中不占用空间。
在这里插入图片描述

windbg错误码汇总 windbg错误码汇总。 阅读详情

相关推荐

windbg分析C++ EH exception

工作时遇到的dump分析,记录下来以后给自己复习用 配置有冲突的策略后。运行一段时间后exe占用的内存不断上涨,之后崩溃 0:005> !analyze -v ******************************************************************************* *

hom_yang的博客 9700

05-windbg工具定位内存问题-01

windbg分析内存问题

qq_37103755的博客 2484

【愚公系列】2023年06月 内存分析之WinDbg(内核模式)

内核模式和用户模式是操作系统中的两种不同的运行模式。内核模式是操作系统的高权限模式,运行在CPU的特殊特权级别下,可以执行任何CPU指令并且可以访问所有系统资源,包括硬件设备和内存。用户模式是操作系统的低权限模式,在这个模式下,CPU只能执行一部分指令,并且对系统资源的访问受到限制,例如只能访问属于自己进程的内存空间。当操作系统启动时,内核被加载到内存中,并运行在内核模式下。当用户运行应用程序时,应用程序运行在用户模式下,只能访问自己的内存空间和一些受限的系统资源。

愚公智库 4413

使用WinDbg对软件崩溃信息进行抓包的方法

摘要:本文介绍了使用WinDbg工具抓取KingSCADA4.0软件崩溃日志的方法。首先获取WinDbg软件(可通过网络下载或联系开发者),注意区分32/64位版本。操作步骤包括:以管理员身份运行WinDbg、附加SCADAView.exe进程、输入"g"开始抓包。当软件崩溃时,输入".dump"命令保存日志到C盘,最后将scada.dmp文件发送给开发人员分析。该方法适用于需要排查软件崩溃问题的场景。(148字)

做有价值的事,积累有价值的笔记! 899

通过查看Windbg中变量值去定位C++软件异常的又一典型案例分享

通过查看windbg中变量值去定位C++软件异常的又一典型案例分享。

dvlinker的技术专栏 1万+

将Windbg附加到软件进程上排查异常闪退的问题

使用Windbg和Process Explorer排查因为内存泄漏导致的软件异常闪退问题。

dvlinker的技术专栏 1万+

利用Windbg分析高内存占用问题

大家好,我是本期的微软MVP实验室研究院--冯辉。本篇文章主要介绍如何利用WinDbg分析应用进程中的内存问题,从托管堆到非托管堆的探索以及到内存的分配,接下来我们一起来探索吧。 由于这近一年时间一直忙于写书和工作,一直没有水文,但是近期有几位朋友使用我们的Magicodes.IE反馈在导出过程中内存暴涨...好吧,不管怎样,不能苦了我们朋友,接下来我们通过windbg来看一下什么原因导致的。 接下来我们先通过address -summary来看一下当前应用内存占用量。 0:000> !a

微软技术栈 3834

通过查看Windbg中变量的值,快速定位因内存不足引发bad alloc异常(C++ EH exception - code e06d7363)导致程序崩溃的问题

本文详细讲述如何通过查看Windbg中变量的值快速定位因内存不足引发bad alloc异常(C++ EH exception - code e06d7363)导致程序崩溃的问题。

dvlinker的技术专栏 2万+

WinDbg 分析Dump常用方法和命令

记录下自己使用WinDbg分析Dump时常用的一些方法和命令 1 !analyze -v       //找出出错的堆 2 .exrc          //找到程序崩溃的位置 3 !heap          //打印出错函数的局部位置 4 !for_each_frame dv /t //显示call stack内容 5 ~*kbn           //显...

kelan11的博客 1396

通过查看Windbg中汇编指令及内存中的值去定位软件崩溃问题

通过查看Windbg中汇编指令及内存中的值去定位软件崩溃问题。

dvlinker的技术专栏 9913

通过查看Windbg中变量值去定位C++软件异常问题

本文详细讲述如何通过查看Windbg中的变量值去定位C++软件异常问题。

dvlinker的技术专栏 9073

iis站点内存泄漏问题分析

在一次上线过程中iis内存飙升,随后跟运维要到站点的dump文件,使用windbg分析了clr的内存分配,找到了问题的症结,先记录如下: 使用windbg加载dump文件 1.打开windbg,File->Open Crush Dump,打开dump文件; 2.设置符号路径和站点发布文件路径 .sympathC:\MyCodesSymbols*SRV*C:\MyLocal...

weixin_34059951的博客 1130

使用Windbg分析dump文件定位软件异常的方法与操作步骤

本文详细讲述了使用Windbg分析dump文件的一般步骤与诸多细节,并给出了一个实战分析实例,有一定的实战参考价值。

dvlinker的技术专栏 7万+

windows程序使用Windbg分析dump

windows上Windbg分析dump文件

steem 9008

使用Windbg排查C++程序调用IsBadReadPtr或IsBadWritePtr引发内存访问违例问题

C++程序调用IsBadReadPtr或IsBadWritePtr引发内存访问违例问题的排查

dvlinker的技术专栏 1万+

使用Windbg分析dump文件排查C++软件异常的一般步骤与要点分享

本文详细总结了使用Windbg静态分析dump文件去排查C++软件异常的一般步骤与方法,供大家借鉴或参考。

dvlinker的技术专栏 3万+

抓取 Dump 文件与 WinDbg 使用详解:定位 Windows 程序异常的利器

Dump 文件(又称内存转储文件)是某一时刻程序内存的快照,包含了进程的堆栈、线程、模块、句柄等信息。通过分析 Dump 文件,我们可以在程序崩溃后“还原现场”,定位问题根源。小型转储(Minidump):只包含线程、堆栈和模块信息,体积小,适合快速定位问题。完全转储(Full Dump):包含整个进程的内存,适合分析复杂问题如内存泄漏。自定义转储(Custom Dump):可通过工具指定需要包含的内容。命令说明.exr -1查看最后一个异常记录!analyze -v。

nielilijy的专栏 2164

windbug安装文档

WinDbg 是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于 Kernel 模式调试和用户模式调 试,还可以调试 Dump 文件。

上一篇: PE 格式详解
下一篇: Windbg查看函数调用过程中的内存布局
cwei231
博客等级 码龄17年 2060粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值