windbg dt 如何显示类的静态成员变量?
windbg的dt指令可以用来显示变量的结构和值,如果是一个C++类,那么它将以偏移的形式显示类里的成员地址和符号名。那类里的静态成员呢?如下:
可知,静态成员以=符号开始,紧跟地址、符号名和值。
windbg的dt指令可以用来显示变量的结构和值,如果是一个C++类,那么它将以偏移的形式显示类里的成员地址和符号名。那类里的静态成员呢?如下:
可知,静态成员以=符号开始,紧跟地址、符号名和值。
由于.net异常与任何其他异常一样是一个.net对象,因此当您(或您调用的某些代码)调用new XXException()时,它会存储在GC堆中。这意味着,如果您有一个进程的内存转储,您可以转储所有最近发生的异常,或者更确切地说,所有尚未被垃圾收集的异常。
如果您在windbg中加载了sos(.loadby sos mscorwks),则执行此操作非常简单
0:015> !dumpheap -type Exception------------------------------Heap0Address MT Size
02ea6b0c 79330a807202ea75f0 7930eab476…
06f57aa4 7930eab47606f5829c 7930eab47606f58a94 7930eab47606f5928c 7930eab47606f59a84 7930eab47606f5a27c 7930eab47606f5aa74 7930eab47606f5b26c 7930eab47606f5ba64 7930eab47606f5c25c 7930eab47606f5ca54 7930eab47606f5d24c 7930eab476total319objects------------------------------total656objects
Statistics:
MT Count TotalSize Class Name
79333dc01 12System.Text.DecoderExceptionFallback
79333d7c1 12System.Text.EncoderExceptionFallback
793172f82 64System.UnhandledExceptionEventHandler
79330c301 72System.ExecutionEngineException
79330ba01 72System.StackOverflowException
79330b101 72System.OutOfMemoryException
79330a801 72System.Exception
79330cc02 144System.Threading.ThreadAbortException
7930eab4646 49096System.IO.DirectoryNotFoundException
Total656 objects
#命令在反汇编代码里根据指定模式进行搜索。
#[Pattern] [Address [ L Size ]]
Pattern
指定要在反汇编代码中搜索的模式。模式可以包含各种通配符和说明符。如果要在模式中包含空格,则必须用引号将模式括起来。该模式不区分大小写。如果您以前使用过#命令并且省略了模式,则该命令将重用最近使用的模式。
Address
指定搜索开始的地址。
Size
指定要搜索的指令数。如果忽略大小,搜索将继续,直到出现第一个匹配。
Modes |
User mode, kernel mode |
Targets |
Live, crash dump |
Platforms |
All |
如果您以前使用过#命令并且省略了地址,则搜索将从上一次搜索结束的位置开始。此命令通过搜索反汇编文本中的指定模式来工作。可以使用此命令查找寄存器名称、常量或反汇编输出中显示的任何其他字符串。可以在不使用Address参数的情况下重复该命令。
您可以使用u(Unassemble)命令或WinDbg中的“反汇编”窗口查看反汇编说明。反汇编显示最多包含四个部分:地址偏移、二进制代码、汇编语言助记符和汇编语言详细信息。以下示例显示了可能的显示。
就是TEB::StackBase-TEB::StackLimit的值约为线程栈保留大小(VC++编译器默认的是1M),就可以判断栈 爆掉了。
比如:
!teb
TEB at 01192000
ExceptionList: 0120134c
StackBase: 01300000
StackLimit: 01201000
SubSystemTib: 00000000
FiberData: 00001e00
ArbitraryUserPointer: 00000000
Self: 01192000
EnvironmentPointer: 00000000
ClientId: 00004b7c . 000059d4
RpcHandle: 00000000
Tls Storage: 1a17b928
PEB Address: 0118f000
LastErrorValue: 0
LastStatusValue: c0000034
Count Owned Locks: 0
HardErrorMode: 0
?StackBase-StackLimit=01300000-01201000=1044480B=1020K加上保护页4K,就是1024K=1M了。
又比如:
0:000> !teb
TEB at 002bf000
ExceptionList: 001cfd78
StackBase: 001d0000
StackLimit: 000d1000
SubSystemTib: 00000000
FiberData: 00001e00
ArbitraryUserPointer: 00000000
Self: 002bf000
EnvironmentPointer: 00000000
ClientId: 00002d60 . 000044e4
RpcHandle: 00000000
Tls Storage: 0069d808
PEB Address: 002bc000
LastErrorValue: 0
LastStatusValue: 0
Count Owned Locks: 0
HardErrorMode: 0
?StackBase-StackLimit==001d0000-000d1000=1020K加上保护页4K,也是1024K=1M了。
当我们用windbg调试时,经常会遇到“*** WARNING: Unable to verify checksum for xxx.dll”这样的提示,他的意思时不能校验某某模块的校验和。这一般都是我们的动态库或exe的校验和没有设置。可以做如下两种处理:
1、在VS里修改配置,重新生成
2、使用VC工具包中的editbin工具可以为程序文件增加校验和