安装Elixir和Erlang是调试前提,需用asdf(Mac)、官方安装包(Win)或源码编译(Linux)确保版本兼容;启用ElixirLS插件并打开含mix.exs的根目录;launch.json须配置mix task模式;断点失效主因是未编译、模块未加载或编码问题。

安装 Elixir 和 Erlang 运行时是调试的前提
VS Code 本身不提供 Elixir 运行能力,elixir 和 erlang 必须提前装好,否则所有插件都会报错或无法启动调试器。Mac 用户用 asdf 最稳妥,Windows 用户推荐官方 otp_win64.exe + elixir-windows-setup.exe 组合;Linux 用户避免用系统包管理器(如 apt install elixir),容易装到过旧版本。
验证是否就位:
elixir --version erl -version
两者都应输出有效版本号,且 erl 版本需与当前 Elixir 兼容(例如 Elixir 1.17 要求 OTP 26+)。不匹配会导致 mix test 卡住、Debugger 启动失败但无明确提示。
必须启用 ElixirLS 插件并配置正确的 projectRoot
VS Code 官方市场中唯一被社区广泛验证的 Elixir 插件是 elixir-lsp.elixir-ls。它不是“语法高亮工具”,而是基于 Language Server Protocol 的完整开发后端,提供跳转、补全、格式化和调试支持。
常见问题集中在工作区配置上:
- 打开的是子目录(比如只打开了
lib/),插件找不到mix.exs,会静默禁用调试功能 -
mix.exs存在但项目未执行过mix deps.get,插件会反复提示 “Project not compiled”,此时断点全部失效 - 工作区设置了
"elixirLS.projectRoot": "./some-other-dir",但路径错误或指向非 Mix 项目,调试器根本不会加载
正确做法:用 VS Code 打开包含 mix.exs 的根目录,确保终端中能成功运行 mix compile。
调试配置 launch.json 必须用 mix task 模式
Elixir 没有传统意义上的“单文件运行”,调试入口只能是 mix 任务。VS Code 的 .vscode/launch.json 中不能写 "program": "lib/my_app.ex",必须指定 task 字段。
免费 盛世企业网站管理系统(SnSee)系统完全免费使用,无任何功能模块使用限制,在使用过程中如遇到相关问题可以去官方论坛参与讨论。开源 系统Web代码完全开源,在您使用过程中可以根据自已实际情况加以调整或修改,完全可以满足您的需求。强大且灵活 独创的多语言功能,可以直接在后台自由设定语言版本,其语言版本不限数量,可根据自已需要进行任意设置;系统各模块可在后台自由设置及开启;强大且适用的后台管理支
典型可用配置:
{
"version": "0.2.0",
"configurations": [
{
"type": "elixir-ls",
"request": "launch",
"name": "Mix Task: run",
"task": "run",
"taskArgs": ["--no-halt"],
"projectDir": "${workspaceFolder}"
},
{
"type": "elixir-ls",
"request": "launch",
"name": "Mix Test: current file",
"task": "test",
"taskArgs": ["${fileBasenameNoExtension}"],
"projectDir": "${workspaceFolder}"
}
]
}
注意点:
-
"task": "test"是调试测试的标准方式,${fileBasenameNoExtension}会自动提取当前打开的test/some_test.exs对应的模块名 - 不要手动填
"taskArgs": ["test/test_helper.exs"]—— 这会触发整个测试套件,且无法定位到当前文件 - 如果项目用了
Phoenix,"task": "phx.server"可用,但需确认mix phx.server在终端中能正常启动,否则调试器卡在 “Starting” 状态
断点失效或跳转不到源码的三个高频原因
即使配置全对,断点仍可能灰掉或运行时不命中。核心原因是 Elixir 编译产物(.beam)与源码路径不一致,或调试器没加载对应模块。
排查顺序如下:
- 检查当前文件是否已被编译:运行
mix compile,观察终端是否输出新编译的模块;若提示 “up to date”,尝试删掉_build/目录重编 - 确认断点所在模块已加载:在调试控制台中执行
:observer.start(),查看 “Applications” 或 “Processes” 标签页里是否有你的应用名;没有说明mix任务没真正跑起来 - 检查文件编码和换行符:Windows 上用 CRLF 保存的
.ex文件,在某些 OTP 版本下会导致解析失败,断点位置偏移;统一用 LF 保存(VS Code 右下角可切换)
最隐蔽的问题是:你加了断点的函数是被 defdelegate 转发的,而断点只能打在实际实现处,委托定义行本身不会停。









