<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
June Kim wrote:
<blockquote
cite="mid6f80c1520705180712p673f544cvcd50fd70b478b37b@mail.gmail.com"
type="cite">
<pre wrap="">Suppose foo.erl is:
-module(foo).
-export([bar/1]).
bar(X)->
1+2+3,
5=X.
==============
8> foo:bar(5).
=ERROR REPORT==== 18-May-2007::23:08:44 ===
Error in process <0.61.0> with exit value:
{{badmatch,5},[{foo,bar,1},{shell,exprs,6},{shell,eval_loop,3}]}
** exited: {{badmatch,5},
[{foo,bar,1},{shell,exprs,6},{shell,eval_loop,3}]} **
The report isn't very helpful. Is there any way I can see the line
number of the source code that the error occured?
_______________________________________________
erlang-questions mailing list
<a class="moz-txt-link-abbreviated" href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a>
<a class="moz-txt-link-freetext" href="http://www.erlang.org/mailman/listinfo/erlang-questions">http://www.erlang.org/mailman/listinfo/erlang-questions</a>
</pre>
</blockquote>
A while back somone posted this patch for shell.erl:<br>
<br>
<font size="2">
<pre>Index: shell.erl
===================================================================
RCS file: /hipe/otp/lib/stdlib/src/shell.erl,v
retrieving revision 1.8
diff -u -r1.8 shell.erl
--- shell.erl 24 Jan 2006 11:46:11 -0000 1.8
+++ shell.erl 11 Apr 2006 20:52:30 -0000
@@ -248,10 +248,77 @@
{'EXIT', Pid, Res} ->
{Res, Eval};
{'EXIT', Eval, Reason} ->
- io:fwrite("** exited: ~P **\n", [Reason, ?LINEMAX]),
+ report_exit(Reason),
get_command1(Pid, start_eval(Bs, RT, Ds), Bs, RT, Ds)
end.
+report_exit(Reason) ->
+ {Term,Trace} = analyze_exit(Reason),
+ io:fwrite("** exited: ~P **\n~s", [Term, ?LINEMAX, Trace]).
+
+analyze_exit({Term, Stack}=Reason) when is_list(Stack) ->
+ case is_stacktrace(Stack) of
+ true ->
+ {Term, format_stacktrace(Stack)};
+ false ->
+ {Reason, ""}
+ end;
+analyze_exit(Reason) ->
+ {Reason, ""}.
+
+is_stacktrace([]) ->
+ true;
+is_stacktrace([{M,F,A}|Fs]) when is_atom(M), is_atom(F), is_integer(A) ->
+ is_stacktrace(Fs);
+is_stacktrace([{M,F,As}|Fs]) when is_atom(M), is_atom(F), is_list(As) ->
+ is_stacktrace(Fs);
+is_stacktrace(_) ->
+ false.
+
+format_stacktrace(Stack) ->
+ format_stacktrace(Stack,"in function","in call from").
+
+format_stacktrace([{M,F,A}|Fs],Pre,Pre1) when is_integer(A) ->
+ [io_lib:fwrite(" ~s ~w:~w/~w\n", [Pre,M,F,A])
+ | format_stacktrace(Fs,Pre1,Pre1)];
+format_stacktrace([{M,F,As}|Fs],Pre,Pre1) when is_list(As) ->
+ A = length(As),
+ C = case is_op(M,F,A) of
+ true when A == 1 ->
+ [A1] = As,
+ io_lib:fwrite("~s ~s", [F,format_arg(A1)]);
+ true when A == 2 ->
+ [A1, A2] = As,
+ io_lib:fwrite("~s ~s ~s",
+ [format_arg(A1),F,format_arg(A2)]);
+ false ->
+ io_lib:fwrite("~w(~s)", [F,format_arglist(As)])
+ end,
+ [io_lib:fwrite(" ~s ~w:~w/~w\n called as ~s\n",
+ [Pre,M,F,A,C])
+ | format_stacktrace(Fs,Pre1,Pre1)];
+format_stacktrace([],_Pre,_Pre1) ->
+ "".
+
+format_arg(A) ->
+ io_lib:fwrite("~P",[A,?LINEMAX]).
+
+format_arglist([A]) ->
+ format_arg(A);
+format_arglist([A|As]) ->
+ [io_lib:fwrite("~P,",[A,?LINEMAX]) | format_arglist(As)];
+format_arglist([]) ->
+ "".
+
+is_op(erlang, F, A) ->
+ erl_internal:arith_op(F, A)
+ orelse erl_internal:bool_op(F, A)
+ orelse erl_internal:comp_op(F, A)
+ orelse erl_internal:list_op(F, A)
+ orelse erl_internal:send_op(F, A);
+is_op(_M, _F, _A) ->
+ false.
+
prompt(N) ->
case is_alive() of
true -> {format,"(~s)~w> ",[node(),N]};
@@ -407,7 +474,7 @@
Ev ! {shell_rep,self(),ok},
shell_rep(Ev, Bs0, RT, Ds);
{'EXIT',Ev,Reason} -> % It has exited unnaturally
- io:fwrite("** exited: ~P **\n", [Reason,?LINEMAX]),
+ report_exit(Reason),
{{'EXIT',Reason},start_eval(Bs0, RT, Ds0), Bs0, Ds0};
{'EXIT',_Id,interrupt} -> % Someone interrupted us
exit(Ev, kill),</pre>
</font><br>
<br>
<br>
I don't think it prints line numers, but it's supposed to be more
readable<br>
</body>
</html>