2010-03-26 3 views
5

새로운 언어를 배우는 동안 일반적으로 어리석은 println을 사용하여 특정 시간에 어떤 값이 있는지 확인합니다. 일반적으로 언어는 일반적으로 동등한 문자열을 사용할 수 있기 때문에 충분합니다. Erlang을 사용하여 같은 접근법을 시도 할 때 목록이 아닌 값이 인쇄 될 때 webapp이 "중단"됩니다. 이것은 인쇄되는 변수가 목록 대신 튜플 인 경우 발생합니다. 아무 오류, 예외, 아무것도 ... 그냥 응답하지 않습니다. 자, 내가 쓰고있는 것에 대해 조심스럽게 말하면서 더 많은 것을 배울수록 상황이 나아지고 있습니다. 그러나 나는 stdout에 값을 더 맹목적으로 인쇄하는 것이 더 확실한 방법일까요?
감사합니다, 얼랑에서erlang io : 형식 및 걸려있는 웹 응용 프로그램

--tim

+5

일부 코드를 알려주세요. –

+0

Erlang 변수는 정적 기호이므로이를 확인할 필요가 없습니다. 이것이 Roberto Aloi가 추적이 더 효과적이라고 말한 이유입니다. 함수의 중간에 충격적인 데이터베이스가 돌아 오지 않도록 코드를 작성해보십시오. 데이터 수집 작업과 데이터 처리 작업을 분리하여 컬렉션의 출력이 처리의 전체 입력이되고 DB의 미친 입력이 있어도 무엇이 진행되고 있는지 항상 알 수 있습니다. – zxq9

답변

16

, 그들은리스트, 튜플 또는 다른 어떤 경우 다른 언어로, 당신은 당신의 변수에 상관없이 인쇄 할 수 있습니다.

내 느낌, 즉 인쇄, 당신은 (그냥 추측) 같은 것을하고있는 경우 :

: 당신이 인수 목록을 전달하기로되어 있기 때문에

io:format("The value is: ~p.", A). 

이것은 잘못된 것입니다

io:format("The value is: ~p.", [A]). 

여기서 A는 무엇이든 될 수 있습니다.

나는 일반적으로 사용하기 편안하게 찾을 수 :

erlang:display/1 

변수를 인쇄 할 수 있습니다.

또한 추적 기능은 일반적으로 인쇄물을 사용하는 대신 응용 프로그램을 디버깅하는 더 좋은 방법입니다. 참조하십시오

http://aloiroberto.wordpress.com/2009/02/23/tracing-erlang-functions/

2

웹 어플리케이션을 개발 나는 error_logger module 을 사용 나는 보통이

-ifdef(debug). 
-define(idbg(FmtStr, Err), 
     error_logger:info_msg("~p (line ~p): " FmtStr "~n", 
           [?MODULE, ?LINE | Err])). 
-define(rdbg(Term), error_logger:info_report(Term)). 
-else. 
-define(idbg(_FmtStr, _Err), void). 
-define(rdbg(_Term), void). 
-endif. 

같은 몇 가지 매크로를 정의 당신이 좋아하는 뭔가 매크로를 호출

code... 
?rdbg(ErlangTerm), 
other code... 

동안 개발 모듈을 컴파일하려면 다음을 입력하십시오 :

erlc -Ddebug *.erl 

그리고 erlang 콘솔에 정보 메시지가 표시됩니다.

0

또한 링크가없는 종료 프로세스가 없으면 다른 프로세스가 대기하고 시간 초과되지 않아서 이상한 매달린 부분이 생길 수 있습니다.

관련 문제