2012-02-14 6 views
2

Когда я запускаю мой широковещательный сервер, я получил сообщение об ошибке:Как отлаживать в Erlang?

=ERROR REPORT==== 14-Feb-2012::16:22:29 === 
Error in process <0.757.0> with exit value: {badarg,[{mymodule1,func1,1}]} 


=ERROR REPORT==== 14-Feb-2012::16:22:30 === 
Error in process <0.751.0> with exit value: {function_clause,[{mymodule2, func2,[{#Port<0.2 
+0

Существует нет ' ts' в стандартной библиотеке. Это из какой-либо другой библиотеки, которую вы используете? –

+0

«ts» - это мой собственный модуль, я хочу знать один хороший метод отладки, чтобы получить детали. – why

ответ

3

При отладке ошибки или сбоя часто бывает полезно узнать, какой ввод и вывод получает определенная функция. Отладки утилита redbug в eper repo делает его довольно легко

Примеры:

%%% Trace a function: 
1>redbug:start("lists:sort") 
2>lists:sort([3,1,2]). 

21:41:00 <{erlang,apply,2}> {lists,sort,[[3,1,2]]} 

%%% Trace a module and also get the return value 
3>redbug:start("string->return") 
4>string:to_upper("foo"). 

21:41:10 <{erlang,apply,2}> {string,to_upper,["foo"]} 
21:41:10 <{erlang,apply,2}> {string,'-to_upper/1-lc$^0/1-0-',["foo"]} 
... 
21:41:10 <{erlang,apply,2}> {string,to_upper,1} -> "FOO" 

Так что в вашем коде я бы, например, увидеть, что вход mymodule1: func1 получает:

1>redbug:start("mymodule1:func1"). 
2> %% redo the call that caused the crash 
+0

eper довольно хорошо !! – why

3

function_clause означает просто, что нет определения для функции mymodule2:func2, которая соответствует аргументам. Например.

func2({X, Y}) -> ... %% only accepts a tuple of size 2 

func2([1, 2, 3])%% called with a list instead; will fail with function_clause 

badarg с функцией может быть выброшен из-за неправильных аргументов встроенной функции: http://erlang.2086793.n4.nabble.com/function-badarg-td3645808.html

Смотреть список других причин отказа здесь: http://learnyousomeerlang.com/errors-and-exceptions

Для отладки: 1) последний выпуск Erlang (R15B) должен включать номера строк в сообщениях об исключениях; 2) вы можете использовать debugger, который поставляется с Erlang.

+0

Многие люди говорили: «Эрланг хорош в обнаружении ошибки», но я думаю, что Ruby лучше, потому что Ruby может дать вам подробные обратные следы, когда появилась ошибка – why

Смежные вопросы