You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Erlang tracer中如何获取含项目自定义函数的完整调用栈?

解决方案

方案1:基于原生dbg获取结构化栈

你不需要自行解析process_dump,直接在匹配规范的动作中调用允许的BIF即可拿到结构化栈,修改你的tp调用为:

:dbg.tp(module, :_, [{:_, [], [{:message, {:stack, :erlang.process_info(self(), :current_stacktrace)}}]}])

对应的handler函数修改为:

handler_fun = fn {:trace, _pid, :call, {m, f, a}, {:stack, {:current_stacktrace, stack}}}, _ignored ->
  # stack为结构化完整调用栈列表,每个元素格式为{模块, 函数, 元数, 位置信息}
  # 过滤标准库/底层调用,仅保留你的项目代码
  project_stack = Enum.filter(stack, fn {mod, _, _, _} ->
    String.starts_with?(Atom.to_string(mod), "你的项目模块前缀")
  end)
  # 取列表最后一位即为项目最顶层调用函数
  top_caller = List.last(project_stack)
  IO.inspect(top_caller, label: "最顶层调用")
end

caller仅返回紧邻上层调用是其本身的设计限制,拿到完整栈后过滤即可得到你需要的结果,process_info属于匹配规范允许调用的安全BIF,无需额外配置。

方案2:使用recon_trace工具(更推荐)

recon是Erlang生态专门用于生产环境诊断的工具,比原生dbg易用性更高,不需要手动处理复杂的匹配规范,直接就能返回结构化栈:
首先在mix.exs中添加依赖:

defp deps do
  [{:recon, "~> 2.5"}]
end

安装依赖后直接调用即可:

# 追踪指定模块所有函数调用,返回深度为10的调用栈,最多输出100条追踪结果
:recon_trace.calls({module, :_, :_}, 100, [stack: 10])

输出自动包含结构化调用栈,也可自定义处理函数接收追踪结果,无需任何解析操作,默认会屏蔽底层虚拟机、标准库调用,可直接获取业务层调用链。

内容的提问来源于stack exchange,提问作者Kanes115

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:48:02