现在把VC6各种调试方法总结一下以备忘。牛人精通此道,却懒得浪费时间去写这些东西,因为在他们看来,这些调试方法简直就像吃饭要懂得用筷子一样自然。但是,新手通常会碰到这样的情况,不知道从何下手去调试自己以前从未调试过的程序类型或模式。我在这里把VC6的常用调试方法进行总结,希望能对大家有所帮助。
1.本地调试
1.1普通exe调试
这个实在没什么好说的,只要写过程序肯定都懂的,只要下好断点(F9)后,调试运行(F5)即可。需要说明一下的是,在调试过程中,点右键,做如下选择:
即可显示汇编代码,如下:
此时如果做如下选择(Code Bytes):
即可显示汇编代码对应的机器码,这在编写shellcode的时候是很有用处的。显示如下:
注意到以下这个浮动工具条了没有?
选择上面的窗体显示按钮,可以显示内存的数据、寄存器的数值、调用栈情况、变量值等各种各样对我们很重要的信息。如果熟悉了这些,这会使你在调试的时候事半功倍。
上面提到的这些并不是仅限于本地调试exe,这些在VC6的各种调试中都是可使用的、通用的。
1.2 DLL调试
因为DLL不能单独运行,所以必须运行一个EXE程序来加载这个DLL,这样才可以调试。在DLL没有被加载起来之前,是无法在源代码上下断点的。在你的DLL工程里,打开“Project Settings”对话框并切换到“Debug”标签,如下:
在“Executable for debug session”栏里填上加载你的DLL运行的EXE程序完整路径,并在“Working directory”填上该EXE程序的工作目录,一般填EXE所在的目录即可调试。
如何让EXE加载你的DLL?
1.如果这个EXE程序本来就会调用到你的DLL,这样在EXE的输入表就会有你的DLL,或者LoadLibrary你的DLL,如果是这种情况,只要直接调试即可。
2.如果一个EXE并没有调用到你的DLL,你又想通过这个EXE来加载你的DLL调试,那么只要编写一个或下载一个工具把DLL注入到这个EXE进程里即可调试。
1.3 ActvieX调试
ActvieX控件文件后缀有两种:dll和ocx,其实都是dll文件,因此ActvieX调试其实就是一个dll调试。当我们编写完一个ActvieX控件的时候,可以使用VC自带的工具“ActiveX Control Test Container”来测试和调试,不过这里我们说的是用IE浏览器来调试。
假如我们编写的ActiveX有一个Mytest的函数,如下:
我们现在来调试它。编写这样一个内容的HTML文件:
<html> <head> <title> ActiveX Test </title> </head> <body> <object classid="clsid:BE716250-09F6-4BBB-8850-5842D68B0C76" name="evil" width=0 height=0></object> <script> evil.Mytest(); </script> </body> </html> |
其中红色部分是这个ActiveX控件的CLSID和要调试的函数。
先设置如下:
OK后,下断点,调试运行(F5)。IE出来后,用它打开我们那个HTML文件,即可调试ActiveX控件。
1.4 Attach到进程调试
有时候一个程序已经运行起来了,但我们又不想把它关掉以后再启动调试。这时我们可以直接挂接到该进程调试。如果你没有该程序的源代码,那只有调试汇编了;如果你有,那需要你在VC中手动打开源代码文件。首先,做如下选择:
在弹出的窗体中列出了运行中的进程,如果你要把包括系统进程在内的所有进程都显示出来,那么勾选下面那个复选框。在这里,选中你要调试的进程,如下:
点OK后,VC已经处于调试该进程的状态了,这时你在VC中打开这个程序的源代码(假如有源代码,没有就不用,直接看汇编吧),即可下断点调试。
1.5 ISAPI调试
不知道ISAPI是什么?ISAPI是微软提供的一种CGI技术。在VC中提供了ISAPI的编写向导,如下:
如果想知道关于ISAPI的更详细的信息,自己搜索一下。
以下说说ISAPI在win2003的调试步骤。
方法1:
1. 把编写好的ISAPI文件(DLL文件)放到WEB目录下,我放到C:/inetpub/wwwroot/myisapi.dll。
2. 修改如下设置:
3. 添加一个“WEB 服务扩展”,并设置为“允许”,如下所示:
步骤1~3只是为了使我们的WEB支持ISAPI。现在看看ISAPI的运行结果,如下:
4. 现在我们开始调试,用VC Attach到进程w3wp.exe(我们的ISAPI DLL被这个进程加载),如图:
5. 确定后,在VC里打开这个ISAPI的源代码文件,设置断点,调试,如图:
Tips: 如果w3wp.exe还没有加载ISAPI DLL,在这里是下不了断点的。还记得我们在步骤3激活过ISAPI了吗?是的,那时我们访问了ISAPI,看到ISAPI的输出结果了,这说明ISAPI已经被加载起来了,所以这里可以下断点。 |
方法2:
方法1调试的前提条件是ISAPI已经被加载起来了。因此,方法1不能调试ISAPI刚刚加载的时候进行的各种初始化工作,只能调试运行过程中会调用到的函数和过程。那怎么调试ISAPI被加载时进行的初始化过程呢?请看下面。
在方法1步骤3时可不激活ISAPI(只要不访问http://localhost/myisapi.dll即可)。在方法1的步骤4和步骤5之间插入这么一步工作:
在“工程”---“设置”---“调试”里面设置如下:
增加这点就可以了,呵呵。看看下面,可以调试构造函数了:
在2000里面调试ISAPI和2003下基本上是一样的。只需注意以下几点即可:
1.“应用程序保护”选择“中”,如下:
2.在2000里面没有步骤3
3.在步骤4中把“w3wp.exe”换成“dllhost.exe”,这个是要特别注意的,在2000里面加载ISAPI的进程是dllhost.exe。
2.远程调试
这里举普通的exe为例,其他DLL调试,ISAPI调试、ActiveX调试等只要参考本地调试再结合一下就可以了。
在远程机子上建立一个文件夹并共享出来,允许网络用户读取和更改,如下所示:
在VC中Link标签里设置如下:
就是把文件生成到远程机子(192.168.1.106)的共享目录里。然后在Debug标签设置如下:
注意“Remote executable path and file name:”栏的设置,这里填的是远程机子的绝对路径。因为这个字符串会被传到远程调试工具,由远程调试工具执行这个字符串创建进程(也就是要调试的程序)。
现在把远程调试工具放到远程机子上,目录不限。远程调试工具的文件如下所列,都是VC自带的。
好,运行那个exe文件,点击”connect”按钮,结果如下:
Tips: 1. 别看远程调试工具“Visual C++ Debug Monitor”的那个按钮写着“Connect”,就以为它是connect,别被它忽悠了,实际上它是listen本地监听端口,等待VC来连接它。当我们点击“Disconnect”时是停止监听端口。 2. “Visual C++ Debug Monitor”的那个setting按钮可以设置目标地址和调试密码,但我没发现有什么作用。装饰用? |
现在可以用VC连过去了。选择如下:
出现如下对话框,选择“Network(TCP/IP)”:
点击setting按钮,在弹出的对话框输入远程机子的IP地址,如下:
OK后,即可开始调试(F5)。
你可以看到,在远程机子上运行起来了你要调试的程序: