WinDbg入门教程(2)-各种调试场景介绍

翻译 2007年10月11日 16:26:00

调试场景

远程调试

使用WinDbg进行远程调试是很容易的,而且有很多种可行的方法。在下文中,调试服务器指的是运行在你所要调试的远程机器上的调试器。调试客户端指的是控制当前会话的调试器。

·         使用调试器:你需要CDB, NTSD或者WinDbg已经安装在远程机器上。WinDbg客户端可以连接到CDB, NTSD或者WinDbg中的任何一个作为服务器,反之亦然。在客户端和服务器直接可以选择TCP或者命名管道作为通讯协议。

o   在服务器端的启动过程:

§  WinDbg –server npipe:pipe=pipename(注:可以允许多个客户端连或

§  WinDbg内部: .server npipe:pipe=pipename(注,连接单个客户端)

你可以用多种协议开启不同的服务会话。并且可用密码来保护一个会话。

o   从客户端连接:

§  WinDbg -remote npipe:server=Server, pipe=PipeName[,password=Password]

§  WinDbg内部: File->Connect to Remote Session: for connection string, enter npipe:server=Server, pipe=PipeName [,password=Password]

·         使用Remote.exe: Remote.exe使用命名管道作为通讯的方式。如果你使用的是一个命令行接口的程序,比如KD,CDB或者NTSD。你可以使用remote.exe来远程调试。注意:使用@q(不是q)来退出客户端,不用关掉服务端。

o   要启动一个服务端:

§  Remote.exe /s “cdp –p <pid>” test1

o   从客户端连接:

§  Remote.exe /c <machinename> test1

上面的test1是我们所选择的命名管道的名字。

服务端会显示那个客户端从那个服务器连接以及执行过的命令。你可以使用‘qq’命令来退出服务端;或者使用File->Exit来退出客户端。另外,如果要进行远程调试,你必须属于远程机器的”Debugger User”组并且服务器必须允许远程连接。

即时调试

WinDbg的文档的”Enabling Postmorten Debugging”部分对此有很详细的讨论。简而言之,你可以把WinDbg设置成默认的即时调试器,命令就是:Windbg –I。这个命令实际上是把注册表中 HKLM/Software/Microsoft/Windows NT/CurrentVersion/AeDebug的键值设置成WinDbg。如果要把WinDbg设置成为默认的托管调试器,你需要显示设置如下的注册表键值:

  • HKLM/Software/Microsoft/.NETFramework/DbgJITDebugLaunchSetting 设置成 2
  • HKLM/Software/Microsoft/.NETFramework/DbgManagedDebugger 设置成Windbg.(注意其中的启动参数设置)

通过JIT的设置,当一个应用程序在不是调试的状态下抛出了未处理的异常之时,WinDbg就会被启动。

64位调试

所有这些调试器均支持在AMD64IA64上的64位调试环境。

托管应用程序的调试

WinDbg 6.3以后的版本支持在Widbey(VS2005.net 2.0的内部开发代号) .net CLR托管调试。在文档中针对托管调试有很好的讨论。需要注意的是,对于托管程序来说,没有刚才所说的PDB(译注:托管代码实际上也是有PDB的,但是这个PDB实际上记录了C#代码和IL代码的对应关系以及相关的一些信息)的概念,因为所有的程序都是编译成为ILASM。调试器通过CLR来查询所需的附加信息。

有几点需要注意:

你只能在托段函数的代码被执行过至少一次之后才能设置断点。只有这样它才能被编译成汇编代码。记住以下的几点:

·         关于函数的地址的复杂化以及对应的断点设置:

o   CLR有可能丢弃已经编译好的代码,所以函数的入口地址有可能改变。

o   同样的代码有可能被多次编译,如果多个应用程序域没有共享这段代码的话。如果你设置了一个断点,它就会被设置在当前线程(译注:CLR的逻辑线程)所在的应用程序域内。

o   泛型的特殊实例可能导致同一个函数有不同的地址。.

·         数据存储布局的复杂化以及对应的数据检查:

    • CLR可能会在运行的时候任意改变数据的存储布局,所以一个结构体成员的偏移量可能会被改变掉. (译注:实际上是在一个类型被加载的时候决定的数据布局,之后是不会改变的。)
    • 一个类型的信息是在第一次使用的时候被加载,所以你可能不能够查看一个数据成员如果它还没有被使用过.

·         调试器命令的复杂化

o   当跟踪托管代码的时候,你会需要穿越大段的CLR自己的代码比如JIT编译器的代码,原因可能是你第一次进入一个函数,或者是你在托管和非托管代码之间进行切换。

调试Windows服务

使用WinDbg,你可以像调试其它应用程序那样调试Windows服务程序。即可以通过附加进程的方法启动Windows服务,也可以把WinDbg当作一个即时调试器,并且在代码中调用DbgBreakPoint 或者 DebugBreak,或者在x86机器上加入一条int 3汇编指令。

调试异常

一个调试器会得到两次的异常通知-第一次在应用程序有机会处理异常之前(‘first chance exception’);如果应用程序没有处理这个异常,这时候调试器就会有机会来处理异常(‘second-chance exception’)。如果调试器没有处理二次机会的异常,应用程序就会退出。

.lastevent或者,!analyze –v命令会给你显示异常的记录以及异常抛出所在函数的堆栈跟踪信息。

你也可以使用 .exr, .cxr以及 .ecxr命令来显示异常和上下文记录。同时需要注意的是,你也可以改变first-chance的处理选项。对应的命令就是: sxe, sxd, sxnsxi

源地址

上一篇  WinDbg入门教程(1)-调试器的基础知识  

下一篇- WinDbg 入门指导(3)-WinDbg中常用的功能以及设置 

[调试]_[初级]_[Windbg使用教程]

windbg使用教程
  • infoworld
  • infoworld
  • 2014年11月28日 10:34
  • 1595

Windbg调试程序

Windbg调试程序 WinDbg是微软开发的免费源码级调试工具。Windbg可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。由于大部分程序员不需要做Kernel...
  • aoebug
  • aoebug
  • 2016年07月22日 21:39
  • 242

WINDBG使用教程

什么是WinDBG? WinDbg是微软开发的免费源码级调试工具。下载地址为:http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx...
  • wishfly
  • wishfly
  • 2010年05月18日 18:04
  • 9077

WinDbg详细教程

  • 2011年02月15日 11:28
  • 10.02MB
  • 下载

【转】windbg 调试经典文章(常用)

Here we go again: it is snowing in Milan while I am publishing a new blog post . Admittedly, this co...
  • fishmai
  • fishmai
  • 2016年08月31日 21:13
  • 790

windbg调试服务程序

相比通过输出日志来跟踪程序运行状态,我更倾向使用调试器。虽然我早知调试服务很麻烦,总不会比调试驱动还麻烦吧?基于这个想法,我尝试了在win7上使用windbg调试服务并记录于此。     window...
  • lixiangminghate
  • lixiangminghate
  • 2016年12月28日 15:57
  • 1378

WinDbg入门教程

WinDbg 入门教程介绍在我的职业生涯中,我看到我们大多数都是使用Visual Studio来进行调试,而不是用其它许多免费的调试器。你可能有许多理由来使用这样的调试器,比如,在你家里的机器上没装开...
  • haoxing168
  • haoxing168
  • 2009年09月12日 13:03
  • 33132

[转载]windbg简明教程

[转载]windbg简明教程文章作者:Sucsor on 2006.06.11     Windbg是Microsoft公 司免费调试器调试集合中的GUI的调试器,支持Source和Assembly...
  • ZibbaForever
  • ZibbaForever
  • 2008年03月05日 17:28
  • 9461

WinDbg调试unity3d无响应实战

今天终于让我碰上了,无响应了,毫无疑问,马上放下一切工作,Attach上去。     首先看下任务管理器,cpu 13% ,应该是死循环了。(注意 win7死循环是不会cpu 100%的)。   ...
  • yxriyin
  • yxriyin
  • 2015年02月02日 18:43
  • 1607

windbg 通过网络联机调试配置

Setting Up Kernel-Mode Debugging over a Network Cable Manually 05/23/2017 9 minutes to read Contr...
  • a3125504x
  • a3125504x
  • 2017年11月01日 16:19
  • 94
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WinDbg入门教程(2)-各种调试场景介绍
举报原因:
原因补充:

(最多只允许输入30个字)