天天看点

Windows下利用WinDBG、OllyDBG进行源码级调试

一般应用程序编译后会创建exe/dll/sys(可执行文件)、pdb(程序数据库)、map(编译信息)等文件,而源码调试需要可执行文件、程序数据库文件、还有源代码文件。(由于符号信息已经写入到程序数据库文件里,如果提到符号文件,一般都是指程序数据库文件)

      我们知道,pdb文件里记录着调试程序所需的所有信息,调试器进行源码调试时,是先通过pdb文件找到对应符号的源文件所在位置,并定位当前代码在源文件里的位置,显示到调试器里。所以,使用调试器源码调试时,必须保证以下几点,才能正确调试:

        1.文件版本统一。可执行程序、程序数据库文件还有源码文件必须是同一工程同一时刻编译所生成的。

        2.设置符号文件路径。确保调试过程中所有模块的符号文件齐全并在调试器里正确设置符号文件路径。

        3.设置源文件路径。必须把源码文件放到程序数据库文件所记录的目录下(编译时,源文件所在目录),或者通过调试器设置源码文件所在目录(如果调试器支持)。

默认情况下,调试器会在可执行模块所在目录搜索程序数据库文件,如果没有找到才到其他目录搜索。源码文件路径则通过程序数据库文件来获取。WinDBG和OllyDBG都支持重新设置符号文件路径,并通过微软符号文件服务器查找系统模块的符号文件。源码文件的路径WinDBG支持自定义而OllyDBG则不支持,只能将源码文件放置于工程编译时的目录下。

        WinDBG设置符号路径的方法:

        1.打开WinDBG通过图形界面菜单上File->Symbol File Path(ctrl+s)来设置,路径间隔用分号隔开。如:srv*;D:\MySymbols;E:\SystemSymbols

        2.打开WinDBG在command browser(命令窗口)里通过输入命令来设置。命令如下:

        a.清除符号路径并设置为微软符号文件服务器.symfix。也可顺便添加上自己本地符号路径.symfix+ xxx。

        b.查看当前的符号文件路径.sympath。

        c.追加路径.sympath+ xxx。

        如果调试项目正在运行,设置完符号文件路径后还不能正常解析,则需要输入.reload命令来重新导入符号。其他符号相关命令可查阅WinDBG帮助。

        WinDBG设置源码文件路径的方法:

1.打开WinDBG通过图形界面菜单上File->Source File Path(ctrl+p)来设置,路径间隔用分号隔开。如:D:\MySources;E:\Project

2.打开WinDBG在command browser(命令窗口)里通过输入命令来设置。命令如下:

查看当前的源码文件路径.srcpath。

追加路径.srcpath+ xxx。

 如果调试项目正在运行,设置完源码文件路径后还是不能显示源代码,先检查图形界面上Debug->Source Mode是否启用,之后再输入.reload来刷新。

        OllyDBG设置符号路径的方法:

        打开OllyDBG通过图形界面上Debug->Select Path For Symbol来设置。

        OllyDBG设置源码文件路径的方法:

        由于OllyDBG不支持自定义源码文件路径,所以只能把源码文件放置于工程编译时的所在目录(程序数据库文件里记录的就是这个目录),如果工程不在一台计算机上,可以创建相同目录来存放源码。

当程序暂停于源码所在区域时OllyDBG图形界面上View->Source能显示当前源码文件,View->Source Files能显示所有源码文件。当源码窗口打开后,WinDBG和OllyDBG都能在源码窗口里设置断点或者单步执行了。

一般应用程序编译后会创建exe/dll/sys(可执行文件)、pdb(程序数据库)、map(编译信息)等文件,而源码调试需要可执行文件、程序数据库文件、还有源代码文件。(由于符号信息已经写入到程序数据库文件里,如果提到符号文件,一般都是指程序数据库文件)

      我们知道,pdb文件里记录着调试程序所需的所有信息,调试器进行源码调试时,是先通过pdb文件找到对应符号的源文件所在位置,并定位当前代码在源文件里的位置,显示到调试器里。所以,使用调试器源码调试时,必须保证以下几点,才能正确调试:

        1.文件版本统一。可执行程序、程序数据库文件还有源码文件必须是同一工程同一时刻编译所生成的。

        2.设置符号文件路径。确保调试过程中所有模块的符号文件齐全并在调试器里正确设置符号文件路径。

        3.设置源文件路径。必须把源码文件放到程序数据库文件所记录的目录下(编译时,源文件所在目录),或者通过调试器设置源码文件所在目录(如果调试器支持)。

默认情况下,调试器会在可执行模块所在目录搜索程序数据库文件,如果没有找到才到其他目录搜索。源码文件路径则通过程序数据库文件来获取。WinDBG和OllyDBG都支持重新设置符号文件路径,并通过微软符号文件服务器查找系统模块的符号文件。源码文件的路径WinDBG支持自定义而OllyDBG则不支持,只能将源码文件放置于工程编译时的目录下。

        WinDBG设置符号路径的方法:

        1.打开WinDBG通过图形界面菜单上File->Symbol File Path(ctrl+s)来设置,路径间隔用分号隔开。如:srv*;D:\MySymbols;E:\SystemSymbols

        2.打开WinDBG在command browser(命令窗口)里通过输入命令来设置。命令如下:

        a.清除符号路径并设置为微软符号文件服务器.symfix。也可顺便添加上自己本地符号路径.symfix+ xxx。

        b.查看当前的符号文件路径.sympath。

        c.追加路径.sympath+ xxx。

        如果调试项目正在运行,设置完符号文件路径后还不能正常解析,则需要输入.reload命令来重新导入符号。其他符号相关命令可查阅WinDBG帮助。

        WinDBG设置源码文件路径的方法:

1.打开WinDBG通过图形界面菜单上File->Source File Path(ctrl+p)来设置,路径间隔用分号隔开。如:D:\MySources;E:\Project

2.打开WinDBG在command browser(命令窗口)里通过输入命令来设置。命令如下:

查看当前的源码文件路径.srcpath。

追加路径.srcpath+ xxx。

 如果调试项目正在运行,设置完源码文件路径后还是不能显示源代码,先检查图形界面上Debug->Source Mode是否启用,之后再输入.reload来刷新。

        OllyDBG设置符号路径的方法:

        打开OllyDBG通过图形界面上Debug->Select Path For Symbol来设置。

        OllyDBG设置源码文件路径的方法: