我们在编写程序的过程中,调试是必不可少的步骤,使用vs所带的调试器,即强大也好用,但是对于一般的exe程序,项目中通常只有一个主程序,也就是我们编写的,这样的程序可以具有自己独立的虚拟地址空间,可以独立运行,那么我们在代码中加入断点,调试运行的时候,当运行到断点处的时候,程序就会停止在代码处。通过调试,一方面我们可以知道程序执行的顺序,另一方面可以发现内存存取的错误,或是参数不对等造成的错误,帮助我们及时的纠正,但是对于动态链接库,DLL,它也是一个可执行程序,但是它没有自己独立的虚拟地址空间,在运行的时候,是吧自己的地址映射到exe的虚拟地址空间中,进行执行调用。既然,他不能直接执行,那么如果我们建立一个DLL工程,建立一个DLL项目,又如何才可以加入断点,调试运行呢?下面我就结合实例讲述一下如何调试DLL。
DLL不能单独的执行,所以我们必须要建立一个可执行程序项目,通过这个项目来调用我们编写DLL。一般情况下,如果我们是先编写了DLL项目,那么我就可以再在这个项目解决方案中添加一个新建项目,添加一个新建项目的过程和我们建立普通项目是一样,不一样的是,平时我们利用向导建立项目的时候,只有一个解决方案,一个解决方案中只有一个项目,而在这里是一个解决方案中两个项目;如果我们是先编写了一个可执行程序,也可以通过上面说的方法,在现有的解决方案中添加一个新的项目,建立一个DLL项目。不管如何做,就是要让DLL项目和测试DLL的可执行程序在同一个解决方案中。如下图:
其中caputer是测试DLL的程序,hookproc是DLL程序
接着我们要在测试dll的程序中引用dll程序,也就是引用hookproc项目,在capture项目上(上图)点右键,选择引用菜单项。得到如下图显示:
一般情况下,这里的这个“框架和引用”选项是空的,我们在这里选择添加引用,在添加引用中,我们就可以看到我们刚才的hookproc项目了,我们选择这个项目,点击添加,上图是已经添加好的引用的结果图,就是这样的。这样,dll项目已经被测试dll(caputer)项目引用了,这个时候,我们就像使用普通的dll的步骤一样,准备将在caputer代码中使用了,如添加头文件,lib,加载dll等等,普通的dll的使用方法,不是本文说明的重点,如下图,我将dll加载到测试程序中:
这里我使用的是显式加载方式,这时候,我们还要设置的一个就是设置启动项目,因为我们的解决方案中有两个项目,我们必须要设置一个默认的启动项目,也就是当我们点击编译器窗口上的调试运行的操作的时候,运行哪一个项目。这里我们当然设置测试程序为启动项目,方法是在测试程序(caputer)上点击右键,选择“设为启动项目”。好了,我们现在点击类视图,点击hookproc项目,打开cpp文件,在当中插入一个断点,调试运行,如下图:
我们看到,进入dll(hookproc)项目的代码中,和我们平时调试程序的时候没什么两样了。这样我们就可以完成对动态链接库的调试了
/
附:
上面所讲的在一个解决方案中添加多个项目,对于编写多模块的程序,进行编写和调试都是很有用,而且对程序部署的时候,也是要用到这样的一种方式,在已经编写的程序中,添加新项目,在当前的解决方案中加入程序部署模板,来进行程序部署。更多信息,参考msdn。