.net 高级调试学习(3)异常查看

还是 .net 高级调试学习(2)中的源代码,

运行调试程序到输出异常,windbg自动中断后,

1、执行.loadby sos clr

2、执行!printexception ,(PS :缩写!pe)看到如下:

Exception object: 0000000002557cb8
Exception type:   System.ArgumentException
Message:          Obj cannot be null
InnerException:   <none>
StackTrace (generated):
    SP               IP               Function
    000000000025E8D0 000007FE909C0CB5 03ObjTypes!Advanced.NET.Debugging.Chapter3.ObjTypes.ThrowException(Advanced.NET.Debugging.Chapter3.ObjTypes)+0x95
    000000000025E930 000007FE909C065B 03ObjTypes!Advanced.NET.Debugging.Chapter3.ObjTypes.Main(System.String[])+0x1db

StackTraceString: <none>
HResult: 80070057

3, 执行!DumpObj  0000000002557cb8 查看具体异常内容

Name:        System.ArgumentException
MethodTable: 000007feef11ba28
EEClass:     000007feeeb179f8
Size:        168(0xa8) bytes
File:        C:\windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007feef108548  4000262        8        System.String  0 instance 0000000002559bf8 _className
000007feef128d58  4000263       10 ...ection.MethodBase  0 instance 0000000000000000 _exceptionMethod
000007feef108548  4000264       18        System.String  0 instance 0000000000000000 _exceptionMethodString
000007feef108548  4000265       20        System.String  0 instance 0000000002557d60 _message
000007feef11f9e0  4000266       28 ...tions.IDictionary  0 instance 0000000000000000 _data
000007feef108778  4000267       30     System.Exception  0 instance 0000000000000000 _innerException
000007feef108548  4000268       38        System.String  0 instance 0000000000000000 _helpURL
000007feef108b28  4000269       40        System.Object  0 instance 0000000002557e20 _stackTrace
000007feef108b28  400026a       48        System.Object  0 instance 0000000002557e98 _watsonBuckets
000007feef108548  400026b       50        System.String  0 instance 0000000000000000 _stackTraceString
000007feef108548  400026c       58        System.String  0 instance 0000000000000000 _remoteStackTraceString
000007feef10af70  400026d       88         System.Int32  1 instance                0 _remoteStackIndex
000007feef108b28  400026e       60        System.Object  0 instance 0000000000000000 _dynamicMethods
000007feef10af70  400026f       8c         System.Int32  1 instance      -2147024809 _HResult
000007feef108548  4000270       68        System.String  0 instance 0000000000000000 _source
000007feef1298a0  4000271       78        System.IntPtr  1 instance                0 _xptrs
000007feef10af70  4000272       90         System.Int32  1 instance       -532462766 _xcode
000007feef0d44d0  4000273       80       System.UIntPtr  1 instance                0 _ipForWatsonBuckets
000007feef0fa808  4000274       70 ...ializationManager  0 instance 0000000002557da0 _safeSerializationManager
000007feef108b28  4000261       a8        System.Object  0   shared           static s_EDILock
                                 >> Domain:Value  00000000000c7840:NotInit  <<
000007feef108548  400038a       98        System.String  0 instance 0000000000000000 m_paramName

3、也可以使用 !threads 查看所有线程的异常,显示如下:

ThreadCount:      2
UnstartedThread:  0
BackgroundThread: 1
PendingThread:    0
DeadThread:       0
Hosted Runtime:   no
                                                                                                        Lock
       ID OSID ThreadOBJ           State GC Mode     GC Alloc Context                  Domain           Count Apt Exception
   0    1 2064 000000000011a090    2a020 Preemptive  0000000002562C68:0000000002563FD0 00000000000c7840 0     MTA System.ArgumentException 0000000002557cb8
   2    2 1240 000000000011e0c0    2b220 Preemptive  0000000000000000:0000000000000000 00000000000c7840 0     MTA (Finalizer) 

书中使用的是kb 命令,查看托管和非托管的调用栈

 # RetAddr           : Args to Child                                                           : Call Site
