어떤 직설적 인 방법으로도 할 수있는 것처럼 보이지 않습니다.
이를 확인하는 가장 쉬운 방법은, 그냥 당신이 볼 수 있듯이 당신의 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을 읽어야합니다.
뭔가가 떠오르면 공유하십시오. 해피 해킹!
당신이 그걸 가져 가면서 항상 감사드립니다. 고마워. 매크로를 호출 해 보았습니다 : -define (PRINT (Var), io : format ("DEBUG : ~ p : ~ p ~ ~ p ~ n ~ n ~ p ~ n ~ n", [? MODULE, ??, Var])). PrintFun에서 가져 왔지만 실제로 작동하지 않았습니다. 내가 redbug를 사용함에 따라 점점 더 많은 행 번호가 필요 없다는 것을 알게되었습니다. 함수에 대한 인수를 검사하여 일치 한 함수 절을 추론 할 수 있습니다. 그것은 라인 수를 따르는 것만 큼 편안하지는 않지만 실제로는 괜찮습니다. 나는 그것을 좋아합니다. 다시 한 번 감사드립니다. 해결 된 것으로 표시됩니다. – antipatreal