2023年1月

||(系统状态)

简介

双竖线 ( || ) 命令将打印指定的系统或当前正在调试的所有系统的状态。

使用形式

|| System 

参数

  • System
    指定要显示的系统。 如果省略此参数,将显示正在调试的所有系统。

支持环境

模式

调试多个目标

目标

实时、 崩溃转储

平台

全部

备注

|| 命令仅在调试多个目标很有用。 很多,但并非所有的多个目标调试会话涉及多个系统。每个系统列表包括服务器名称和协议详细信息。 系统上运行调试器都会被视为 <本地>下面的示例显示如何使用此命令。 下面的命令显示所有系统。

下面的示例显示如何使用此命令。 下面的命令显示所有系统。

3:2:005> ||

以下命令还显示所有系统。

3:2:005> ||*

下面的命令显示当前处于活动状态的系统。

3:2:005> ||.

下面的命令显示系统中有最新的异常或中断。

3:2:005> ||#

下面的命令显示系统编号 2。

3:2:005> ||2

下面的命令是在dmp文件下。

0:001> ||
.  0 Full memory user mini dump: F:\XXX\V3.5.3\XXXX.7504.dmp

|(进程状态)

简介

(|) 命令显示指定进程的状态或当前正在调试你的所有进程。

使用形式

| Process

参数

  • Process
    指定要显示的进程。 如果省略此参数,将显示所有正在调试的进程。

支持环境

模式

仅限用户模式

目标

实时、 崩溃转储

平台

全部

备注

只能在用户模式下指定进程。可以在许多命令之前添加进程符号有关后跟命令。除非在启动调试会话时启用了子进程的调试,否则调试器只能使用一个进程。
下面的示例演示如何使用此命令。以下命令显示所有进程。

下面的示例显示如何使用此命令。 下面的命令显示所有进程。

2:005> |

以下命令还显示所有进程。

2:005> |*

下面的命令显示当前活动的进程。

2:005> |.

下面的命令显示的进程的最初引发异常 (或到最初附加调试器)。

2:005> |#

下面的命令显示进程号 2。

2:005> |2

前一个命令显示以下输出。

0:002> |
#  0 id: 224   name: myprog.exe 
   1 id: 228   name: onechild.exe 
. 2 id: 22c   name: anotherchild.exe 

此输出在第一行,0 是十进制进程号、 224 是十六进制的进程 ID,Myprog.exe是进程的应用程序名称。 句点 (.) 之前进程 2 意味着,此进程是当前进程。 数字符号 (#) 进程 0 意味着此进程是最初引发异常的一个或调试器附加到之前。

简介

针对WinDbg的MEX调试扩展可以帮助您简化常见的调试器任务,并为调试器提供强大的文本筛选功能。此扩展被Microsoft支持工程师广泛用于解决流程应用程序的故障。

下载&安装

  1. 下载mex.exe存档。下载地址https://www.microsoft.com/en-us/download/details.aspx?id=53304
  2. 解压缩到任何文件夹。
  3. 使用以下命令将“MEX Debugging Extension for WinDbg”加载到调试器中:.load(提取的文件夹)\MEX.dll。

下载之后,解压缩,有两个目录,X64和X86,大家根据自己的需要进行加载,目前我们主要用X64。建议直接把这个扩展拷贝到Windbg运行目录中。

 

使用帮助

加载到windbg后,输入!mex help命令,获取帮助

 

可以看到已经分类显示帮助信息,点击一项查看详细信息,比如“General”

 

使用举例

!clrstack2

此命令用于显示当前线程的托管调用堆栈。

 

!dae

此命令是DumpAllExceptions的缩写。它列出了收集转储时内存中的所有异常。

 

!us

这个命令是UniqueStacks的缩写,它负责列出所有按调用堆栈线程分组的对象。

 

! Mex.writemodule -a -p "destination path"

此命令用于将应用程序使用的所有二进制文件提取到特定路径。

 

简介

STATUS_BREAKPOINT,值为0x80000003,称为中断指令异常,表示在系统未附加内核调试器时遇到断点或断言。

触发条件

通常中断指令异常可以在以下条件下触发:

  1. 硬代码中断请求,如:asm int 3
  2. System.Diagnostics.Debugger.Break(C 35)
  3. DebugBreak()(WinAPI)
  4. 操作系统启用内存运行时检查,就像应用程序验证程序在堆损坏、内存溢出后会触发一样。
  5. 编译器可以有一些配置来启用未初始化的内存块和函数结束时应填充的内容(在重新运行..后的空白区域)。例如,如果启用/GZ,Microsoft VC编译器可以填充0xCC。0xCC实际上是asm int 3的操作码。所以如果某个错误导致应用程序运行到这样的块中,就会触发一个断点。

异常结构填充

ExceptionAddress: 038cbae3 (libcef!base::debug::BreakDebugger+0x00000009)//中断触发地址
ExceptionCode: 80000003 (Break instruction exception)//异常代码
ExceptionFlags: 00000000
NumberParameters: 1
   Parameter[0]: 00000000

调试.net应用程序时,有时会在windbg中收到错误消息。以下是我最常遇到的几个问题。

Failed to start stack walk---启动堆栈遍历失败

如果你运行sos命令!clrstack在线程上显示.net堆栈,而此线程是.net线程,但它当前未运行任何.net代码,sos将提示失败“Failed to start stack walk: 80004005.”。这并不意味着进程或调试器有任何问题。这仅仅意味着sos不能显示堆栈,因为没有堆栈。如下

Unable to walk the managed stack---无法遍历托管堆栈

如果你在本机线程(即没有对应的System.Threading.thread的线程)上运行!clrstack,sos将显示以下消息。

 

 

Following frames may be wrong---以下帧可能错误

如果windbg无法解析某个符号,它将在第一次遇到该符号时出错,告诉您找不到该符号文件,并且在随后的所有时间遇到该符号时,它都将向您发出警告,告诉您它无法正确展开堆栈。当您看到此消息时,这意味着您在警告说明下面看到的任何内容都可能不正确,因此您无法从此处信任堆栈。例如,在本例中,我们可以看到堆栈正在等待输入关键节,DataLayer.dll中的某个方法正在尝试输入关键节,但是,由于我们没有DataLayer.dll的适当符号,因此无法确定它是否是DllUnregisterServer方法。实际上,DllUnregisterServer很可能只是最后一个导出的符号名,否则我们将处于0x43fb的偏移量,这意味着此方法将非常长。
我们不仅不知道这是否是正确的方法名,而且当windbg没有正确的符号时,它甚至可能会丢失堆栈帧,所以您根本不应该信任这个堆栈。

 

 

Failed to load data access DLL, 0x80004005---加载数据访问DLL失败

此错误意味着a加载的sos.dll版本不正确,即在本例中,我在1.1转储中加载了2.0版本,或b)找不到正确的mscordacwks.dll版本。如果是选项b,请尝试运行!sym noise 和 run.cordell-ve-u-l.当然,正如错误消息中提到的,确保有一个完整的转储而不是一个小型转储。