VC6的各种调试

来源:互联网 发布:广州网络远程教育报名 编辑:程序博客网 时间:2024/05/21 18:18

现在把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控件文件后缀有两种:dllocx,其实都是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的更详细的信息,自己搜索一下。

 

以下说说ISAPIwin2003的调试步骤。

方法1

1.       把编写好的ISAPI文件(DLL文件)放到WEB目录下,我放到C:/inetpub/wwwroot/myisapi.dll

2.       修改如下设置:

 

 

 

3.       添加一个“WEB 服务扩展”,并设置为“允许”,如下所示:

 

 

 

 

 

步骤13只是为了使我们的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里面调试ISAPI2003下基本上是一样的。只需注意以下几点即可:

1.“应用程序保护”选择“中”,如下:

 

 

 

2.2000里面没有步骤3

3.在步骤4中把“w3wp.exe”换成“dllhost.exe”,这个是要特别注意的,在2000里面加载ISAPI的进程是dllhost.exe

 

 

2.远程调试

这里举普通的exe为例,其他DLL调试,ISAPI调试、ActiveX调试等只要参考本地调试再结合一下就可以了。

 

在远程机子上建立一个文件夹并共享出来,允许网络用户读取和更改,如下所示:

 

 

 

 

 

 

VCLink标签里设置如下:

 

 

 

 

 

就是把文件生成到远程机子(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)

 

你可以看到,在远程机子上运行起来了你要调试的程序: