gpt4 book ai didi

erlang - 使用 dbg 跟踪时避免输出巨大的二进制参数

转载 作者:行者123 更新时间:2023-12-02 08:46:50 24 4
gpt4 key购买 nike

我必须调试一些在参数中传递巨大二进制文件的代码。

为此,我想使用 dbg:tracer/0dbg:p/2dbg:tpl/3 的组合.

但是如果我这样做,每次都会输出所有二进制文件,这会弄乱输出,因此很难找到重要信息。

更糟糕的是,这些二进制文件的输出扰乱了代码的时序。这使得它的行为完全不同,以至于我无法重现我想要的行为 dbg

我仍然想查看其他参数,但不需要查看二进制文件(缩短的二进制文件也可以)。

最佳答案

你可能想使用这样的东西:

-module(test).

-compile(export_all).

foo(_LongBinary, _OtherParam) ->
ok.

test() ->
dbg:tracer(process, {
fun({trace, Pid, call, {M,F,A}}, _) ->
NewA = lists:map(fun(<<Reduced:5/binary, _/binary>>) ->
Reduced;
(Else) ->
Else
end, A),
erlang:display({Pid, "->", M, F, NewA});
({trace, Pid, return_from, {M,F,A}, R}, _) ->
erlang:display({Pid, "<-", M, F, A, R})
end, unused}),
dbg:p(all,c),
dbg:tpl(test, foo, x).

主要是,我使用的是 dbg:tracer 的替代版本,它有两个参数。第一个是类型,可以是进程端口(有关更多详细信息,请参阅文档)。第二个参数是消息处理函数(实际上是一个包含处理函数和初始处理数据的元组),每个跟踪消息都会调用该函数。

在那里,您可以实现逻辑来截断超过一定长度的二进制文件或您需要执行的任何其他操作。

所以,你会得到类似的东西:

1> test:test().                               
{ok,[{matched,nonode@nohost,1},{saved,x}]}
2> test:foo(<<"aa">>,b).
ok
3> {<0.45.0>,"->",test,foo,[<<2 bytes>>,b]}
{<0.45.0>,"<-",test,foo,2,ok}
4> test:foo(<<"aaaaaaa">>,b).
ok
5> {<0.45.0>,"->",test,foo,[<<5 bytes>>,b]}
{<0.45.0>,"<-",test,foo,2,ok}
6> test:foo(<<"aaaaaaasdaaaaaaaaa">>,b).
ok
7> {<0.45.0>,"->",test,foo,[<<5 bytes>>,b]}
{<0.45.0>,"<-",test,foo,2,ok}

您可能还想截断返回值。您还可以查看 dbg 模块来模拟它们 pretty-print (不幸的是,那里没有导出格式化函数)。

关于erlang - 使用 dbg 跟踪时避免输出巨大的二进制参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6361208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com