65.9K
CodeProject 正在变化。 阅读更多。
Home

WinDbg 使用快速入门

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.71/5 (20投票s)

2007 年 12 月 19 日

CPOL

3分钟阅读

viewsIcon

142087

downloadIcon

691

为新手准备的 WinDbg 使用分步教程。

引言

WinDbg 是一个功能强大且易于使用的调试器。它提供了图形用户界面和命令提示符接口。安装包轻巧,可以快速安装在目标机器上。

我注意到,初次使用 WinDbg 的用户会感到困惑。用户需要指向源文件、PDB 文件和可执行文件的正确位置,然后才能使用 WinDbg 进行调试。对于除了 Visual Studio 之外调试经验很少的新手来说,它不是非常直观。在这个简短的演示中,我想通过图片,详细地一步一步展示如何为您的调试目的设置 WinDbg。

安装

首先,需要安装调试工具的 MSI 包。最新的 MSI 包可以从Microsoft 网站获取。

您可以下载并安装几个 MSI 包,选择 32 位或 64 位版本并下载最新版本。安装完成后,您可以从“开始”菜单启动 WinDbg。

Screenshot - 1.jpg

示例程序

现在,让我们创建一个小的 C++ 程序来计算 GCD(最大公约数)。

文件 main.cpp

#include <stdio.h> 
#include <stdlib.h> 

int calculateGCD(int a, int b); 
void printHelp(); 

int main( int argc, const char* argv[] ) 
{ 
    int numA, numB, gcd; 

    if (argc != 3) 
    { 
         printHelp(); 
         return -1; 
    } 
    
    numA = atoi( argv[1] ); 
    numB = atoi( argv[2] ); 

    if(numA == 0 || numB == 0) 
    { 
         printf("Wrong input format, see help"); 
         printHelp(); 
         return -1; 
    } 
    
    // Make sure that numA is not less then numB 
    // otherwise change them places 
    if (numA < numB) 
    { 
        numA = numA ^ numB; // 0^1 = 1, 0^0 = 0, 1^1 = 0, 1^0=1; 
        numB = numA ^ numB; 
        numA = numA ^ numB; 
    } 

    gcd = calculateGCD(numA, numB); 
    printf("Common divisor is: %d", gcd); 
    return 0; 
} 

int calculateGCD(int biggerNum, int smallerNum) 
{ 
    int remainder = biggerNum % smallerNum; 
  
    if (remainder == 0) 
      return smallerNum; 
  
    return calculateGCD(smallerNum, remainder); 
} 

void printHelp() 
{ 
     printf("This tool calculates a common greatest divisor"); 
     printf("Usage: comdiv integerNumberA integerNumberB"); 
}

现在,以调试模式编译并构建它,这样您就可以获得 comdiv.execomdiv.pdb 文件。让我们将这些文件以及源文件 main.cpp 放入一个专用文件夹,例如 C:\windbgtest

Screenshot - 2.jpg

WinDbg

现在,让我们从“开始”菜单启动 WinDbg。

Screenshot - 3.jpg

现在,为了开始调试,我们需要将 WinDbg 指向符号文件 comdiv.pdb、源文件 main.cpp 以及可执行文件 comdiv.exe

转到“文件”->“符号文件路径”,并在对话框中指定 C:\windbgtest

Screenshot - 4.jpg

对“文件”->“源文件路径”和“文件”->“映像文件路径”执行相同的操作。

现在,转到“文件”->“打开可执行文件”,并在对话框中指定 comdiv.exe 文件。

Screenshot - 5.jpg

还可以像图片中那样指定参数。这将使 comdiv.exe 找到 18 和 24 的 GCD。单击“打开”按钮后,对于弹出的建议保存工作区信息的对话框,请按“否”(这并不重要)。

此时,您将看到 WinDbg 已创建 comdiv.exe 进程。

Screenshot - 6.jpg

现在,WinDbg 刚刚创建了运行 comdiv.exe 的进程,但尚未运行它。因此,此时,您可以设置断点。

让我们在 WinDbg 中打开源文件 main.cpp 并在那里设置断点。转到“文件”->“打开源文件”,并在那里指定 C:\windbgtest\main.cpp

Screenshot - 7.jpg

单击“打开”后,您将看到您的源代码。

Screenshot - 8.jpg

现在,将光标放在第 11 行(“if (argc != 3)”)上,然后按 F9(或单击工具栏中的“手”图标)。

您可能会看到这个对话框弹出。

Screenshot - 9.jpg

如果看到这个对话框,请按“是”,您将设置好断点。

Screenshot - 10.jpg

现在,红线表示您的断点已设置并准备被命中。

按 F5 运行程序,它将在您的断点行处中断(您会看到红线变为粉红色)。

Screenshot - 11.jpg

现在,您可以使用工具栏或标准的 F* 键单步执行源代码:F10 - 步过,F11 或 F8 - 步入,依此类推。

“视图”和“调试”菜单中有许多标准的调试命令,只需探索并尝试它们。

您还可以将鼠标悬停在局部变量上并查看它们的值(如下图所示;您还可以看到当前执行点,它以蓝色高亮显示)。

Screenshot - 12.jpg

现在,您已经全部准备就绪!

© . All rights reserved.