2014-10-14 1 views
3

다음은 쉘에서 redbug를 사용하여 일부 메시지입니다 :EPER의 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 => []}]) 

이 방법은 또한에 인쇄 행 번호가 redbug의 메시지가가가?

redbug : 도움()이 보여 수행합니다

print_fun ()   custom print handler, fun/1 or fun/2; 
          fun(TrcMsg) -> <ignored> 
          fun(TrcMsg,AccOld) -> AccNew 

을하지만 더 좋은 설명은 그것을 사용하는, 그래서 메시지

에 줄 번호를 추가 할 수 있다면 내가 볼려고하지 수 있는지 어느 곳이 없다

답변

1

어떤 직설적 인 방법으로도 할 수있는 것처럼 보이지 않습니다.

이를 확인하는 가장 쉬운 방법은, 그냥 당신이 볼 수 있듯이 당신의 print_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 

당신이받는 모든 데이터를 인쇄, 당신이 얻을 모든 MFA ({Module, Function, Arguments}), 호출 프로세스 및 타임 스탬프입니다.

실제 함수 호출 행을 얻으려면 beam_lib 모듈을 사용하여 보 파일 (있는 경우)에 첨부 된 debug_info을 파 내야합니다. 난 그냥 당신이 {function, LineNumber, FunctionName, Arity, FunctionCodeAsList } 같은 튜플을 찾을 수있는 당신이 목록을 찾을 수있다이

{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,...}, 
               {...}|...]}}]}} 

처럼, 그것은 beam_lib:chunks(Module, [abstract_code]).을 사용하는 것입니다 할 seampleas 방법을 생각한다. 따라서이 목록을 탐색하고 찾고있는 함수를 찾으면 LineNumber을 추출 할 수 있습니다.

여전히 작동하지 않을 수있는 몇 가지 사항을 고려해야합니다.

  • 디스크의 실제 파일을 분석 중이므로 현재 디렉토리에 있어야합니다. VM에로드 된 내용 (코드 버전)은 수행 할 작업이 없습니다. 따라서 이것을 실제로 찾으려면 약간의 작업을해야 할 수도 있습니다. .beam
  • debug_info없이 파일을 컴파일하면이 추상 구문 트리가 생성되지 않을 수 있습니다. 그것이 귀하의 소송이 될 수 있는지 그리고 어떻게 처리 할 것인지 결정해야합니다.
  • 일부 beams은 암호화되었을 수 있으며, 일부는 다른 문제가있을 수 있습니다. 당신이 다루는 것을 느끼기 위해서 beam_lib module documentation을 읽어야합니다.

뭔가가 떠오르면 공유하십시오. 해피 해킹!

+0

당신이 그걸 가져 가면서 항상 감사드립니다. 고마워. 매크로를 호출 해 보았습니다 : -define (PRINT (Var), io : format ("DEBUG : ~ p : ~ p ~ ~ p ~ n ~ n ~ p ~ n ~ n", [? MODULE, ??, Var])). PrintFun에서 가져 왔지만 실제로 작동하지 않았습니다. 내가 redbug를 사용함에 따라 점점 더 많은 행 번호가 필요 없다는 것을 알게되었습니다. 함수에 대한 인수를 검사하여 일치 한 함수 절을 추론 할 수 있습니다. 그것은 라인 수를 따르는 것만 큼 편안하지는 않지만 실제로는 괜찮습니다. 나는 그것을 좋아합니다. 다시 한 번 감사드립니다. 해결 된 것으로 표시됩니다. – antipatreal