Процесс Yaws умер: {{badmatch,‹‹››}

Я просматриваю очень простую книгу по erlang, используя yaws. Я редактирую один файл yaws и обновляю браузер. Часто (в третий раз) процесс просто начинает показывать эту ошибку. и я смотрю и ищу синтаксическую ошибку или что-то еще, и в конце концов я просто перезапускаю процесс, и все работает. без каких-либо изменений исходного файла.

прямо сейчас это исходный файл, который вызвал ошибку в последний раз

<erl>
out(Arg) ->
        {ehtml,
                {table, [{width, "100%"}],
                        {tr,[],
                                [{td, [{width, "50%"}], "hello world!"},
                                {td, [{width, "50%"}], "hi again."}]
                        }
                }
        }.

</erl>

Я попытался найти ошибку, но там, где все результаты поиска имеют значимый контекст, например «нет доступа», все, что я получаю, это «‹‹>>»

=ERROR REPORT==== 26-Nov-2013::20:17:32 ===
Yaws process died: {{badmatch,<<>>},
                    [{yaws_server,skip_data,2,
                                  [{file,"yaws_server.erl"},{line,2951}]},
                     {yaws_server,deliver_dyn_file,6,
                                  [{file,"yaws_server.erl"},{line,2717}]},
                     {yaws_server,aloop,4,
                                  [{file,"yaws_server.erl"},{line,1152}]},
                     {yaws_server,acceptor0,2,
                                  [{file,"yaws_server.erl"},{line,1013}]},
                     {proc_lib,init_p_do_apply,3,
                               [{file,"proc_lib.erl"},{line,227}]}]}

Некоторая информация о версии:

  • Рыскание 1,94
  • Debian GNU/Linux 7.2 (хриплый)
  • Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux
  • Erlang R15B01 (erts-5.9.1) [источник] [64-бит] [smp:4:4] [асинхронные потоки:0] [хайп] [опрос ядра: ложь]

Любые идеи, что это говорит мне?

Кроме того, приветствуются любые предложения отладчиков, подходящих для начинающих.


person gcb    schedule 27.11.2013    source источник
comment
На мастере yaws из github, который представляет собой всего несколько коммитов после версии 1.98, я не могу воспроизвести эту проблему. Можете ли вы попробовать обновиться до версии 1.98 отсюда, чтобы проверить, возникает ли та же проблема?   -  person Steve Vinoski    schedule 28.11.2013
comment
Что касается отладчиков, то есть отладчик Erlang, но, по моему мнению, это вместо этого стоит изучить трассировку Erlang, так как она намного мощнее и проще, чем отладчик . За более чем 7 лет использования Erlang я использовал отладчик только дважды, но постоянно использую трассировку.   -  person Steve Vinoski    schedule 28.11.2013
comment
Я также только что попытался победить копию вашего файла .yaws с осадой против Yaws 1.94 и R15B01, но все еще не смог воспроизвести его.   -  person Steve Vinoski    schedule 28.11.2013


Ответы (2)


Я думаю, что для отладки будет полезно использовать трассировку Erlang. Мы хотим выяснить, почему функция yaws_server:skip_data/2 получает исключение badmatch, и, в частности, почему ей передается пустой двоичный файл, поскольку это единственный способ столкнуться с этой ошибкой. Итак, нам нужно проследить это состояние. Попробуйте выполнить следующие шаги (и не забудьте поставить точку в конце каждой команды оболочки Erlang):

  1. Запустить рыскание в интерактивном режиме: yaws -i
  2. Как только появится yaws, нажмите Enter, чтобы получить приглашение оболочки Erlang.
  3. Создайте функцию трассировки для dbg, чтобы мы получили разумно отформатированную обратную трассировку из данных трассировки: F = fun({trace,_,_,_,Dump},[]) -> io:format("~s~n", [binary_to_list(Dump)]), [] end.
  4. Включите трассировку с помощью этой команды: dbg:tracer(process, {F, []}).
  5. Трассировать звонки во всех процессах: dbg:p(all, call).

Теперь проследите условие получения yaws_server:skip_data/2 пустого двоичного файла в качестве первого аргумента, и когда это произойдет, получите обратную трассировку:

dbg:tpl(yaws_server,skip_data,dbg:fun2ms(fun([<<>>, _]) -> message(process_dump()) end)).

После этого начните открывать свою страницу .yaws, пока не спровоцируете условие, после чего в вашей оболочке Erlang отобразится обратная трассировка. Если вы получили этот след, скопируйте его в gist или pastebin и разместите здесь ссылку на него в качестве продолжения.

person Steve Vinoski    schedule 28.11.2013
comment
Спасибо! попробуем, как только это произойдет. Я заметил, что это происходит только тогда, когда я много меняю файл. - person gcb; 01.12.2013

Если я прав, вывод функции out должен быть списком. Я не проверял весь ваш код, но должно работать следующее:

<erl>
out(Arg) ->
        [{ehtml,
                {table, [{width, "100%"}],
                        {tr,[],
                                [{td, [{width, "50%"}], "hello world!"},
                                {td, [{width, "50%"}], "hi again."}]
                        }
                }
        }].

</erl>
person Pascal    schedule 27.11.2013
comment
это необязательно. вы можете вернуть кортеж (все более ранние примеры в книге — это всего лишь один кортеж) или список, если хотите, отправьте заголовки вместе с выводом html. Помните, что я упомянул, что достаточно просто перезапустить сервер, чтобы избавиться от сбоя. никаких изменений в коде не должно происходить. - person gcb; 27.11.2013
comment
упс, я невнимательно прочитал ваш вопрос... Не так уж и плохо, я кое-что узнал. - person Pascal; 28.11.2013