00 000007fe`f0171f09 : 00000000`00000001 00000000`0025e5e8 00000000`02557cb8 00000000`0025e6b8 : KERNELBASE!RaiseException+0x39
01 000007fe`f0171d10 : 00000000`02556138 ffffffff`fffffffe 00000000`00000000 00000000`00000000 : clr!RaiseTheExceptionInternalOnly+0x2f0
02 000007fe`909c0cb5 : 00000000`70000195 000007fe`908b40c0 00000000`0025eb38 00000000`0025ea00 : clr!IL_Throw+0x111
03 000007fe`909c065b : 00000000`02556cd8 00000000`00000000 00000000`02556b4c 00000000`00000000 : 0x000007fe`909c0cb5
04 000007fe`f0024073 : 00000000`02553470 000007fe`908b40c0 00000000`00000000 00000000`00000000 : 0x000007fe`909c065b
05 000007fe`f0023f25 : 00000000`0025ed08 000007fe`f00b38f1 00000000`00000000 00000000`00000000 : clr!CallDescrWorkerInternal+0x83
06 000007fe`f0024506 : 00000000`00000001 00000000`0025ec80 00000000`0025ec50 00000000`0025ebc8 : clr!CallDescrWorkerWithHandler+0x4e
07 000007fe`f01158e1 : 00000000`0025eb50 00000000`00000000 00000000`00000000 00000000`00000001 : clr!MethodDescCallSite::CallTargetWorker+0xf8
08 000007fe`f0115a7a : 00000000`00000001 00000000`00000000 00000000`00000000 00000000`02553470 : clr!RunMain+0x1e7
09 000007fe`f0115971 : 00000000`00000000 00000000`02551508 00000000`00000000 00000000`00c09a10 : clr!Assembly::ExecuteMainMethod+0xb6
0a 000007fe`f0115be3 : 00000000`0025f6c8 00000000`01140000 00000000`00000000 00000000`00000000 : clr!SystemDomain::ExecuteMainMethod+0x5ea
0b 000007fe`f0115bba : 00000000`01140000 00000000`0025f820 00000000`00000000 000007fe`f0e94998 : clr!ExecuteEXE+0x3f
0c 000007fe`f012805c : ffffffff`ffffffff 00000000`00000000 00000000`00000000 00000000`00000000 : clr!_CorExeMainInternal+0xb2
0d 000007fe`f0e37fd5 : 00000000`00000000 000007fe`00000091 00000000`00000000 00000000`0025f788 : clr!CorExeMain+0x14
0e 000007fe`f0ed5b21 : 00000000`00000000 000007fe`f0128048 00000000`00000000 00000000`00000000 : mscoreei!CorExeMain+0xe0
0f 00000000`76e159cd : 000007fe`f0e30000 00000000`00000000 00000000`00000000 00000000`00000000 : MSCOREE!CorExeMain_Exported+0x57
10 00000000`7704a561 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : KERNEL32!BaseThreadInitThunk+0xd
11 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x1d

说红色行的Args to Child 的第一个参数就是异常的指针,但是这里明显不是,而是上一行的红色才是,不知是不是.net2和.net4的差异问题,于是我用.net2编译的程序来调试,输出如下:

0:000> !pe
c0000005 Exception in C:\Windows\Microsoft.NET\Framework64\v2.0.50727\sos.pe debugger extension.
      PC: 000007fe`e281f8e4  VA: 00000000`00000000  R/W: 0  Parameter: 00000000`00000000
0:000> !pe
Exception object: 00000000025dc6c0
Exception type: System.ArgumentException
Message: Obj cannot be null
InnerException: <none>
StackTrace (generated):
    SP               IP               Function
    000000000020E9D0 000007FE8DFA0A9F 03ObjTypes!Advanced.NET.Debugging.Chapter3.ObjTypes.ThrowException(Advanced.NET.Debugging.Chapter3.ObjTypes)+0x8f
    000000000020EA10 000007FE8DFA0345 03ObjTypes!Advanced.NET.Debugging.Chapter3.ObjTypes.Main(System.String[])+0x225

StackTraceString: <none>
HResult: 80070057
0:000> kb
 # RetAddr           : Args to Child                                                           : Call Site
