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

如何在Erlang Trace中使用return_trace自定义大返回值输出?

自定义Erlang Trace返回值输出长度

默认使用{return_trace}动作会返回函数的完整返回值,当返回值过大时,你可以通过自定义trace消息处理逻辑来限制输出长度,只保留前100字节:

方法1:手动处理Trace消息

  1. 启动trace时,将trace消息发送到当前进程(或指定处理进程):
% 针对目标进程PID启动trace,开启call和return_trace,指定tracer为当前进程
erlang:trace(TargetPid, true, [call, return_trace, {tracer, self()}]),
  1. 在进程中接收trace消息,对返回值进行截断处理后输出:
receive
    {trace, Pid, return_from, {Mod, Fun, Arity}, Ret} ->
        % 仅对二进制类型的返回值截断前100字节,非二进制值保持原样
        TruncatedRet = case is_binary(Ret) of
            true -> binary:part(Ret, 0, min(byte_size(Ret), 100));
            false -> Ret
        end,
        % 格式化输出结果
        io:format("Return from ~p:~p/~p: ~p~n", [Mod, Fun, Arity, TruncatedRet])
end.

方法2:通过匹配规范直接处理返回值

如果你想在trace动作层面直接处理返回值,可以使用带自定义函数的匹配规范:
首先定义截断函数:

truncate_return(Value, MaxLen) when is_binary(Value) ->
    binary:part(Value, 0, min(byte_size(Value), MaxLen));
truncate_return(Value, _MaxLen) ->
    Value.

然后设置trace时使用该函数:

MatchSpec = [{['_', '_'], [], [{return_trace, fun truncate_return/2, ['$_', 100]}]}],
erlang:trace(TargetPid, true, [call, {match_spec, MatchSpec}]).

这种方式会直接在trace生成时截断返回值,后续接收消息时拿到的就是处理后的结果。

注意:如果返回值是非二进制类型(比如列表、元组),可以根据需求扩展截断逻辑(比如限制列表长度),上述示例仅针对二进制值做了字节截断。

内容的提问来源于stack exchange,提问作者孙海城

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:55:15