当加载函数有 try catch 块来处理异常时,NIF 会引发分段错误

问题描述

我正在使用 NIF 将 C++ api 与 Elixir 集成。现在,每当我加载 NIF 时,我都想初始化一些将在 NIF 调用中持久化的变量/数据。我试图通过 load 调用中提到的 ERL_NIF_INIT 函数实现相同的目标。但是我在加载功能之外观察到一些奇怪的行为。请看下面提到的例子,然后我会进一步解释这个问题:

#include <erl_nif.h>

static ERL_NIF_TERM sample(ErlNifEnv *env,int argc,const ERL_NIF_TERM argv[]) {
  return enif_make_atom(env,"ok");
}

static ErlNifFunc nif_funcs[] = {{"sample",1,sample}};

static int load(ErlNifEnv *env,void **priv_data,ERL_NIF_TERM load_info) {
  try {
    1 / 0; // nif loads if this is the case
    int x = 1 / 0; // float point exception segmentation fault when used this line
  } catch (...) {
    return 1;
  }
  return 0;
}

ERL_NIF_INIT(Elixir.Sample,nif_funcs,load,NULL,NULL);

现在仔细观察包含 load 块的 try/catch 函数,当我在 1 / 0; 块的主体中​​使用 try 表达式时,NIF 已加载,但是当表达式 { {1}} 替换为 1 / 0; erlang vm 无法加载 NIF 并与 int x = 1 / 0; 崩溃,即使我添加floating point exception segmentation fault 块来处理异常。谁可以给我解释一下这个?我真的需要帮助。

这是用于接口的 Elixir 代码

try/catch

用于编译 NIF defmodule Sample do @on_load :load_nifs def load_nifs do :ok = :sample |> :code.priv_dir() |> Path.join("sample") |> :erlang.load_nif("0.0.1") end def sample(_) do raise "sample/1 Function not implemented" end end 的命令

附言- 感谢您花时间阅读本文,非常感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...