分类 调试 下的文章

我们很多人都认为调试器中的一些简单命令是理所当然的,这些命令可以让生活变得轻松。我想了几个特别能搭配的。第一个命令是kn。Kn将显示当前调用堆栈,并在单个调用的最左边包含堆栈帧编号。
我在Windbg中运行BadWindow.EXE文件,通过~0s将我的线程设置为线程0。然后我只需键入kn。这将转储调用堆栈,如您所见,在最左边的每个调用都有堆栈帧号。

 

使用上面堆栈中的堆栈帧2,让我们看看它使用的局部变量。首先,我们必须使用.frame和frame number获取上下文。

 

 

 

现在要转储局部变量,我们可以使用dv(Display Local Variables)命令。(请注意,您需要为正在调试的二进制文件使用专用符号才能使其正常工作)。

 

如你所见,我们这里有几个当地人。现在,因为我有这个二进制的私有符号,所以调试器已经理解了每个变量的结构和数据类型。
此外,因为我已经在堆栈帧上下文中,所以我可以简单地dt(display type)加上变量的名称,调试器就可以算出地址。让我们dt msg看看它包含什么数据。

 

如你所见,有几个结构是这个结构的一部分。请看上面输出的右边。您将注意到右侧的数据类型名称HWND_和tagPOINT。这些都是结构。好消息是dt将递归地工作,并将在当前结构下转储结构。您只需发出DT–r。您可以通过在–r后面附加一个数字来指定深度。

 

简介

CLRDBG_NOTIFICATION_EXCEPTION_CODE,值为0x0x04242420。此异常在.CLR 4.0的启动路径期间触发,是CLR4.0版本初始化调试服务时向调试器发送消息通知。个人认为这应该只在附加调试器时抛出。

详细说明

这实际上是一个未记录的异常(CLRDBG_NOTIFICATION_exception_CODE),它显然是对4.0clr中托管调试器使用的IPC协议的一个补充。忽略它应该是完全安全的。

此特定异常并不表示发生了错误,而是表示CLR正在尝试向调试器发送消息。最有可能的情况是,您看到的异常对应于运行时启动事件,这是一条消息,指示CLR已初始化到足以让启蒙调试器开始与其交互。如果VS启用了托管调试,它将理解该消息并通知调试人员在将来继续生成这些消息。当然,聪明的调试器不会将它们显示为原始异常,它将解码它们的含义,而是在内部进行更新,例如“加载了新的应用程序域”或“反射发出刚刚在内存中创建了一个新类型”。或者,如果调试器没有托管代码,它将无法识别此异常的任何特殊情况没有特别回应。如果没有响应,CLR假设调试器没有为托管代码提供服务,并且不应该发送任何进一步的消息(异常)。

异常填充结构

ExceptionAddress: 762819b2 (KERNELBASE!RaiseException+0x00000062)//抛出地址
ExceptionCode: 04242420//异常代码
ExceptionFlags: 00000000
NumberParameters: 3//参数个数,一般为3个
   Parameter[0]: 31415927//是个常量,不知什么意思
   Parameter[1]: 721a0000//CLR4.0 clr.dll模块加载基址
   Parameter[2]: 00bef768//struct DebuggerIPCEvent const *调试器IPC事件指针

最近,我处理了一个问题,在系统帐户下安装32位Office时没有发生注册表反射。这需要同时研究32位Office代码和实现注册表反射的Wow64代码。使用32位调试器附加到Wow64进程时,就像在32位计算机上调试32位进程一样;进程中没有64位二进制文件。但是,我们需要调试Wow64来调试注册表反射代码。为此,我们使用64位调试器附加到Wow64进程,它允许您查看Wow64二进制文件。

lm

Base TimeStamp Module
400000 42435b2a Mar 24 18:28:26 2005C:\Program Files (x86)\Internet Explorer\IEXPLORE.EXE

77ec0000 45d6cc72 Feb
17 03:35:46 2007C:\WINDOWS\system32\ntdll.dll

6b000000 45d6943d Feb
16 23:35:57 2007C:\WINDOWS\system32\wow64.dll

6b280000 45d695f3 Feb
16 23:43:15 2007C:\WINDOWS\system32\wow64win.dll

78b80000 42438b7a Mar
24 21:54:34 2005 C:\WINDOWS\system32\wow64cpu.dll

是否调试过应用程序并在输出窗口中看到有关“First Chance”异常的消息?有没有想过:

  • 什么是First Chance Exception?
  • 第一次机会异常是否意味着我的代码中存在问题?

在调试应用程序时,每当此时遇到异常,调试器就会收到通知,应用程序将挂起,调试器将决定如何处理异常。第一次通过此机制称为“第一次机会”异常。根据调试器的配置,它将恢复应用程序并传递异常,或者使应用程序挂起并进入调试模式。如果应用程序处理异常,它将继续正常运行。
在Visual Studio中,您可能会在输出窗口中看到如下消息:

 

 

在Windbg里如下:

 

 


如果应用程序不处理异常,则重新通知调试器。这被称为“second chance”异常。调试器再次挂起应用程序并确定如何处理此异常。通常,调试器被配置为在第二次出现异常(未处理)时停止,并进入调试模式,允许您进行调试。

“First Chance Exception”是否意味着我的代码中存在问题?第一次出现异常消息通常并不意味着代码中有问题。对于能够优雅地处理异常的应用程序/组件,“First Chance Exception”消息会让开发人员知道遇到了异常情况并得到了处理。对于没有异常处理的代码,调试器将收到第二次机会的异常通知,并将在出现未处理的异常时停止。