使用WinDbg调试程序异常和死锁等问题

一、在使用WinDbg调试之前,我们先使用VS的调试功能

  1、文件 -> 打开 -> 文件 -> 打开Dump文件

  

   2、调试 -> 选项 -> 调试 -> 符号 -> 添加该应用的.pdb所在的文件夹

   3、使用 仅限托管 进行调试

 

   正常情况下会执行到抛出异常的位置,并且显示异常详情。

二、WinDbg 参考:https://www.cnblogs.com/zwj-199306231519/p/15871999.html

下载路径:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debugger-download-tools

 旧版需要单独配置符号路径,某些版本符号路径没办法全部下载下来,有一些遗漏导致功能用不了,推荐去上面的官网下载新版本

SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols

 

下面的都是新版的操作,使用Open dump file打开dump文件

 

 

 

 自动下载符号文件,下载完毕使用 !analyze -v分析(第一次使用还会下载分析使用的符号文件,之后就不会再下载了),FAULTING_SOURCE_CODE指出了源码错误的位置,kv可以查看调用堆栈

异常信息解读

下面分别介绍比较重要的关键字段:

1、各个参数的详解

FAULTING_IP :

即出错的指令地址,指出发生错误时所执行的指令,这的IP值EIP

EXCEPTION_RECORD:

异常记录的地址,即该地址是PEXCEPTION_RECORD类型,并且这里给出了分析异常的命令(.exr -1)

ExceptionAdddress:

发生异常的地址

ExceptionCode:

异常所代码的错误码,这是因为非法访问导致的

ExceptionFlag:

异常标志(1,表示不可继续的异常 0,表示可继续的异常)

NumberParameters:

异常相关联的参数,第一个参数是空指针,第二参数是结构体成员地址

FAULTING_THREAD:

发生错误的线程ID

CONTEXT:

是发生异常时的上下文地址,这里给出的地址是0x002afb08 ,这个很重要。

FAULTING_SOURCE_CODE:

给出了执行异常时所对应的源代码,>符号表明了异常语句。

STACK_COMMAND:

是堆栈相关的命令,获取程序执行错误时堆栈调用情况,这给出了.cxr 0x2afb08 和 kb两个命令, 这个也很重要。

2、STACK_TEXT栈文本

该字段是栈文本信息,它反映了错误堆栈的调用情况,从中可以知道以下两个信息:

函数执行顺序为从MainWindow_Loaded函数到Run函数,执行Test11111函数时发生异常。
每一行中的每列地址分别为 ChildEBP地址、函数返回地址、函数前三个参数,共计五个。
例如:

00d92104参数1 00000000参数2 00000005 参数3 若参数少于三个,按照实际顺序对号入座即可。

 

我有个例子生成的Dump文件放到Windbg分析:

namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            throw new Exception("123");
        }
    }
}

输入!analyze -v命令,堆栈文本返回如下:

STACK_TEXT: 00000000 00000000 WpfApp1!unknown_function+0x0

关键告警

*** WARNING: Unable to verify checksum for WpfApp1.exe

DEBUG_FLR_EXCEPTION_CODE(80131500) and the ".exr -1" ExceptionCode(e0434352) don't match

由于没有加载 SOS 调试扩展,无法看到原始的 .NET 异常类型和堆栈,所以先加载 SOS 调试器扩展

在 WinDbg 中执行以下命令

.loadby sos clr

返回

0:000> .loadby sos clr
The call to LoadLibrary(C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos) failed, Win32 error 0n193
    "%1 不是有效的 Win32 应用程序。"
Please check your debugger configuration and/or network access.
0:000> !pe
No export pe found

根本原因是 调试器架构(x86/x64)与目标进程不匹配,使用对应版本的windbg分析dump。

我换了一个x64的程序打印的dump,结果如下

0:000> !analyze -v

*******************************************************************************

* * * Exception Analysis * * *

*******************************************************************************

*** WARNING: Unable to verify checksum for WpfApp1.exe

然后就一直busy卡住不动,

原因是运行windbg没有使用管理员运行

posted @ 2022-08-14 15:00  log9527  阅读(1446)  评论(0)    收藏  举报