00 000007fe`ed6a436f : 00000000`002adce0 00000000`002adce0 00000000`0020e780 00000000`002adce0 : KERNELBASE!RaiseException+0x39
01 000007fe`edc808a0 : 00000000`025dc6c0 00000000`00000000 00000000`00000000 00000000`00000001 : mscorwks!RaiseTheExceptionInternalOnly+0x2ff
02 000007fe`8dfa0a9e : 00000000`70000195 000007fe`8de43528 00000000`00000001 00000000`00000000 : mscorwks!JIT_Throw+0x130
03 000007fe`8dfa0344 : 00000000`025daef8 00000000`00000000 00000000`025dae34 00000000`00000000 : 0x000007fe`8dfa0a9e
04 000007fe`ed838f32 : 00000000`025d94c8 00000000`00000000 000007fe`8de43c70 000007fe`ed70f7b9 : 0x000007fe`8dfa0344
05 000007fe`ed6c6683 : 00000000`00000002 00000000`00000016 000007fe`ed5f7690 00000000`00000000 : mscorwks!CallDescrWorker+0x82
06 000007fe`edc18d31 : 00000000`0020ec88 00000000`00000000 00000000`0020ee90 00000000`00000008 : mscorwks!CallDescrWorkerWithHandler+0xd3
07 000007fe`ed783d6f : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`0020f0f0 : mscorwks!MethodDesc::CallDescr+0x2b1
08 000007fe`ed7a7e24 : 00000000`00280000 00000000`00000000 00000000`0000001e 00000000`00000000 : mscorwks!ClassLoader::RunMain+0x22b
09 000007fe`edd061ad : 00000000`0020f6e0 00000000`00000000 00000000`003939e8 00000000`00000200 : mscorwks!Assembly::ExecuteMainMethod+0xbc
0a 000007fe`ed7b52e7 : 00000000`00000000 00000000`00000000 00000000`00000000 000007fe`ed7cf566 : mscorwks!SystemDomain::ExecuteMainMethod+0x47d
0b 000007fe`ed797d9c : ffffffff`fffffffe 00000000`0020d7f0 0000077c`00000000 00000000`00000000 : mscorwks!ExecuteEXE+0x47
0c 000007fe`f0e37fd5 : ffffffff`ffffffff 00000000`002adce0 00000000`00000000 00000000`0020f9a8 : mscorwks!_CorExeMain+0xac
0d 000007fe`f0ed5b21 : 00000000`00000000 000007fe`ed797cf0 00000000`00000000 00000000`00000000 : mscoreei!CorExeMain+0xe0
0e 00000000`76e159cd : 000007fe`f0e30000 00000000`00000000 00000000`00000000 00000000`00000000 : MSCOREE!CorExeMain_Exported+0x57
0f 00000000`7704a561 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : KERNEL32!BaseThreadInitThunk+0xd
10 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x1d

发现这个是和书上说的是一致的,所以.net2 和net4程序还是有很大差异的。

也可以通过.!dumpstackobjects   (缩写!dso) 查看本线程调用栈所有对象实例

OS Thread Id: 0x2064 (0)
RSP/REG          Object           Name
000000000025E630 0000000002557cb8 System.ArgumentException
000000000025E6A8 0000000002557cb8 System.ArgumentException
000000000025E708 0000000002556cd8 Advanced.NET.Debugging.Chapter3.ObjTypes
000000000025E710 0000000002557cb8 System.ArgumentException
000000000025E720 0000000002556138 System.Byte[]
000000000025E740 0000000002557cb8 System.ArgumentException
000000000025E750 0000000002557cb8 System.ArgumentException
000000000025E830 0000000002556cd8 Advanced.NET.Debugging.Chapter3.ObjTypes
000000000025E838 0000000002557cb8 System.ArgumentException
000000000025E8F0 0000000002553470 System.String[]
000000000025E8F8 0000000002557d60 System.String    Obj cannot be null
000000000025E900 0000000002557cb8 System.ArgumentException
000000000025E910 0000000002553470 System.String[]
000000000025E930 0000000002556cd8 Advanced.NET.Debugging.Chapter3.ObjTypes
000000000025E950 0000000002557bb8 System.Int32
000000000025E958 00000000025535c0 System.String    Greater {0}
000000000025E960 0000000002556cd8 Advanced.NET.Debugging.Chapter3.ObjTypes
000000000025E968 0000000002557bb8 System.Int32
000000000025E970 00000000025535c0 System.String    Greater {0}
000000000025E978 0000000002557b88 Advanced.NET.Debugging.Chapter3.Comparer`1[[System.Int32, mscorlib]]
000000000025E980 0000000002556cd8 Advanced.NET.Debugging.Chapter3.ObjTypes
000000000025E988 0000000002557b88 Advanced.NET.Debugging.Chapter3.Comparer`1[[System.Int32, mscorlib]]
000000000025E990 0000000002556cd8 Advanced.NET.Debugging.Chapter3.ObjTypes
000000000025EA20 0000000002553470 System.String[]
000000000025EB08 0000000002553470 System.String[]
000000000025EBC8 0000000002553470 System.String[]
000000000025ED98 0000000002553470 System.String[]
000000000025EDC0 0000000002551508 System.AppDomain
000000000025EEA8 0000000002551508 System.AppDomain
000000000025F078 0000000002551508 System.AppDomain
000000000025F370 0000000002551440 System.SharedStatics

原文地址:https://www.cnblogs.com/karl-F/p/9314066.html

时间: 2024-11-13 07:51:46

.net 高级调试学习(3)异常查看的相关文章

.net 高级调试学习(2)对象查看

调试的程序源代码如下: using System; using System.Text; namespace Advanced.NET.Debugging.Chapter3 { public class ObjTypes { public struct Coordinate { public int xCord; public int yCord; public int zCord; public Coordinate(int x, int y, int z) { xCord = x; yCor

JavaScript高级程序设计学习笔记--错误处理与调试

try-catch语句 只要代码中包含finally子句,则无论try或catch语句块中包含什么代码--甚至return语句,都不会阻止finally子句的执行,来看下面这个函数: function testFinally(){ try{ return 2; }catch(error){ return 1; }finally{ return 0; } } 调用这个函数会返回0(PS:但我实际执行的时候会先返回0,再返回2) 抛出错误 与try-catch语句相配的还有一个throw操作符,用于

[Android Studio 权威教程]断点调试和高级调试

有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我见过最棒的. 好了开始写一个简单的调试程序,我们先来一个for循环 ? 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for (int i = 0; i < 10; i++) { //获取当前i的值     int selector = i;     //打log查看当前i的值(此步多余,实际开发请忽略)

SEO艺术——使用高级搜索 学习体会

前言: 在这个信息大爆炸的时代,网上的信息鱼龙混杂,有的时候我们费尽体力脑力也得不到自己想要的结果.在这个环境下,学习一个高级的搜索技术是一个现代人越来越需要掌握的一门技术和方法.于是,自己利用自己的业余时间,学习SEO的艺术,学会使用高级搜索技巧的同时,也学习影响网站搜索排名的重要因素和提高网站搜索排名的重要方法. 这是一门非常有用的技术,对于一个即将走向IT行业岗位的人来说,学习SEO技术可以大大提高自己对IT这个行业的认识和理解.借来了SEO的艺术这本书,进行初步的学习,现在整理一下高级搜

JavaScript高级程序设计学习笔记--基本概念

1.语句 ECMAScript中的语句以一个分号结尾:如果省略分号,则由解析器确定语句的结尾,如下例所示: var sum=a+b //即使没有分号也是有效的语句--推荐 var diff=a-b; //有效的语句--推荐 虽然语句结尾的分号不是必需的,但我们建议任何时候都不要省略它.两个原因:1.加上分号可以避免很多错误 2.加上分号也会在某些情况下增进代码的性能,因为这样解析器就不必再花时间 推测应该在哪里插入分号了. 2.变量 var message="hi"; 像这样初始化变量

VC 调试技术与异常(错误)处理 VC 调试技术与异常(错误)处理

调试技术与异常(错误)处理 (1)   转载自 52PK游戏论坛 跟踪与中间过程输出 也许一个开发人员一半以上的时间都是在面对错误,所以好的调试/查错方法(工具)会减轻我们工作的负担,也可以让枯燥的DEBUG过程得以缩短. VC开 发环境所提供的调试环境是很优秀的,我们可以运用单步运行,设置断点的方法来查找问题所在.但是这种跟踪是非常耗时的,所以我们需要采用一些策略来让我们 更容易的发现错误并对错误进行定位,所幸的是VC在这方面提供了强大的支持.在本节中我们先看看如何利用设置断点和利用TRACE

OD调试学习笔记7—去除未注册版软件的使用次数限制

OD调试学习笔记7—去除未注册版软件的使用次数限制 本节使用的软件链接 (想自己试验下的可以下载) 一:破解的思路 仔细观察一个程序,我们会发现,无论在怎么加密,无论加密哪里,这个程序加密的目的就是需要你掏腰包来获得更多的功能或者解除限制.那么我们就可以逆向的来思考,如果该程序成功的注册后,那么程序的行为必将发生变化,如NAG去除了,如功能限制没有了等等.也就是说,程序的代码的走法也会跟未注册的时候截然不同.因为程序的行为改变了,那么决定它所有行为的代码走法也会发生变化. 二:认识OD的两种断点

经典的GDB调试命令,包括查看变量,查看内存

经典的GDB调试命令,包括查看变量,查看内存 在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据.print命令的格式是: print print / 是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x. 一.表达式 print和许多GDB的命令一样,可以接受一个表达式,GDB会根据当前的程序运行的数据来计算这个表达式,既然是表达式,

java异常查看利器之使用 jvmti 的Callback_JVMTI_EVENT_EXCEPTION 事件查看异常

阅读本文前需要了解什么是jvmti,jvmti全称称之为 JVM Tool Interface,有关jvmti更详细的知识,本文不再详细列出.大家可以借助百度来了解有关它更为详尽的内容. 在开源文件大行其道的今天,基于java种种解决方案和框架纷绘踏至而来,浩瀚如海看不完也学不尽.在采用这些解决方案和框架进行项目开发时,往往会出现当程序卡壳时,既无异常提示信息亦没有与之对应的日志输出的局面.每每出现这样的困境时,往往只能通过打断点来一步步调试跟踪来解决.更有甚者,基于某一底层的框架进行相应的开发