[erlang-questions] werl R14A on windows 7 frequently crashes during file access
Brian Williams
mixolyde@REDACTED
Mon Jul 19 15:24:24 CEST 2010
On Sat, Jul 17, 2010 at 5:30 PM, Tuncer Ayaz <tuncer.ayaz@REDACTED> wrote:
> On Thu, Jul 15, 2010 at 6:39 PM, Brian Williams wrote:
>> I'm not entirely sure what combination of running software is causing
>> this. I have a program that opens a list of log files (~100kb to
>> ~200kb), reads one a line at a time, matches the line against some
>> regexes, prints a report and finishes). Sometimes it works without a
>> problem. But other times werl will crash one or two lines into reading
>> the first log file, or when it opens up the report file. I have my
>> .erl, .beam and final report file in a Dropbox directory, which may be
>
> Hi Brian,
>
> I don't expect Dropbox to be the problem but have you tested on
> a Windows 7 install without Dropbox ever installed?
>
I have run a bunch of other examples and my own code right off beams
in drop box before. Just none that have done file i/o, but I can move
these files elsewhere and try that, too.
>> Win7 gives me a report like this when it crashes:
>> Problem signature:
>> Problem Event Name: APPCRASH
>> Application Name: werl.exe
>> Application Version: 0.0.0.0
>> Application Timestamp: 4c17b8f1
>> Fault Module Name: beam.smp.dll
>> Fault Module Version: 0.0.0.0
>> Fault Module Timestamp: 4c17b83a
>> Exception Code: c0000005
>> Exception Offset: 000cc562
>> OS Version: 6.1.7600.2.0.0.256.48
>> Locale ID: 1033
>> Additional Information 1: 0a9e
>> Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
>> Additional Information 3: 0a9e
>> Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
>
> If you have a Windows crash dump for that I would make a backup of
> the dump. Just in case...
>
Where would I look for this dump? Would I be able to make sense of it at all?
>> {ok, WarningExp} = re:compile("warning", [caseless]),
>> {ok, ErrorExp} = re:compile("error", [caseless]),
>>
>> Compiled_Tests = [
>> {warnings, warning_exps(), WarningExp},
>> {errors, error_exps(), ErrorExp}],
>> Report = scan_lines(Compiled_Tests, Dev, io:get_line(Dev, '')),
>
> What's the definition of scan_lines/3 (what does it do with
> the result of io:get_line/2 and with the compiled patterns)?
>
Here's the rest except for the report printing, which is pretty simple.
% starts an empty report for accumulation
scan_lines(Compiled_Tests, Dev, Line) ->
scan_lines(Compiled_Tests, Dev, Line,
[{warnings, []}, {errors, []}]).
% reached end of file, return report
scan_lines(_Compiled_Tests, _Dev, eof, Report) -> Report;
scan_lines(Compiled_Tests, Dev, Line, Report) ->
% match line and update report
% io:format("Attempting to match line: ~s~n", [Line]),
UpdatedReport = update_report(Compiled_Tests, Line, Report),
% get next line and recurse
scan_lines(Compiled_Tests, Dev, io:get_line(Dev, ''), UpdatedReport).
%% Takes a line, scans for errors and warnings and updates the report
update_report([], _Line, Report) -> Report;
update_report([{Group, Tests, GroupMatch} | Compiled_Tests], Line, Report) ->
case re:run(Line, GroupMatch) of
{match, _Captured} ->
% io:format("Matched ~p, checking for specific ~p
errors~n", [Group, Group]),
check_test(Line, Group, Tests, Report);
nomatch -> update_report(Compiled_Tests, Line, Report)
end.
check_test(Line, Group, [], Report) ->
io:format("Unmatched ~p for line: ~s", [Group, Line]),
increment_report(Report, {Group, unknown, "Non-matched line"});
check_test(Line, Group, [{TestName, Exp, Test} | RestTests], Report) ->
case re:run(Line, Exp) of
{match, _TestCapture} ->
% return new report, don't recurse
% io:format("Matched a test, incrementing: ~p~n", [TestName]),
increment_report(Report, {Group, TestName, Test});
nomatch ->
% try the next test
check_test(Line, Group, RestTests, Report)
end.
increment_report(Report, {Group, TestName, Test}) ->
% get the group of counts in the report that we're working with
{Group, Counts} = lists:keyfind(Group, 1, Report),
% io:format("Got counts: ~p for test group: ~p~n", [Counts, Group]),
case lists:keyfind(TestName, 1, Counts) of
% if that test is already in the report, increment
{TestName, CurrentCount, _MatchTest} ->
% io:format("Replacing count with ~p~n", [{TestName,
CurrentCount +1}]),
lists:keyreplace(Group, 1, Report, {Group,
lists:keyreplace(TestName, 1, Counts, {TestName,
CurrentCount + 1, Test})});
% else, add it in with initial count of 1
false ->
% io:format("Couldn't find test ~p in report, adding a new
one~n", [TestName]),
lists:keyreplace(Group, 1, Report, {Group, [{TestName, 1,
Test} | Counts]})
end.
--
Brian E. Williams
mixolyde@REDACTED
http://www.techhouse.us/wordpress-mu/brianw
"Never attribute to malice that which can be adequately
explained by stupidity." - Hanlon's Razor
More information about the erlang-questions
mailing list