@a604572782
2015-10-19T10:09:38.000000Z
字数 5024
阅读 3404
windbg
代码分析
异常分析
性能调优
当我们编写好的代码所生产的项目开始投产时,操作系统、网络、防火墙、磁盘等诸多因素都会影响该程序的运行环境。即使在测试环境,该程序经受了各种各样的考验,由于投产环境多样化,也会导致该程序发生一些难以预料的异常(也包括在设计软件时考虑的不周全,或项目隐含一些难以查找的bug等因素引起的异常)
为了尽快查找到程序发送异常的原因,降低给客户所造成的一系列麻烦,我们必想方设法来尽快解决这个问题。windbg就能满足我们的要求 ,他能够对栈进行跟踪、监视本地程序、调试代码。
KD(Kernel Debugger):可以用于远程调试如蓝屏等操作系统问题,或开发驱动程序是也可用到。
CDB(Command-line debugger):这是一个控制台应用程序。通过它你可以显示并执行程序代码、设置断点、检查并改变内存中的值。它也可以分析二进制代码,显示程序集指令等。由于CDB可以通过地址或全局符号访问内存中的位置,你可以通过名字引用数据和质量而不是通过地址,我们可以更容易定位调试特定的代码块。
NTSD(NT debugger):这是一个CDB的变种,他有windows风格的UI,用户模式的调试器,你可以用它调试你的用户模式的应用程序。
windbg:封装了KD和NTSD,并有像模像样的UI,它可以同时用作用户模式和内核模式的调试。
VS debugger:它提供了比windbg更丰富的界面,使用了和KD和NTSD相同的引擎。
WinDbg提供了命令行选项,它支持三种命令:
1. 常规命令(如k):用于调试过程。
2. 点命令(如.sympath):用于控制debugger。
3. 扩展命令(如!handle):这是自定义命令通过扩展的dll实现。
根据注意自己的操作系统选择相应的版本
64位下载
32位下载
PDB文件是生成的程序数据库文件,它并不包含说明或二进制代码,而是能让debugger读懂你编译好的程序。私有pdb包含了私有及共有符号,源代码行,类型,本地和全局信息。共有pdb不包含类型,本地和全局信息。
Symbol下载
通过图形化界面操作,点击File->Symbol File Path输入
语法:SRV*downstream_store*http://msdl.microsoft.com/download/symbols
例如:srv*F:\windbg\symbols*http://msdl.microsoft.com/download/symbols
需要的Symbols会被下载到指定的路径。
当匹配PDB文件是,debugger会配如文件名、时间戳等信息,若已有symbol信息,你能看到你的调用堆栈函数名和它们的参数。如果这些二进制文件和pdb文件来自于你的程序,你还能获得关于私有函数、局部变量以及类型等信息。
在File->Source File Path 中设置源代码路径,在调试的过程中debugger会根据pdb调试过程中的行号匹配源代码。
默认windbg是一个非托管代码[1]的调试工具,我们可以用一个SOS.dll
的.net framework的扩展来让它可以调试托管代码[2]。下载后是一个exe
的文件选择安装路径会出现一个名为psscor2.zip
的文件,将文件解压
选择相应版本的psscor2.dll复制到windbg根目录
using System;
namespace WindbgTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter a message:");
string input = Console.ReadLine();
Data d = new Data
{
Message = input,
CurrentDateTime = System.DateTime.Now
};
Console.WriteLine("You entered: " + d);
}
}
public class Data
{
public string Message { get; set; }
public DateTime CurrentDateTime { get; set; }
public override string ToString()
{
Console.ReadLine();
return string.Format("{0} at {1}", Message,CurrentDateTime.ToLongTimeString());
}
}
}
这个段代码的功能是在输入一串字符按回车后显示这串字符并输出时间,但是我们加入了一个重载方法
ToString()
,其中有的Console.ReadLine();
需要在输入两次回车才会显示,我们姑且认为这是一个bug。
Open Crash Dump
,选择刚才创建的转储文件 .load E:\开发工具\代码分析\psscor2\psscor2\amd64\psscor2.dll
加载psscor2.dll
为了确认加载成功,输入!help
-------------------------------------------------------------------------------
PSSCOR is a debugger extension DLL designed to aid in the debugging of managed
programs. Functions are listed by category, then roughly in order of
importance. Shortcut names for popular functions are listed in parenthesis.
Type "!help <functionname>" for detailed info on that function.
Object Inspection Examining code and stacks
----------------------------- -----------------------------
DumpObj (do) Threads
DumpArray (da) CLRStack
DumpStackObjects (dso) IP2MD
DumpAllExceptions (dae) BPMD
DumpHeap U
DumpVC DumpStack
GCRoot EEStack
ObjSize GCInfo
FinalizeQueue EHInfo
PrintException (pe) COMState
TraverseHeap
DumpField (df)
DumpDynamicAssemblies (dda)
GCRef
DumpColumnNames (dcn)
DumpRequestQueues
DumpUMService
Examining CLR data structures Diagnostic Utilities
----------------------------- -----------------------------
DumpDomain VerifyHeap
EEHeap DumpLog
Name2EE FindAppDomain
SyncBlk SaveModule
DumpThreadConfig (dtc) SaveAllModules (sam)
DumpMT GCHandles
DumpClass GCHandleLeaks
DumpMD VMMap
Token2EE VMStat
EEVersion ProcInfo
DumpModule StopOnException (soe)
ThreadPool MinidumpMode
DumpHttpRuntime FindDebugTrue
DumpIL FindDebugModules
PrintDateTime Analysis
DumpDataTables CLRUsage
DumpAssembly CheckCurrentException (cce)
RCWCleanupList CurrentExceptionName (cen)
PrintIPAddress VerifyObj
DumpHttpContext HeapStat
ASPXPages GCWhere
DumpASPNETCache (dac) ListNearObj (lno)
DumpSig
DumpMethodSig Other
DumpRuntimeTypes -----------------------------
ConvertVTDateToDate (cvtdd) FAQ
ConvertTicksToDate (ctd)
DumpRequestTable
DumpHistoryTable
DumpBuckets
GetWorkItems
DumpXmlDocument (dxd)
DumpCollection (dc)
Examining the GC history
-----------------------------
HistInit
HistStats
HistRoot
HistObj
HistObjFind
HistClear
!clrstack
OS Thread Id: 0x354c (0)
*** WARNING: Unable to verify checksum for mscorlib.ni.dll
Child-SP RetAddr Call Site
000000000110e480 00007ff9b1a32569 DomainNeutralILStubClass.IL_STUB(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte*, Int32, Int32 ByRef, IntPtr)
000000000110e5a0 00007ff9b1a32452 System.IO.__ConsoleStream.ReadFileNative(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte[], Int32, Int32, Int32, Int32 ByRef)
000000000110e600 00007ff9b132082a System.IO.__ConsoleStream.Read(Byte[], Int32, Int32)
000000000110e660 00007ff9b1342a5a System.IO.StreamReader.ReadBuffer()
000000000110e6b0 00007ff9b1a3578f System.IO.StreamReader.ReadLine()
000000000110e700 00007ff952f00172 System.IO.TextReader+SyncTextReader.ReadLine()
000000000110e760 00007ff9b27a8f32 WindbgTest.Program.Main(System.String[])