【问题标题】:Erlang/OTP: Changes to the already existing modulesErlang/OTP:对现有模块的更改
【发布时间】:2011-06-20 14:29:27
【问题描述】:

我正在研究一个问题的解决方案,这需要更改模块 gb_trees 的一项功能。

我在编译 gb_trees 的编辑版本时遇到错误:

1> c(gb_trees).
cannot write to .bea#
...
2>

我可以通过什么方式进行更改和编译已经存在的模块?

【问题讨论】:

    标签: erlang erlang-otp


    【解决方案1】:

    您的文件可能正被另一个进程使用。关闭所有正在使用的应用程序或重新启动操作系统,然后尝试重新编译。

    您正在尝试手动加载模块,它是 Erlang/OTP 的一部分。

    来自文档:

    Erlang 运行时系统是 保护你。

    最简单的解决方案是重命名您的 模块,例如到 mysets.erl。也是 可以“解除”目录 包含库模块。

    code:unstick/1

    还有:

    为了防止意外重新加载 影响 Erlang 运行时的模块 系统本身,kernelstdlibcompiler 目录被考虑 粘性。这意味着系统 发出警告并拒绝 请求用户是否尝试重新加载 驻留在其中的任何一个模块。这 功能可以通过使用禁用 命令行标志-nostick

    erl(1)

    例如:

    $ erl -nostick
    Eshell V5.7.3  (abort with ^G)
    1> c(gb_trees).
    {ok,gb_trees}
    2> gb_trees:module_info().
    [{exports,[{foo,2},{module_info,0},{module_info,1}]},
     {imports,[]},
     {attributes,[{vsn,[338095567601101424197378397768992511838]}]},
     {compile,[{options,[]},
               {version,"4.6.3"},
               {time,{2011,2,3,11,39,53}},
               {source,"/tmp/gb_trees.erl"}]}]
    3>
    

    你看到我们可以编译模块并将其加载到 VM 中。

    但是,您可以将模块 gb_trees 重命名为 gb_trees_mine 并使用它导出的函数:

    1> gb_trees_mine:foo(13,42).
    bar
    2>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-26
      • 2019-01-27
      • 2013-11-01
      • 2020-01-11
      • 2013-01-22
      • 2014-06-04
      • 2014-12-24
      • 2011-02-16
      相关资源
      最近更新 更多