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调试的更多相关文章

  1. 可删除超炫&amp;多种特效的Card视图(改造自cardsui-for-android开源项目),提供DEMO下载

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990).谢谢支持!        实例Demo下载地址在本文最后 简介 这个Demo主要是使用了cardsui ...

  2. java开源项目之IQQ学习记录之单例模式与log4j日志记录

    作者:sushengmiyan 本文地址:http://blog.csdn.net/sushengmiyan/article/details/18992741 打开IQQ项目,打开包iqq.app中的 ...

  3. Android开源项目和轮子

    推荐查看Github最全面的Android开源项目汇总 功能框架 数据库 ORMLite框架 greenDaoMaster框架 Xutils的DButils ORMLitehe和greenDaoMas ...

  4. 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】

    文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...

  5. 谷歌开源项目Google Preview Image Extractor(PIEX) (附上完整demo代码)

    前天偶然看到谷歌开源项目中有一个近乎无人问津的项目Google Preview Image Extractor(PIEX) . 项目地址: https://github.com/google/piex ...

  6. 这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)

    在前2篇文章这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,大伙热情高涨.再次拿出自己的私货,在.NET平台 ...

  7. .NET平台开源项目速览(1)SharpConfig配置文件读写组件

    在.NET平台日常开发中,读取配置文件是一个很常见的需求.以前都是使用System.Configuration.ConfigurationSettings来操作,这个说实话,搞起来比较费劲.不知道大家 ...

  8. .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...

  9. 学习Coding-iOS开源项目日志(五)

    继续,接着前面第四篇<学习Coding-iOS开源项目日志(四)>讲解Coding-iOS开源项目. 前 言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的项目 ...

随机推荐

  1. survey on Time Series Analysis Lib

    (1)I spent my 4th year Computing project on implementing time series forecasting for Java heap usage ...

  2. angularjs 作用域

    1.指令属性取值:通过attr.someAttribute属性名字获取 以下,通过$eval(attr.data)获取value <div ng-controller="personC ...

  3. svn服务器搭建与使用

  4. java四种内部类

    内部类有成员内部类,局部内部类,匿名内部类,静态内部类. 1,成员内部类package innerClass; public class InnerClassTest { String s1=&quo ...

  5. java JFrame窗体真正关闭

    程序: package JFrame.bao; import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent; impor ...

  6. 将你的代码上传 Bintray 仓库(转)

    转自:http://www.cnblogs.com/cpacm/p/5548241.html 在 Android Studio 中,我们通常可以利用 gradle 来导入别人写的第三方库,通常可以简单 ...

  7. java 单利模式

    首先何为单利模式: 单利模式即多次调用同一个对象的时候,只有一个实例(这里所谓的实例就是,假如创建了两个对象,它们的hashCode相同) 下面是相关代码: 1 创建一个对象Singleton类 pa ...

  8. NOI 4976:硬币

    描述 宇航员Bob有一天来到火星上,他有收集硬币的习惯.于是他将火星上所有面值的硬币都收集起来了,一共有n种,每种只有一个:面值分别为a1,a2- an. Bob在机场看到了一个特别喜欢的礼物,想买来 ...

  9. UIAlertController的使用

    在iOS8中,苹果对UIAlertView和UIActionSheet进行了重新的封装,成为适应性更强,灵活性更高的UIAlertController.具体使用方法如下. UIAlertControl ...

  10. strncpy和memcpy的区别

    今天不小心在该用memcpy的时候,用了strncpy使自己吃了亏,所以写出这个博文. memcpy就是纯字节拷贝,而strncpy就不同了,字符串是以'\0'结尾的.如果一个字符buffer长度为6 ...