VB/VC混编调试之——VS调试VB6程序,解决VB6的IDE缺陷

时间:2024-04-13 07:58:13

VB6的IDE调试虽方便,但是缺陷也很多,代码位于同一进程,容易因异常导致IDE崩溃、无法多线程调试、窗口子类化后进入中断模式会导致IDE无响应。难道调试要用OD来反汇编吗?不仅对调试者的门槛要求高,而且反汇编式的调试的效率比源代码级的调试低很多。而本文主要讲VB6与VC混编模式(exe+dll)的源代码调试技巧之一:用vs调试vb6的程序。成功将vb6程序载入vs后,就可以在源代码级进行线程、调用堆栈、反汇编、中断、单步、变量查看、监视等等调试方法。

一、准备工作

开发环境:VisualStudio、VB6.0。本文中使用的是vs2013 update5

工程属性中将vb6的编译参数添加上“产生符号化调试信息”,其它编译参数不变,也可以根据自己的需要设置。这样,编译后会生成名为*.pdb的符号文件,里面包含了源代码文件的路径、程序中所有的符号以及调试信息。

VB/VC混编调试之——VS调试VB6程序,解决VB6的IDE缺陷

设置好后重新编译,生成exe或者dll,在生成的文件目录中会有*.pdb文件

二、添加解决方案

如果是只调试exe则可以新建空白解决方案,如果还有vc的dll工程则可以在现有dll工程所在的解决方案中再添加个项目即可。

然后将从vb6生成出来的exe添加到解决方案,注意:无论exe在哪个目录,pdb必须和exe位于同一目录,这样才能让VS自动加载符号。添加exe时一定从文件菜单中添加,不要从解决方案中右键添加。文件→添加现有项目,选择exe,确定。

然后将代码文件添加到解决方案中,解决方案资源管理器中右键添加现有项,然后选择源代码文件,cls frm bas 这些均可以,只要包含源代码的都可以。添加好后,将exe设置为调试启动项。最后如下图所示的样子:

VB/VC混编调试之——VS调试VB6程序,解决VB6的IDE缺陷

三、修改VS配置,加载符号文件

默认的配置下,VS启动调试是会提示无法加载符号的,如果启动调试后,能正常加载符号则可以跳过此步骤。加载符号也是用vs调试vb6的难点,所以需要多找找原因。

要查看是否加载符号,可以启动调试后,点击调试菜单→窗口→模块,也可以按Ctrl+Alt+U,然后找到exe模块,如下图:

VB/VC混编调试之——VS调试VB6程序,解决VB6的IDE缺陷

上图是已经加载符号的状态,符号状态栏显示未加载符号时,则表示VS无法自动加载符号,此时如果点击右键,手动加载符号文件,仍然会提示未找到匹配的二进制符号文件,所以需要修改vs配置。不同的vs版本,其选项设置可能不同,但有几点是必须确保的设置,如果照下面步骤设置后仍然无法加载,可多修改下调试设置的其它选项,但能肯定的是,不管哪个版本的VS,只要安装了VC++调试器,就一定能成功加载pdb符号文件。

点击工具选项调试→常规,打开编辑并继续,默认打开的话,开启编辑并继续的所有子项设置

VB/VC混编调试之——VS调试VB6程序,解决VB6的IDE缺陷

VS2013的默认配置只需要开启编辑并继续就可以了,对于VS2015和VS2017或者其它版本的VS,则还需要注意以下几项设置的正确性,需要注意的是“要求源文件与原始版本完全匹配”在加载vb6的符号文件时并没有什么用,取消其勾选也无效,无法加载的原因是其它调试选项有冲突。

VB/VC混编调试之——VS调试VB6程序,解决VB6的IDE缺陷

VB/VC混编调试之——VS调试VB6程序,解决VB6的IDE缺陷

VB/VC混编调试之——VS调试VB6程序,解决VB6的IDE缺陷

由于VS版本问题,这里只以VS2013为演示,所以如果按照以上设置项仍然无法成功加载符号文件,则可多修改一下其它调试设置,多试几次就好了。

四、启动调试

断点、单步只有成功加载符号后才可用,通过VS能精确捕获导致VB6IDE崩溃的位置,然后通过调用堆栈快速定位产生异常的代码位置。也可以调试断点子线程的代码,和正常调试C++代码一样。下图展示几幅调试截图:

VB/VC混编调试之——VS调试VB6程序,解决VB6的IDE缺陷

VB/VC混编调试之——VS调试VB6程序,解决VB6的IDE缺陷VB/VC混编调试之——VS调试VB6程序,解决VB6的IDE缺陷


本文为原创摸索出来的,禁止抄袭。目前百度搜索不到任何相关资料,全部都是将VB6的IDE做为调试启动对象来调试,因此我写这篇博客,为的是给VB6调试的蛋疼缺陷问题做个补充,也给VCVB混编的人员做个参考。