使用VS2017调试HEC虚拟机
【前言】
在《虚拟机的设计与实现——C/C++》一书中,作者Bill Blunden描述了一个简单但完整的虚拟机——HEC的设计及实现。
学习虚拟机这是是一本非常好的教材,但中文网络上对这个虚拟机资料不多,且仅有的两三篇文章也已经过时,恰好这几天在学习虚拟机,总结了一点关于HEC调试的方法,分享给大家。
【使用VS2017调试HEC虚拟机】
1.首先,在源代码根目录下,找到hecvm文件夹,这个文件夹存放了HEC虚拟机运行所需(看看文件名–> HEC-VM)源文件。
2.在VS2017中创建空项目,将上面hecvm文件夹中的所有文件拷贝到你创建的工程文件夹下,和.vcxproj文件放在同一目录中。然后,在源文件添加现有项中,从刚才拷贝的一堆文件中,挑出main.c添加进去
3.对VS2017做一些配置
首先在【调试】->【XXX(项目名)属性】->【VC++目录】->【包含目录】中,添加.vcxproj文件所在的目录路径。这是为了让工程编译时找到刚才拷贝进来的所有c文件。
其次,在【调试】->【XXX(项目名)属性】->【C/C++】->【预处理器】->【预处理器定义】,添加WINDOWS_32以及_CRT_SECURE_NO_WARNINGS两项(不要忘记项与项之间有分号)。
这个操作:前者是源代码在编译过程中所以来的预处理器定义,如果不用VS2017而是用Makefile进行编译,可以在文件夹中的Makefile文件里看到同样的操作;后者是为了解决下图中出现的报错,这些错误出现的原因是HEC的源代码中使用了已经“过时”的函数,这些函数在C语言的标准函数中存在内存越界的问题,从而使得内存数据变得不安全、如scanf、gets、strcat等、为了避免这个问题,VS提供了scanf_s,get_s,strcat_s等相关的改进函数,来替代原来的标准函数的功能,并通过添加内存读取范围的限制来解决不安全的问题,我们不可能一个一个函数去修改,所以就使用_CRT_SECURE_NO_WARNINGS强制禁止这些报错。
最后, 在【调试】->【XXX(项目名)属性】->【链接器】->【输入】->【附加依赖项】中,添加ws2_32.lib
4.HEC运行还需要一些命令行参数。在【调试】->【XXX(项目名)属性】->【调试】->【命令参数】中,添加-h=XXXX,-s=XXXX,XXXX.RUN -d
-h和-s是配置堆栈分配大小的,以KB为单位。
-d是调试模式,可以不加-d
test1.RUN是准备在虚拟机中执行的字节码可执行文件,在HEC的源代码压缩包里,一般都会带了一些示例代码,我的是在./hasm/testapp里面,.asm文件是可读的“汇编”代码,由.asm生成.RUN,放在HEC虚拟机中解释执行。挑一个.RUN文件拷贝到.vcxproj所在路径下(刚才拷进去一堆.c文件那个)
5.这样,基本就配置完成,编译执行。
运行成功时,我的test1.RUN在-d调试模式下有如下输出。
p.s.感谢这篇文章的指点https://dikatour.iteye.com/blog/205906
p.s.p.s评论区请不要乱讲话