Debugging Eper redbug,在消息中打印行号

Debugging Eper redbug,在消息中打印行号,debugging,erlang,trace,Debugging,Erlang,Trace,以下是在shell中使用redbug的一些消息: % 02:49:02 <0.116.0>({cowboy_protocol,init,4}) % func1:start(<<"/second">>, [some]) % 02:49:02 <0.116.0>({cowboy_protocol,init,4}) % func1:looper(<<"/home/second">>, #{data => []}]) %0

以下是在shell中使用redbug的一些消息:

% 02:49:02 <0.116.0>({cowboy_protocol,init,4})
% func1:start(<<"/second">>, [some])

% 02:49:02 <0.116.0>({cowboy_protocol,init,4})
% func1:looper(<<"/home/second">>, #{data => []}])
%02:49:02({cowboy_协议,init,4})
%func1:开始(,[some])
%02:49:02({牛仔协议,初始,4})
%func1:looper(,#{data=>[]}])
有没有办法在redbug消息中也打印行号

redbug:help()确实显示了以下内容:

print_fun    ()            custom print handler, fun/1 or fun/2;
                             fun(TrcMsg) -> <ignored>
                             fun(TrcMsg,AccOld) -> AccNew
print_fun()自定义打印处理程序,fun/1或fun/2;
乐趣(TrcMsg)->
乐趣(TrcMsg,AccOld)->AccNew

但是没有很好的解释如何使用它,所以我无法尝试查看是否可以在消息中添加行号

您似乎无法以任何直接的方式进行操作

最简单的检查方法是,只需打印您在
print\u fun中收到的所有数据即可

1> PrintFun = fun (Msg) -> io:format( ">>> ~p~n" , [Msg]) end.
#Fun<erl_eval.6.90072148>
2> redbug:start("erlang" , [{print_fun, PrintFun}]).
{30,249}
>>> {call,{{erlang,demonitor,[#Ref<0.0.0.40>]},<<>>},
          {<0.33.0>,{erlang,apply,2}},
          {11,40,31,554200}}
>>> {call,{{erlang,atom_to_list,['PrintFun']},<<>>},
          {<0.33.0>,{erlang,apply,2}},
          {11,40,31,554210}}
>>> {call,{{erlang,group_leader,[]},<<>>},
          {<0.33.0>,{erlang,apply,2}},
          {11,40,31,554213}}
>>> {call,{{erlang,monitor,[process,<0.26.0>]},<<>>},
          {<0.33.0>,{erlang,apply,2}},
          {11,40,31,554215}}
>>> {call,{{erlang,port_control,[#Port<0.491>,101,[]]},<<>>},
          {<0.24.0>,user_drv},
          {11,40,31,554231}}
>>> {call,{{erlang,module_loaded,[calendar]},<<>>},
          {<0.20.0>,code_server},
          {11,40,31,554257}}
>>> {call,{{erlang,atom_to_list,[calendar]},<<>>},
          {<0.20.0>,code_server},
          {11,40,31,554263}}
>>> {call,{{erlang,'++',["calendar",".beam"]},<<>>},
          {<0.20.0>,code_server},
          {11,40,31,554265}}
>>> {call,{{erlang,'++',["ebin","/calendar.beam"]},<<>>},
          {<0.20.0>,code_server},
          {11,40,31,554268}}
>>> {call,{{erlang,whereis,[erl_prim_loader]},<<>>},
          {<0.20.0>,code_server},
          {11,40,31,554270}}
redbug done, msg_count - 10
在那个里你们可以找到列表,你们可以在上面找到元组,比如
{function,LineNumber,FunctionName,Arity,FunctionCodeAsList}
。因此,通过浏览此列表并查找您要查找的函数,您可以提取
LineNumber

你仍然需要考虑一些可能不起作用的事情

  • 您正在分析光盘中的实际文件,所以它必须位于您当前的目录中。它与是否加载到VM以及加载到VM的内容(什么代码版本)无关。因此,您可能需要做一些工作才能真正找到这个
    .beam
  • 没有调试信息编译的文件可能无法生成此抽象语法树。您需要决定这是否是您的情况,以及您希望如何处理此问题
  • 一些
    光束
    可能被加密,一些可能存在其他问题。你应该通过阅读来感受你正在处理的事情

如果你有什么想法,请分享。快乐的黑客

非常感谢你花了这么多时间来经历这一切。谢谢。我试着调用这个宏:-define(PRINT(Var),io:format(“DEBUG:~p:~p-~p~n~n~p~n~n”,[?MODULE,?LINE,?Var,Var])。从内部打印乐趣,但这并没有真正的工作。当我使用redbug时,我发现我不太需要行号。通过检查函数的参数,可以推断匹配了哪个函数子句。它不像下面的行号那样舒服,但实际上很不错,我喜欢。再次感谢。将标记为已解决
{ok,{redbug,[{abstract_code,{raw_abstract_v1,[{attribute,1,
                                                         file,
                                                         {"src/redbug.erl",1}},
                                              {attribute,9,module,redbug},
                                              {attribute,11,export,[{help,0}]},
                                              {attribute,13,export,[{unix,1}]},
                                              {attribute,15,export,
                                                         [{start,1},{start,2},{start,3},{start,4},{start,5}]},
                                              {attribute,16,export,[{stop,0}]},
                                              {attribute,1,file,{"src/log.hrl",1}},
                                              {function,17,'?log',2,
                                                        [{clause,17,[{var,17,...},{var,...}],[[{...}]],[{...}]},
                                                         {clause,18,[{var,...},{...}],[],[...]}]},
                                              {attribute,19,file,{"src/redbug.erl",19}},
                                              {attribute,22,record,
                                                         {cnf,[{record_field,24,{...},...},
                                                               {record_field,25,...},
                                                               {record_field,...},
                                                               {...}|...]}},
                                              {function,57,help,0,[{clause,57,[],...}]},
                                              {function,123,unix,1,
                                                        [{clause,123,...},{clause,...},{...}|...]},
                                              {function,146,to_term,1,[{clause,...},{...}]},
                                              {function,154,maybe_halt,1,[{...}]},
                                              {function,160,is_in_shell,0,[...]},
                                              {function,167,stop,0,...},
                                              {function,174,start,...},
                                              {function,176,...},
                                              {function,...},
                                              {...}|...]}}]}}