深入服务器端的Visual C++代码 在服务器端调试Microsoft Visual C++?代码比VB要容易得多。Visual C++让你能够连接到正在运行的进程中,所以你只要连接到需要调试的DLL运行所在的进程,你就可以设置断点,单步调试等等。但也有一些要注意的地方,让我们来看一下其中一部分问题。
通常可以通过菜单操作,将Visual C++调试程序连接到运行的进程中去。在Visual C++编程环境中,选择Build,在选择Start Debug,然后再选Attach to Process。你可以看到Attach to Process对话框(见图一)并选择要调试的进程。一旦你连接上了,就可以打开源文件并设置断点,假如你的EXE或DLL的调试版本是在该进程中运行的,而且有debug symbol。
问题一:在对话框中没有进程列出!这是Microsoft Visual Studio? 6.0 SP3或更早版本中的bug,请使用SP4或更高版本。另一个方法是,请确定Visual C++是你的默认调试器,然后在任务管理器中点击右键,选中想要调试的进程并从弹出菜单中选择Debug。
问题二:对话框只显示了桌面上运行的程序!请确认你选中了Show System Processes。
问题三:我应该连接到什么进程?如果你有一个组件在IIS中使用(就像SOAP Toolkit 2.0中DLL组件),它们默认运行在dllhost.exe进程中。不幸的是,也许会有很多这样的进程,你就不知道你的DLL到底运行在哪一个之中了。如果你刚刚启动了一个dllhost.exe实例,想要调试,它会在Visual C++的Attach to Process对话框中列在最上面。如果你的应用程序已经运行了一段时间了,通常你可以通过任务管理器中Processest标签下查看你一个DLLHOST版本占用了大量内存和CPU,以次猜测出是该进程。但是,如果你想要精确的知道你的DLL运行在哪一个进程中,你可以使用tlist.exe这个工具,通过安装在Windows 2000的光盘中\Support\Tools目录中的支持工具就可以得到它。然后,你在命令行中可以输入:
来得到加载了你的DLL的进程列表。你可以辨识出相应的dllhost.exe实例,然后连接上去。如果你的Web Service 运行所在的虚拟目录的应用程序安全性设置为低,它会在IIS的主进程inetinfo.exe中运行,而不是dllhost.exe。
我们开发Favorites Service时遇到的一个重要问题就是调试SSFKeyCache服务,它不在IIS进程或者DLLHOST进程之中。我们用ATL将SSFKeyCache创建为系统服务。当你在调试模式下编译COM server系统服务工程时,它被注册为普通进程外COM server。如果问题只发生在第一次调用COM server的时候就没有什么问题,但是如果像我们在SSFKeyCache中那样要保留调用中的信息,你必须将它驻留在内存之中。因此,为了调试它,我们将SSFKeyCache编译为调试版本,然后将其重新注册为普通系统服务。在命令行中运行:
然后,我们手工启动这个服务。请在命令行运行:
这样我们才能用Visual C++连接到运行的进程中,设置断点等等。如果不必要捕捉到SSFKeyCache组件第一个实例的创建,我们可以等待其他的调用,服务会自行启动的。