ProgramingTip

Erlang에서 trace 및 dbg 사용

bestdevel 2020. 11. 14. 10:54
반응형

Erlang에서 trace 및 dbg 사용


erlang : trace / 3 및 dbg 모듈을 중단하지 않고 라이브하여 시스템의 동작을 추적합니다.

문서 입니다 불투명 (약간을 넣어) 및 온라인 유용한 안내가있을 때.

내가 하루 종일 노력한 것은 dbg : c 및 dbg : p를 사용하여 모듈 : 기능에 추적을 시도하여 특정 함수에서 일어나는 일을 시도하는 것이 전혀 성공하지 않습니다.

라이브 얼랭 시스템에서 추적을 사용하는 방법에 대한 간결한 설명이있는 사람이 있습니까?


그래픽 추적기를 선호한다면 erlyberly 를 시도해 행동 . 추적하려는 함수 (현재 모든 프로세스에서)를 선택하고 dbg API를 처리 할 수 ​​있습니다.

그러나 발송 된 것이 발송되지 않습니다.

여기에 이미지 설명 입력


함수 호출 추적의 기본 단계는 활성이 아닌 노드에 있습니다.

> dbg:start().   % start dbg
> dbg:tracer().  % start a simple tracer process
> dbg:tp(Module, Function, Arity, []).   % specify MFA you are interested in
> dbg:p(all, c).   % trace calls (c) of that MFA for all processes.

... trace here

> dbg:stop_clear().   % stop tracer and clear effect of tp and p calls.

동시에 여러 기능을 추적 할 수 있습니다. tp함수를 호출 하여 함수를 추가합니다 . 내 보내지 않은 함수를 추적 예측 tpl. 함수를 선택 ctp또는 ctpl방식으로 호출하십시오 . 일반적인 tp 호출은 다음과 가변합니다.

> dbg:tpl(Module, '_', []).  % all calls in Module
> dbg:tpl(Module, Function, '_', []).   % all calls to Module:Function with any arity.
> dbg:tpl(Module, Function, Arity, []). % all calls to Module:Function/Arity.
> dbg:tpl(M, F, A, [{'_', [], [{return_trace}]}]).   % same as before, but also show return value.

마지막 인수는 일치 사양입니다. 을 사용하여이를 가지고 놀 수 있습니다 dbg:fun2ms.

p () 호출로 추적 할 프로세스를 선택할 수 있습니다. 항목은 erlang : trace에 설명되어 있습니다. 일부 호출은 다음과 가변됩니다.

> dbg:p(all, c).   % trace calls to selected functions by all functions
> dbg:p(new, c).   % trace calls by processes spawned from now on
> dbg:p(Pid, c).   % trace calls by given process
> dbg:p(Pid, [c, m]).  % trace calls and messages of a given process

난 당신이 직접 호출 할 필요가 없을 것 같음 erlang:trace, 같은 dbg거의 모든 작업을 수행합니다.

라이브 노드의 황금률은 셸에 추적 출력을 생성하여 dbg:stop_clear().. :)

나는 종종 중지되는 이벤트 자동으로 중지되는 추적기를 사용합니다. 예를 들면 :

dbg:tracer(process, {fun (_,100) -> dbg:stop_clear();
                        (Msg, N) -> io:format("~p~n", [Msg]), N+1 end, 0
                    }).

원격 노드 (또는 여러 노드)에 디버깅을 찾고 있다면, 검색 pan, eper, inviso또는 onviso.


라이브 시스템에서 우리는 거의 쉘로 추적하지 않습니다. 시스템이 잘 구성되어 있으면 이미 쉘에 인쇄 된 Erlang 로그를 수집하고있는 것입니다. 라이브 노드에서 중요한 이유를 강조 할 필요가 없습니다.

파일 추적에 대해 자세히 설명하겠습니다.

나중에 변환하고 구문 분석 할 수있는 바이너리 출력을 생성하는 파일로 추적 할 수 있습니다. (추가 분석 또는 자동 제어 시스템 등)

예를 들면 다음과 같습니다.

  • 래핑 된 여러 파일 (12x50MB)을 추적합니다. 이러한 큰 추적을 사용하기 전에 항상 사용 가능한 디스크 공간을 확인하십시오!

    dbg:tracer(port,dbg:trace_port(file,{"/log/trace",wrap,atom_to_list(node()),50000000,12})).
    

    dbg:p(all,[call,timestamp,return_to]).

    • 라이브 노드의 쉘에 아무것도 입력하기 전에 항상 테스트 노드에서 테스트하십시오!
    • 스크립트를 먼저 시도하려면 테스트 노드 또는 복제본 노드가있는 것이 가장 좋습니다.

기본 추적 명령 시퀀스를 살펴 보겠습니다.

<1> dbg:stop_clear().

  • 항상 추적 포트를 플러시하고 이전 추적이 현재 추적을 방해하지 않는지 확인하여 시작하십시오.

<2> dbg:tracer().

  • 추적 프로세스를 시작하십시오.

<3> dbg:p(all,[call, timestamp]).

  • 이 경우 우리는 모든 프로세스와 함수 호출을 추적합니다.

<4> dbg:tp( ... ).

  • Zed의 답변에서 볼 수 있습니다.

<5> dbg:tpl( ... ).

  • Zed의 답변에서 볼 수 있습니다.

<42> dbg:stop_clear().

  • 다시 말하지만 모든 트레이스가 출력에 기록되었는지 확인하고 이후의 불편 함을 피하는 것입니다.

다음을 수행 할 수 있습니다.

  • 주어진 시간 또는 이벤트에서 추적을 중지하기 위해 쉘에서 fun ()-s를 정의하여 트리거를 추가하십시오. 재귀 적 fun ()-s가이를 달성하는 데 가장 좋지만 적용 할 때는 매우주의해야합니다.

  • 특정 유형의 인수를 사용하는 특정 함수 호출로 특정 프로세스 만 추적 할 수 있도록 다양한 패턴 일치를 적용합니다.

ETS 테이블의 내용을 확인하고 특정 항목이 나타나면 2-3 분 이내에 추적을 중지해야하는 문제가있었습니다.

나는 또한 Francesco Cesarini가 쓴 책 Erlang Programming을 제안합니다. ( 아마존의 얼랭 프로그래밍 )


'dbg'모듈은 매우 낮은 수준의 것입니다. 일반적으로 필요한 작업을 위해 자주 사용하는 두 가지 해킹이 있습니다.

  1. http://www.snookles.com/erlang/user_default.erl 에서 Erlang CLI / shell 확장 코드를 사용 하십시오 . 원래는 Serge Aleynikov에 의해 (내가 아는 한) 작성되었으며 유용한 "그래서 셸에 사용자 지정 함수를 추가하는 방법"예제였습니다. 모듈을 컴파일하고 경로를 가리 키도록 ~ / .erlang 파일을 편집합니다 (파일 상단의 주석 참조).

  2. EPER 유틸리티 모음에 번들로 제공되는 " redbug "유틸리티를 사용하십시오 . 'dbg'를 사용하여 몇 초 안에 수백만 개의 추적 이벤트를 생성하는 것은 매우 쉽습니다. 프로덕션 환경에서 그렇게하면 재앙이 될 수 있습니다. 개발 또는 프로덕션 용도의 경우 redbug를 사용하면 추적으로 인한 과부하로 실행중인 시스템을 종료하는 것이 거의 불가능합니다.

참고 URL : https://stackoverflow.com/questions/1954894/using-trace-and-dbg-in-erlang

반응형