<div dir="ltr">Hi,<div>one of the greatest engineering rules is: If it works, don't touch it. And I'm far far away to teach anybody how to code but it itches. So I did some touches here</div><div><br></div><div>============</div>
<div><br></div><div><div>-module(report).</div><div><br></div><div>-export([crash_report/0, crash_report/1, make_report/0]).</div><div><br></div><div>crash_report() -></div><div>    crash_report("/tmp/erl_crash.dump").</div>
<div><br></div><div>crash_report(FileName) -></div><div>    file:write_file(FileName, make_report()).</div><div><br></div><div>make_report() -></div><div>    Date = rfc1123_local_date(),</div><div>    Header = iolist_to_binary([<<"=erl_crash_dump:0.2\n">>, Date, <<"\nSystem version: ">>]),</div>
<div>    Ets = ets_info(),</div><div>    [</div><div>        Header,</div><div>        erlang:system_info(system_version),</div><div>        erlang:system_info(info),</div><div>        erlang:system_info(procs),</div><div>
        Ets,</div><div>        erlang:system_info(dist),</div><div>        <<"=loaded_modules\n">>,</div><div>        binary:replace(erlang:system_info(loaded), <<"\n">>, <<"\n=mod:">>, [global])</div>
<div>        ].</div><div><br></div><div>ets_info() -></div><div>    [ets_table_info(T) || T<-ets:all()].</div><div><br></div><div>ets_table_info(Table) -></div><div>    Info = ets:info(Table),</div><div>    Owner = pid_to_list(proplists:get_value(owner, Info)),</div>
<div>    Name = atom_to_list(proplists:get_value(name, Info)),</div><div>    Objects = integer_to_list(proplists:get_value(size, Info)),</div><div>    iolist_to_binary([</div><div>            <<"=ets:">>, Owner,</div>
<div>            <<"\nTable: ">>, Name,</div><div>            <<"\nName: ">>, Name,</div><div>            <<"\nObjects: ">>, Objects, $\n</div><div>            ]).</div>
<div><br></div><div>rfc1123_local_date() -></div><div>    rfc1123_local_date(os:timestamp()).</div><div><br></div><div>rfc1123_local_date({A, B, C}) -></div><div>    rfc1123_local_date(calendar:now_to_local_time({A, B, C}));</div>
<div>rfc1123_local_date({{YYYY, MM, DD}, {Hour, Min, Sec}}) -></div><div>    DayNumber = calendar:day_of_the_week({YYYY, MM, DD}),</div><div>    io_lib:format(</div><div>        "~s, ~2.2.0w ~3.s ~4.4.0w ~2.2.0w:~2.2.0w:~2.2.0w GMT",</div>
<div>        [httpd_util:day(DayNumber), DD, httpd_util:month(MM), YYYY, Hour, Min, Sec]</div><div>        );</div><div>rfc1123_local_date(Epoch) when erlang:is_integer(Epoch) -></div><div>    rfc1123_local_date(calendar:gregorian_seconds_to_datetime(Epoch+62167219200)).</div>
</div><div><br></div><div>==========</div><div><br></div><div>No wonder they are telling Erlang has bad string support if they see code like previous. I think iolist is one of most powerful structures for manipulating strings and one of strengths of Erlang so we should use it and use it well. Converting list or iolist to binary over and over again is very bad idea. It is very slow and doesn't saves any memory until GC occurs. These two calls to iolist_to_binary/1 in code above is unnecessary but shows the idea. Call it early when make string which you are not intended to touch and is big enough to save memory but most importantly never ever call it again until you have a very good reason to do. It would make unnecessary copying. Let Erlang io subsystem do the rest.</div>
<div><br></div><div>Sorry for this rant but it was itchy<br>With best regards</div><div>    Hynek Vychodil</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Feb 21, 2014 at 4:47 AM, Matthew Evans <span dir="ltr"><<a href="mailto:mattevans123@hotmail.com" target="_blank">mattevans123@hotmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div><div dir="ltr">Hi,<div><br></div><div>I took it on myself to write a little module. This will produce a crash report that will display most of the important data that can be loaded into the crash dump viewer. From Erlang run report:crash_report(). <div>
<br></div><div>The crash dump goes to /tmp/erl_crash.dump and can be viewed from Erlang via your browser when you run crashdump_viewer:start(). from your Erlang shell.</div><div><br></div><div>=========<br><div><br></div>
<div><div><div>-module(report).</div><div><br></div><div>-export([crash_report/0]).</div><div><br></div><div>crash_report() -></div><div>    Date = erlang:list_to_binary(rfc1123_local_date()),</div><div>    Header = binary:list_to_bin([<<"=erl_crash_dump:0.2\n">>,Date,<<"\nSystem version: ">>]),</div>
<div>    Ets = ets_info(),</div><div>    Report = binary:list_to_bin([Header,erlang:list_to_binary(erlang:system_info(system_version)),erlang:system_info(info),erlang:system_info(procs),Ets,erlang:system_info(dist),</div>
<div>                <<"=loaded_modules\n">>,binary:replace(erlang:system_info(loaded),<<"\n">>,<<"\n=mod:">>,[global])]),</div><div>    file:write_file("/tmp/erl_crash.dump",Report).</div>
<div><br></div><div>ets_info() -></div><div>    binary:list_to_bin([ets_table_info(T)||T<-ets:all()]).</div><div><br></div><div>ets_table_info(Table) -></div><div>    Info = ets:info(Table),</div><div>    Owner = erlang:list_to_binary(erlang:pid_to_list(proplists:get_value(owner,Info))),</div>
<div>    TableN = erlang:list_to_binary(erlang:atom_to_list(proplists:get_value(name,Info))),</div><div>    Name = erlang:list_to_binary(erlang:atom_to_list(proplists:get_value(name,Info))),</div><div>    Objects = erlang:list_to_binary(erlang:integer_to_list(proplists:get_value(size,Info))),</div>
<div>    binary:list_to_bin([<<"=ets:">>,Owner,<<"\nTable: ">>,TableN,<<"\nName: ">>,Name,<<"\nObjects: ">>,Objects,<<"\n">>]).</div>
<div><br></div><div>rfc1123_local_date() -></div><div>    rfc1123_local_date(os:timestamp()).</div><div>rfc1123_local_date({A,B,C}) -></div><div>    rfc1123_local_date(calendar:now_to_local_time({A,B,C}));</div><div>
rfc1123_local_date({{YYYY,MM,DD},{Hour,Min,Sec}}) -></div><div>    DayNumber = calendar:day_of_the_week({YYYY,MM,DD}),</div><div>    lists:flatten(</div><div>        io_lib:format("~s, ~2.2.0w ~3.s ~4.4.0w ~2.2.0w:~2.2.0w:~2.2.0w GMT",</div>
<div>            [httpd_util:day(DayNumber),DD,httpd_util:month(MM),YYYY,Hour,Min,Sec]));</div><div>rfc1123_local_date(Epoch) when erlang:is_integer(Epoch) -></div><div>    rfc1123_local_date(calendar:gregorian_seconds_to_datetime(Epoch+62167219200)).</div>
</div><div><br></div><br><div><hr>From: <a href="mailto:vladdu55@gmail.com" target="_blank">vladdu55@gmail.com</a><br>Date: Thu, 20 Feb 2014 10:30:39 +0100<br>To: <a href="mailto:mabrek@gmail.com" target="_blank">mabrek@gmail.com</a><br>
CC: <a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>Subject: Re: [erlang-questions] Creating a diagnostic memory dump of live erlang VM<div><div class="h5"><br><br><div dir="ltr">
<div><div>Hi,</div><div><br></div><div>On Thu, Feb 20, 2014 at 9:26 AM, Anton Lebedevich <span dir="ltr"><<a href="mailto:mabrek@gmail.com" target="_blank">mabrek@gmail.com</a>></span> wrote:<br>

<blockquote style="border-left:1px #ccc solid;padding-left:1ex"><div>Another thing which I missed a lot after converting from java to erlang<br></div>
is a thread dump. It turned out that it's possible to get all<br>
stacktraces for all processes (even with function arguments) via<br>
erlang:system_info(procs).<br>
<br>
It returns them as text so it's better to dump it to file immediately:<br>
file:write_file("/tmp/procs.txt",erlang:system_info(procs)).<br>
<br>
Format of these traces is quite interesting (undocumented) the best<br>
description I found is in the mailing list<br>
<a href="http://erlang.org/pipermail/erlang-questions/2012-November/070609.html" target="_blank">http://erlang.org/pipermail/erlang-questions/2012-November/070609.html</a></blockquote><div><br></div><div>I might just as well ask the obvious question: why is not this information available even as normal Erlang terms, so that one doesn't need to parse it? When writing a crash dump, it doesn't matter, but if it should be used at runtime it's a pain to parse it... This applies to the other results from system_info/1 that are dumped as text.</div>


<div><br></div><div>regards,</div><div>Vlad</div><div><br></div></div></div></div>
<br></div></div><div class="">_______________________________________________
erlang-questions mailing list
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a></div></div></div></div></div>                                         </div></div>
<br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br></div>