开源项目asmjit——调用自定义方法demo以及windbg调试
asmjit是一个开源项目,使用它可以将代码即时的编译成机器码,也就是所谓的jit技术。
初次接触这个项目,编写了一个demo,学习它的使用方法。
现将编写的demo以及调试jit生成的机器码的过程总结出来,分享给大家
asmjit调用自定义方法的demo
代码如下
#include "asmjit.h" // [Dependencies - C]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace AsmJit;
#include <string>
#include <iostream>
using namespace std; int add(int value1, int value2)
{
cout << "arg1: " << value1 << " arg2: " << value2 << endl;
return value1 + value2;
} int main(int argc, char* argv[])
{
X86Compiler c;
//记录日志,将编译细节输出到控制台
FileLogger Logger(stdout);
c.setLogger(&Logger); //新建一个无参数、无返回值的方法
c.newFunc(kX86FuncConvDefault, FuncBuilder0<void>());
//定义一个临时变量
GpVar result(c.newGpVar());
//给add方法传入参数
c.push(Imm(9));
c.push(Imm(10));
//调用自定义的add方法
c.call((void*)add);
//方法结束
c.endFunc();
typedef void (*myfun)(void);
//生成方法的机器码--真正的机器码
myfun fun = asmjit_cast<myfun>(c.make());
//调用刚刚生成的方法
fun(); //获取add方法的返回值
__asm{ mov value3, eax
} cout << value3 << endl;
//程序结束释放生成的方法占用的内存
MemoryManager::getGlobal()->free(fun); return 0;
}
VS调试
用VS调试生成的fun方法,首先通过调试菜单,打开反汇编窗口,如下图

通过F11单步调试进生成的fun方法,看到如下的反汇编代码

由于显示一堆的??,无法知道生成的是什么指令,所以无法调试。
针对此问题在asmjit的google groups进行了提问

下面是比较有用的回答

根据Palo Marton的回答,这应该是VS的BUG。
windbg调试asmjit生成的方法
既然VS2012有BUG,那么就用windbg来调试吧

启动后通过 lm 指令查看当前加载的模块

上图看到,asmjit的符号文件还未加载。
对main方法设置断点 bp asmjit!main + 10,然后通过bl查看当前断点

查看当前模块及其符号文件

可以看到,这时asmjit的符号文件已经加载了。
通过g命令直接运行。
此时由于符号文件已经加载,windbg会根据符号文件加载对应的源文件

这时断在了刚才下的断点处,Alt+7打开反汇编窗口

通过p命令进行单步调试(相当于VS中的F10),t命令进行步入调试(相当于VS中的F11)。
执行到fun方法时,通过t命令进入方法内就可以看到生成的fun方法的反汇编代码了

调试过程中使用到的windbg命令介绍
lm:List Loaded Modules,lm 命令显示已经加载的模块,输出信息包括模块的状态和路径。
bp:bp命令设置程序断点。
bl:BreakPoint List ,bl命令列出当前存在的断点信息列表。
p:Step,p命令执行一条指令或者一句源代码,然后展示所有寄存器的结果,相当于VS调试中的F10。
g:Go,g命令开始执行当前进程或线程,相当于VS中的F5。
t:Trace,t命令相当于VS中的F11。
gu:Go Up,gu命令会使程序一直执行,知道当前的方法执行结束。相当于VS中的Shift+F11。
开源项目asmjit——调用自定义方法demo以及windbg调试的更多相关文章
- 可删除超炫&多种特效的Card视图(改造自cardsui-for-android开源项目),提供DEMO下载
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990).谢谢支持! 实例Demo下载地址在本文最后 简介 这个Demo主要是使用了cardsui ...
- java开源项目之IQQ学习记录之单例模式与log4j日志记录
作者:sushengmiyan 本文地址:http://blog.csdn.net/sushengmiyan/article/details/18992741 打开IQQ项目,打开包iqq.app中的 ...
- Android开源项目和轮子
推荐查看Github最全面的Android开源项目汇总 功能框架 数据库 ORMLite框架 greenDaoMaster框架 Xutils的DButils ORMLitehe和greenDaoMas ...
- 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】
文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...
- 谷歌开源项目Google Preview Image Extractor(PIEX) (附上完整demo代码)
前天偶然看到谷歌开源项目中有一个近乎无人问津的项目Google Preview Image Extractor(PIEX) . 项目地址: https://github.com/google/piex ...
- 这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)
在前2篇文章这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,大伙热情高涨.再次拿出自己的私货,在.NET平台 ...
- .NET平台开源项目速览(1)SharpConfig配置文件读写组件
在.NET平台日常开发中,读取配置文件是一个很常见的需求.以前都是使用System.Configuration.ConfigurationSettings来操作,这个说实话,搞起来比较费劲.不知道大家 ...
- .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...
- 学习Coding-iOS开源项目日志(五)
继续,接着前面第四篇<学习Coding-iOS开源项目日志(四)>讲解Coding-iOS开源项目. 前 言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的项目 ...
随机推荐
- virtual 修饰符 C# .NET
virtual 关键字用于修饰方法.属性.索引器或事件声明,并且允许在派生类中重写这些对象. 例如,此方法可被任何继承它的类重写. (C#参考) public virtual double Area( ...
- 日志——JSON的相关方法
http://www.cnblogs.com/henryxu/archive/2013/03/10/2952738.html JSON jar包: commons-lang.jar commons- ...
- JavaScript (jquery) 数组去重的算法探讨
方法很巧妙 但是要事先知道对应的name或其他属性名称 主键值只适用于已知数据对象进行调用: var arr1 = [{ name: ' ...
- Fiddler 工作原理
Fiddler工作原理: 就在在客户端与服务器端创建一个代理服务器: 在开启Fiddler后,Fiddler会自动窜改浏览器的代理,例如我们打开Fiddler,打开IE浏览器--设置--Interne ...
- Fiddler 手机端证书安装No root certificate was found
测试过程中发现在浏览器中访问代理服务器及端口,不通,提示要安装证书. 点击证书安装时,提示错误: No root certificate was found,Have you enabled HTTP ...
- python语言特性及其数据类型
- [fortify] open redirect漏洞
简介: 些通过请求(如查询字符串和表单数据)指定重定向URL的Web程序可能会被篡改,而把用户重定向到外部的恶意URL.这种篡改就被称为开发重定向攻击. 场景分析 假设有一个正规网站http://ne ...
- Linux下Chrome浏览器不支持WebGL的解决方式。
今天使用Chrome浏览器,总是报这样一个错误: Uncaught TypeError: Cannot read property 'canvas' of null. 细看之下是无法获取WebGL上下 ...
- ubuntu引导修复
很多人在自己电脑上装了双系统,我自己装了win7和ubuntu14.04,主要还是用win7,但是有时候win7系统崩溃掉时只能重装咯,重装后发现ubuntu的引导不见了,我也试过在windows下修 ...
- (转)深度分析Linux下双网卡绑定七种模式
现在一般的企业都会 使用双网卡接入,这样既能添加网络带宽,同时又能做相应的冗余,可以说是好处多多.而一般企业都会使用linux操作系统下自带的网卡绑定模式,当然现在 网卡产商也会出一些针对window ...