<!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>