`

【windbg】用WinDbg探索ruby的奥秘

阅读更多
写这篇文章是受从main.c开始走进Ruby-登上调试Ruby之旅》的启发,不同的是该文章用的是GDB,GDB虽然很强大,但是毕竟是命令行,在调试的时候,可能同时需要查看许多信息,比如call statck,汇编代码,源代码等等,命令行就有点力不从心,所以续写一篇,改GDB为同样强大的windbg,以便更方便的探索Ruby的内部奥秘。

这里的主旨不是ruby,而是针对Windbg的调试技巧,所用的方法同样适用于其他C/C++应用,ruby在这里只是做实验用的小白鼠。

从编译开始

要进行源码调试,必须让编译器或链接器在构建二进制文件时生成符号文件(.pdb文件)。这些符号文件保存了二进制指令和源码行之间的对应关系。

另外,调试器必须能够访问源码文件,因为符号文件中并不包含实际的源代码文本。

如果这些都满足,编译器和链接器还不能对代码进行优化。如果代码经过优化,在源码调试时访问局部变量会变得很困难,有时候几乎是不可能的。如果使用Build 实用程序作为编译器和链接器,可以将MSC_OPTIMIZATION 宏设置为/Od /Oi 来避免优化。

ruby编译过程可以参考:这篇文章
不同的是需要修改下ruby的makefile以便输出debug信息。
CFLAGS = /Od -MD $(DEBUGFLAGS) $(OPTFLAGS) $(PROCESSOR_FLAG) /DEBUG /Zi
LDFLAGS = $(LDFLAGS) -manifest /DEBUG


指定 /ZI 或 /Zi 而不指定 /Fd 时,VC++最终将生成两个 PDB 文件:
  • VCx0.PDB (其中 x 表示 Visual C++ 的版本。)该文件存储各个 OBJ 文件的所有调试信息并与项目生成文件驻留在同一个目录中。
  • project.PDB   该文件存储 .exe 文件的所有调试信息,它包含了调试中需要用到的各种数据,例如:全局变量、本地变量、函数名、函数类型、源代码行、程序入口地址.....,这些所有的东西都叫做Symbol。


PDB文件说明
PDB文件全称是程序数据库 (PDB) 文件,它保存着调试和项目状态信息,使用这些信息可以对程序的调试配置进行增量链接。

每当创建 OBJ 文件时,C/C++ 编译器都将调试信息合并到 VCx0.PDB 中。插入的信息包括类型信息,但不包括函数定义等符号信息。

链接器将创建 project.PDB,它包含项目的 EXE 文件的调试信息。project.PDB 文件包含完整的调试信息(包括函数原型),而不仅仅是在 VCx0.PDB 中找到的类型信息。这两个 PDB 文件都允许增量更新。

我们知道当应用程序被链接以后,代码被逐一地翻译为一个个的地址,优化以后的代码可能初看起来更是面目全非,如果调试时,充斥着类似NTDLL! 774fe4b6() NTDLL! 774fe489()之类的调用堆栈无疑会增加调试的难度。有了PDB文件之后, 每当我们使用vs或者windbg等微软的调试工具进行调试的时候,我们可以方便地使用变量名来查看内存、可以使用函数名称来下断点、甚至可以指定某个文件的某一行来下断点。

设置WinDbg的符号文件

启动WinDbg,选择菜单的file -> symbols file path,或者按ctrl+s 然后输入
srv*c:\symbols*http://msdl.microsoft.com/download/symbols

按照这样设置,WinDbg将先从本地文件夹c:\symbols中查找Symbol,如果找不到,则自动从MS的Symbol Server上下载Symbols。

你也可以自己去下载MS提供的Windows符号文件,那么symbols file path就直接指向符号文件安装的目录就可以了。

调试器是如何来判别EXE、DLL等是否和一个pdb文件匹配呢?每次我们链接EXE或者DLL或者SYS的时候,链接器都将产生一个唯一的GUID,然后将其写入到PDB和可执行文件。调试器加载的时候将检查两者的GUID,如果一致就表示他们匹配。



如果出现无法加载符号文件的现象,通常是你的符号文件和你调试的二进制不匹配。

由于链接器在其创建的 .exe 或 .dll 文件中嵌入 .pdb 文件的路径,这里不需要在设置ruby的符号文件路径。

我们只需要为WinDbg设置源代码路径,这样可以很方便地查看ruby的源代码。

常见的符号操作
查看符号路径:.sympath
列出加载模块: lm
加载指定模块: ld <module>
重新加载模块: .reload <module>
重新加载所有模块: .reload /n
列出模块详细信息: !lmi <module>!db <module>
显示模块的符号信息: x <module>!<symbols>
查看模块的数据结构: dt <module>!<symbols>

启动应用
Windbg提供了两种方式来启动应用,这里以ruby的irb为例:
open executable:ruby -x "<path>\irb.bat",这时候我们可以很方便地在任何地方设置断点,包括main函数。

也可以运行irb之后,在WinDbg里选择attach to a process, 在列出的进程中选择ruby.exe。



要探索ruby的内部奥秘,最重要的技巧是设置断点,而其中最经常使用的是未定断点。

如果一个断点是设置在某个还未加载的函数名上,则称为延迟、虚拟或未定断点。 (这些术语可交替使用。) 未定断点没有被关联到任何具体被加载的模块上。每当一个新的模块被加载时,会检查该函数名。如果这个函数出现,调试器计算虚拟断点的实际位置并启用它。

在WinDbg里设置断点的几个方法:

bu设置的断点自动被认为是未定断点。如果断点在一个已加载模块中,则会启用并正常生效。但是,如果模块之后被卸载并重新加载,这个断点不会消失。而使用bp设置的断点会立即绑定到某个地址。 如果bp的断点地址在某个已加载模块中找到,并且该模块之后被卸载,则该断点会从断点列表中移除。bm断点用法如同bu,但是bm可以支持正则表达式,用于设置多个断点。

在WinDbg中设置断点的格式有如下几种:
1. 虚拟地址:即给出直接地址,如 12345678
2. 函数偏移量:如DriverEntry+5c.
3. 源代码+行数 :`[[Module!]Filename][:LineNumber]`
4. 可以对模块中的某个类的方法设置断点。


查看ruby入口点
ruby是个c编写的应用,通常入口点就是main函数,用open executable的方式启动irb
在arguments里填写上 -x "<path>\irb.bat"

bu main
g


windbg会捕获main这个函数的调用,并同时显示出main的源代码:





  • 大小: 41.6 KB
  • 大小: 101.2 KB
  • 大小: 105.6 KB
  • 大小: 18.6 KB
分享到:
评论
4 楼 lurker0 2011-10-14  
直接用visualStudio的调试器,使用上比windbg更方便一点。
3 楼 ray_linn 2010-08-20  
谢谢呵,大家共同进步~~
2 楼 CharlesCui 2010-08-20  
http://www.cnblogs.com/juqiang/archive/2010/06/27/1766094.html

这里有几片windbg相关的文章,推荐看一下,作性能调优有用.
1 楼 CharlesCui 2010-08-20  
学习.

软件调试技术真给力,不会这个方法我们很可能永远都只能徘徊在具体实现之外,而不知道其中的真谛.

相关推荐

    Windbg使用详解 Windbg使用详解 Windbg使用详解

    本文将深入探讨Windbg的使用方法、功能特性以及实际应用中的技巧。 一、Windbg的基本操作与界面 Windbg拥有一个简洁而功能强大的用户界面,主要包括以下几个部分:命令行窗口、内存视图、堆栈视图、模块列表、线程...

    windbg使用

    Windbg,全称为Windows Debugger,是一款强大的调试工具,主要用于对Windows操作系统下的应用程序进行调试。...学习和实践是掌握Windbg的关键,建议结合实际项目和风向标插件如WinDbg Preview,不断探索和深化理解。

    Windbg中文调试手册

    - 新用户可以参考“使用Windows调试入门”来开始使用Windbg,而调试内核模式驱动程序的初学者可以尝试“调试通用驱动程序 - ‘逐步操作’实验室(Echo内核模式)”。 **相关工具** - Windows调试工具还包括一系列...

    WinDbg使用手册中文版

    《WinDbg使用手册中文版》是一份详细阐述WinDbg这一强大调试工具的资源,旨在帮助用户深入了解和掌握其功能和用法。WinDbg是Microsoft Windows操作系统下的一个调试工具,广泛应用于系统级调试、内核调试以及应用...

    Windbg教程(简明中文版)

    本教程旨在为用户提供一个简明的 Windbg 教程,帮助用户快速掌握 Windbg 的使用方法和技巧。Windbg 是一个功能强大的调试器,具有极其丰富的功能来支持各种调试任务,包括用户态调试、内核态调试、调试转储文件、...

    Windbg使用手册(IIS)

    Windbg 使用手册(IIS) Windbg 是一种功能强大且广泛应用的调试工具,主要用于捕捉和分析 Windows 操作系统中的崩溃dump文件。 Windbg 使用手册(IIS)旨在指导用户如何使用 Windbg 工具来捕捉和分析 IIS 中的不可见 ...

    windbg工具和winDbg中文使用文档

    本文将深入探讨这两款工具的功能、使用方法以及WinDbg中文帮助文档的相关知识点。 首先,Windbg(Windows Debugger)是一款命令行式的调试器,它允许用户对运行时的系统进行内核级调试,也可以用于用户模式的应用...

    WinDbg与vmware虚拟机调试配置 解决WinDbg与vmware不能连接问题

    此外,还可以进一步扩展,例如添加符号表来提高调试效率(参考链接[1]),或了解更多关于WinDbg命令的使用方法(参考链接[2])。 总之,通过这些步骤,开发人员可以更加高效地进行系统或驱动程序的调试工作,提高...

    Windbg使用详解(全面 实用)

    1. **启动与设置**:Windbg可以通过图形界面或命令行启动,对于初学者,推荐使用图形界面。安装完成后,用户可配置符号路径以加载微软官方的符号文件,这对于调试系统级问题至关重要。 2. **调试会话**:在Windbg中...

    WinDbg 帮助中文翻译

    在这一章中,读者将学习到调试过程的基本步骤,包括分析崩溃转储文件、理解异常处理和调试信息、使用WinDbg进行故障重现。这些都是解决实际问题时的常用技术。 第四章:WinDbg命令 WinDbg的强大之处在于其丰富的...

    windbg64位及汉化包

    汉化补丁的作用是将原本的英文界面翻译成中文,使得不熟悉英文的用户也能方便地使用Windbg。 汉化补丁的使用方法可能会因版本不同而略有差异,但通常包括以下步骤: 1. 关闭已安装的Windbg64程序。 2. 将汉化文件...

    windbg经典中文教程

    Windbg是一款强大的Windows调试工具,由Microsoft开发,广泛应用于系统崩溃分析、驱动程序调试和内存泄漏检测等场景。本教程将带你深入理解...不断探索和掌握Windbg的各种高级特性,将使你在软件调试领域游刃有余。

    windbg适用于win7系统,亲测32位,64位可用

    在本文中,我们将深入探讨Windbg的核心功能、使用场景以及如何在Win7系统上进行配置和使用。 1. Windbg的主要功能: - **崩溃转储分析**:当程序崩溃时,Windbg可以从内存转储文件中分析错误原因,帮助开发者定位...

    WinDBG教程-中文版.pdf

    ### WinDBG教程知识点详解 #### 一、WinDBG概述及特点 **WinDBG**是一款功能极其强大且灵活的调试工具,适用于多种类型...掌握其命令体系、工作空间管理、调试模式选择及上下文控制等内容,是高效使用WinDBG的关键。

    WinDbg-6.11-汉化版

    WinDbg的汉化版使得非英语用户能够更方便地使用这个工具,解决了英文界面对于中文用户可能存在的语言障碍。内置的汉化补丁确保了用户界面和帮助文档的中文显示,使得用户可以更直观地理解和操作各种调试功能。 双机...

    windbg使用帮助.chm

    windbg使用帮助.chm windbg使用帮助.chm 非常经典,软件调试必备

    windbg安装包x86_x64.rar

    Windbg是一款强大的Windows调试工具,尤其在系统级调试和故障分析方面表现卓越。它由Microsoft提供,被广泛用于软件开发、系统管理员以及安全研究人员...理解并熟练掌握Windbg的使用,将极大提升你在IT领域的专业技能。

    windbg调试工具Win10.zip

    总之,Windbg是Windows系统调试不可或缺的工具,无论你是系统管理员、驱动开发者还是普通软件工程师,掌握Windbg的使用都能极大地提升你在故障排查和性能优化方面的技能。通过深入学习和实践,你可以利用它解决各种...

    Windbg ABC && Windbg基本命令 && Windbg详解

    《Windbg详解》一书可能涵盖了更复杂的使用技巧,如使用风bg进行崩溃dump分析、调试驱动程序、跟踪内存泄漏,以及如何结合其他工具(如SOS扩展)进行高级调试。此外,你可能还会学习到如何利用Windbg进行性能分析,...

Global site tag (gtag.js) - Google Analytics