VS Code and ElixirLS Errors while trying to process NIFs

I was struggling with this for the past couple of hours. Just putting this out there in the event it helps someone else out (or me when I have to set it up again and have totally forgotten).

If you’re getting a message like this:

(Debugger) Task failed because an exception was raised:
    ** (Mix.Error) Could not start application fast_tls: exited in: :fast_tls_app.start(:normal, [])
    ** (EXIT) an exception was raised:
        ** (MatchError) no match of right hand side value: {:error, {:bad_lib, 'load_nif/2 must be explicitly called from the NIF module. It cannot be called through apply/3.'}}

You need to exclude the offending libraries that are using NIF referring modules because (as far as I understand) ElixirLS can’t introspect those libs.

Thanks to posts like this it got me going in the right direction but then I was getting stumped as I was excluding the module it said was causing the problem. The solution is you need to also exclude some or all of the modules it is importing as well.

You can do this by searching in the /deps dir for the name of the module such as ‘fast_xml’. You want to find a file where this module and it’s dependent modules are defined. It’s under

/deps/whaever/ebin/whatever.app

And it will look like this:

             {application,fast_xml,
             [{description,"Fast Expat-based Erlang / Elixir XML parsing library"},
              {vsn,"1.1.37"},
              {modules,[fast_xml,fxml,fxml_gen,fxml_gen_pt,fxml_stream,
                        fxml_sup,fxmlrpc,fxmlrpc_codec,
                        fxmlrpc_codec_external]},
              {registered,[]},
              {applications,[kernel,stdlib,p1_utils]},
              {mod,{fast_xml,[]}},
              {files,["src/","lib/","c_src/fxml.c","c_src/fxml_stream.c",
                      "include/","priv/lib/.keepme","mix.exs","mix.lock",
                      "Makefile.mix","rebar.config","rebar.config.script",
                      "README.md","LICENSE.txt"]},
              {licenses,["Apache 2.0"]},
              {links,[{"Github","https://github.com/processone/fast_xml"}]}]}.

Grab the list of modules and convert them to the right format (Erlang -> Elixir) - ‘fast_xml’ > ‘":fast_xml"’ and put them all in the list of excludeModules in launch.json.

        "excludeModules": [
        ":fast_tls_app",
        "MeeseeksHtml5ever.Native",
        ":prometheus_process_collector",
        ":fast_tls",
        ":fast_tls_sup",
        ":p1_sha",
        ":fast_xml",
        ":stringprep",
        ":fxml",
        ":fxml_gen",
        ":fxml_gen_pt",
        ":fxml_stream",
        ":fxml_sup",
        ":fxmlrpc",
        ":fxmlrpc_codec",
        ":fxmlrpc_codec_external"
]

Happy debugging!

1 Like