使用windbg调试简单的cpp源文件

学习笔记文。

懒得装VS,下了500M左右的win7+dotNet4.0版本的WinSDK写个小程序。

编码好的文件是C:\src\foo.cpp。

在C:\dbg\下使用cl /EHsc /Zi C:\src\foo.cpp编译出foo.exe,以及vc100.pdb和foo.pdb;/Zi选项是开启调试信息,也就是导致生成了这两个windbg需要使用的pdb符号文件,其中甚至包含了foo.cpp的路径;/EHsc是cl提示让我加上的,可能跟异常处理有关系。

首次启动windbg。

光有v100和foo的pdb文件是不够的,一般的程序最少需要ntdll.dll和kernel32.dll,而且程序引导起来到达main()之前,很多代码都在这些系统dll里,所以我们至少还需要这两文件的pdb文件。windbg可以自动去微软网站下载它们,但是需要我们稍微引导一下。直接File->Open Executable打开foo.exe,Command窗口弹了出来,并且提示没有ntdll的符号文件,依次键入以下命令(附带说明):

写道
!sym noisy - Activates noisy symbol loading so that when the debugger loads symbols you get more details like exactly where the symbol was loaded.

!symfix c:\symbols (or .symfix) - Sets the symbol path to point to Microsoft symbol store. I specified c:\symbols to store downloaded symbols there.

.reload /f ntdll.dll and .reload /f kernel32.dll - Since when this debug session starts I didn’t have proper symbol path set, symbols for these two modules were not loaded. After I set the symbol path with !symfix, I’m manually reloading the symbols for these two modules. This is not necessary in this specific case but in general it’s a good practice to have symbols for these two modules.

 然后这几个系统dll的pdb文件就会下载到C:\symbols里面了,这在以后调试别的工作的时候也可以直接利用它们。

 

为了方便说明,这时候退出windbg,重新打开。以后调试其他的程序,可以跳过上面的步骤。

FIle->Symbol File Path,设置为C:\symbols和C:\dbg;File->Source File Path,设置为C:\src;File->Image File Path,设置为C:\dbg。

File->Open Executable打开foo.exe(这次就不会像上次那样小时ntdll没有符号文件之类的警告了)。

File->Open Source File打开foo.cpp,打上断点,就可以调试,简单的操作跟VS类似,当然,真正强大的还是在命令窗口敲命令,例如显示一个std::vector bar,可以用dt bar这样的命令。

 

另外windbg还提供了workspace的概念来保存你的调试工作。

还有,为了得到更多的调试信息,可以尝试用这样的参数编译foo.cpp:

cl /EHsc /Zi /MTd /DDEBUG main.cpp

你可能感兴趣的:(cpp)