2009-12-23 2 views
62

erlang : trace/3 및 dbg 모듈을 사용하여 서버를 중단하지 않고 라이브 프로덕션 시스템의 동작을 추적하려고합니다.Erlang에서 trace 및 dbg 사용

documentationopaque (약간 넣기 위해)이며 유용한 온라인 자습서가없는 것으로 나타났습니다.

하루 종일 노력한 것은 특정 기능에서 dbg : c 및 dbg : p를 사용하여 함수를 모듈에 적용하려고 시도했지만 성공하지 못했습니다.

살아있는 Erlang 시스템에서 트레이스를 사용하는 방법에 대한 간결한 설명이있는 사람이 있습니까? 함수 호출에 대한 추적의

답변

7

그래 픽 트레이서를 선호한다면 erlyberly을 시도하십시오. 추적 기능 (현재 모든 프로세스에서)을 선택하고 dbg API를 처리 할 수 ​​있습니다.

그러나 과부하로부터 보호하지 않으므로 프로덕션 시스템에는 적합하지 않습니다.

enter image description here

82

기본 단계는 라이브가 아닌 노드에 있습니다

> 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으로 전화하십시오. 일반적인 일반 호출은 다음과 같습니다.

> 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 

난 당신이 dbg 당신을 위해 거의 모든처럼 직접 erlang:trace를 호출 할 필요가 없을 것 같아요.

라이브 노드의 황금 규칙은 셸로 추적 출력량 만 생성하여 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를 검색합니다.

+1

는 지금까지 쉘 :( –

+0

당신은 사람들은 아마도 때문에에 ... 라이브가 아닌 노드의 기본 단계 말에 * * 아무것도 보내 추적을 얻을 수 없었다 라이브 노드를 사용하면 껍질을 벗기고 잃을 수도 있습니다. –

+1

추적 기능을 사용하려면 시스템에서 일부 리소스가 필요합니다. 자주 이벤트를 추적하면 성능이 저하 될 수 있습니다. 최악의 경우에는 연락이 끊어지고, 그것은 - 붐 -. – Zed

18

실제 시스템에서는 거의 추적하지 않습니다. 시스템이 잘 구성되어 있다면 쉘에 인쇄 된 Erlang 로그를 이미 수집하고 있습니다. 이 모든 라이브 노드에서 중요하다 왜

나 파일에 추적에 자세히 설명하자 ... 강조 할 필요가 없다 : 될 수있는 바이너리 출력을 생성

파일을 추적 할 수 있으며, 변환되고 나중에 구문 분석됩니다.

(추가 분석 또는 자동 제어 시스템 등)이 예시 될 수있다 : 래핑 여러 파일 (12x50 메가 바이트)에

  • 추적.큰 트레이스를 사용하기 전에 항상 사용 가능한 디스크 공간을 확인하십시오!

    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().

  • 항상 추적 포트를 세척하지 않고 그 어떤을 보장함으로써 시작을 이전 추적은 현재 추적을 방해합니다. >dbg:tracer().

    • 시작 추적 프로세스

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

    < 3은이 경우 우리는 모든 프로세스 및 함수 호출에 대한 추적을하고 있습니다. 데이빗의 대답에서 보는 바와 같이

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

  • . 데이빗의 대답에서 보는 바와 같이

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

  • .

< 42>dbg:stop_clear().

  • 다시 모든 트레이스 출력에 기입되었는지 확인하고, 이후 불편을 회피하는 것이다. 당신이 할 수있는

:

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

  • ...

을 만 인수의 특정 유형의 특정 함수 호출로 특정 프로세스에 대한 추적하도록 패턴 매칭의 광대 한 다양한 적용 나는 잠시 다시 문제가 있었다 , 우리가 ETS 테이블의 내용을 확인해야 할 때 특정 입장이 나타나면 2-3 분 내에 추적을 중단해야했습니다.

나는 또한 Francesco Cesarini가 쓴 얼랭 프로그래밍 (Erlang Programming)을 제안한다. (Erlang Programming @ Amazon)

8

'dbg'모듈은 상당히 낮은 수준의 항목입니다. 자주 사용하는 작업에는 매우 자주 사용하는 두 가지 해킹이 있습니다 (자주 ).

  1. 에 Erlang CLI/쉘 확장 코드를 사용하십시오. 그것은 원래 Serge Aleynikov에 의해 쓰여졌 고 은 "쉘에 사용자 정의 함수를 추가하는 방법"에 유용했습니다. 모듈을 컴파일하고 ~/.erlang 파일이 해당 경로를 가리 키도록 편집하십시오 (파일의 상단의 주석 참조).

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