怎么通过beam文件得到所有的record或源代码?

 
1. 首先必须要在compile里面加上debug_info信息:
1 > c(load,[debug_info]).
{ok,load}
2> beam_lib:chunks(code:which(load),[compile_info]).
{ok,{load,[{compile_info,[{options,[debug_info]},
{version,"5.0.2"},
{time,{2014,11,10,15,19,43}},
{source,"c:/Users/admin/Documents/GitHub/ErlMixCode/src/load/load.erl"}]}]}}
 
2. 从beam中通过beam_lib模块取出recod信息或源代码:
-module(beamI).
%% API
-export([record_attrs/1,beam_to_source/1]).
%%得到record信息[{RecName1,[Filed11,Filed12]},{RecName2,[Filed21,Filed22]}]
record_attrs(Beam) ->
{ok,{_Mod,[{abstract_code,{_Version,Forms}},{"CInf",_CB}]}} =
beam_lib:chunks(code:which(Beam), [abstract_code,"CInf"]),
[join_name_field(D) || {attribute,_,record,D} <- Forms].

%%得到源代码Beam.erl内容:
beam_to_source(Beam) ->
{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(code:which(Beam),[abstract_code]),
io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]). join_name_field({Name, Fs}) -> {Name, [element(3, element(3,F)) || F <- Fs]}.
3. 测试:得到record和源文件:
3> beamI:record_attrs(mnesia).
[{tid,[counter,pid]},
{tidstore,[store,up_stores,level]},
{cstruct,[name,type,ram_copies,disc_copies,disc_only_copies,
load_order,access_mode,majority,index,snmp,local_content,
record_name,attributes,user_properties,frag_properties,
storage_properties,cookie,version]},
{log_header,[log_kind,log_version,mnesia_version,node,now]},
{commit,[node,decision,ram_copies,disc_copies,
disc_only_copies,snmp,schema_ops]},
{decision,[tid,outcome,disc_nodes,ram_nodes]},
{cyclic,[node,oid,op,lock,lucky]},
{mnesia_select,[tab,tid,node,storage,cont,written,spec,type,
orig]}]
4> beamI:beam_to_source(load).
-file("load.erl", 1).
-module(load).
-behaviour(gen_server).
-vsn("1.0").
-export([multi_start/0, multi_start/1, start/0, start/1,
start_link/0, start_link/1]).
-export([stop/0, multi_stop/0]).
.......
这一切的前提都是你要在编译时+上debug_info信息:
 
因为你不想加debug_info让代码泄露,但有一些测试工具又非常依赖debug_info。
这时你可以使用encryption对debug_info进行加密,详见beam_lib的官方文档:)
 
参照:beam_lib模块的官方文档。
--------------------------------------------------------------------------------------------------------------------------------------
人家手都伸出来了,好歹给一小鱼干啊,这是人干的吗?
 

[Erlang26]怎么通过beam文件得到所有的record或源代码?的更多相关文章

  1. [Erlang27]如何监控指定目录下的*.beam文件,如果有改动就更新到指定的节点?

    在Erlang In Anger第二章中讲到使用rebar来创建一个Erlang项目(Application或Project) 但美中不足的只是给出了指引,但没有给出详细的步骤. 下面我们就使用reb ...

  2. Xml日志记录文件最优方案(附源代码)

    Xml作为数据存储的一种方式,当数据非常大的时候,我们将碰到很多Xml处理的问题.通常,我们对Xml文件进行编辑的最直接的方式是将xml文件加载到XmlDocument,在内存中来对XmlDocume ...

  3. Android布局文件的载入过程分析:Activity.setContentView()源代码分析

    大家都知道在Activity的onCreate()中调用Activity.setContent()方法能够载入布局文件以设置该Activity的显示界面.本文将从setContentView()的源代 ...

  4. 上传文件时 重新载入页面以获取源代码 http://*/upload.php

    今天做一个处理上传文件的接口时碰到这样一个问题, 用的是element-ui的上传组件,但是上传失败, 抓包一看返回的是 重新载入页面以获取源代码 http://*/upload.php 网上搜了一下 ...

  5. 【Android Developers Training】 42. 从另一台设备接收文件

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. 【Android Developers Training】 41. 向另一台设备发送文件

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. [Erlang06]在Erlang shell怎么在目录A下编译目录B下的文件,并把生成文件统一放置目录C?

    问题描述: 我们想快速测试一个小功能,第一个反应就是打开Erl shell 直接输入,但是当想测试一个复杂的函数时,一般会写成一个*.erl文件,然后在shell下: cd(FileDir). c(F ...

  8. erlang app 文件

    http://hje.iteye.com/blog/1211734 应用的概念¶ 当我们写了实现特定功能的代码之后,我们可能想将代码转成一个 应用 (application),这是可以作为一个单元启动 ...

  9. Erlang那些事儿第2回之我是模块(module),一文件一模块

    前几篇文章会写得比较基础,但是既然要写一系列的文章,还是得从基础开始写.我刚学Erlang碰到最大的问题是,想网上搜索下语法,结果却是寥寥无几,而且介绍得不是很系统,对我了解一些细节是有影响的,正好我 ...

随机推荐

  1. Traits

    'folly/Traits.h' Implements traits complementary to those provided in <type_traits> Implements ...

  2. varnish/squid/nginx cache 有什么不同?

    SQUID 是功能最全面的,但是架构太老,性能不咋的Varnish 是内存缓存,速度一流,但是内存缓存也限制了其容量,缓存页面和图片一般是挺好的Nginx 本来是反向代理/web服务器,用了插件可以做 ...

  3. go语言数组与切片比较

    一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式:[length]Type .[N]Type{value1, value2, . ...

  4. Seetaface 向树莓派 移植

    seetaface由中科院计算所山世光研究员带领的人脸识别研究组研发.代码基于C++实现,不依赖第三方库.然而,目前开源的代码,是在windows vs上编译的,对于我们这帮mac/linux用户来说 ...

  5. leetcode58

    public class Solution { public int LengthOfLastWord(string s) { s = s.Trim(); || s.Trim().Length == ...

  6. DB2 数据类型转换

    db2数据类型转换: 1.CAST() CAST (<expression> AS <data_ type>[ length ]) 2.CONVERT() CONVERT (& ...

  7. 关于std:auto_ptr std:shared_ptr std:unique_ptr

    很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它.这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生成健壮的代码.本文阐述了如何正确 ...

  8. lammps模拟化学反应(1)

    1. Can I use lammps to chemical reaction systems?Please note that you can only get as good an answer ...

  9. Django 1.10.2 模型数据库操作

    首先我的django 版本 >>> django.VERSION (1, 10, 2, u'final', 0) setting.py: DATABASES = { 'default ...

  10. 784. Letter Case Permutation 字符串中字母的大小写组合

    [抄题]: Given a string S, we can transform every letter individually to be lowercase or uppercase to c ...