new stack backtrace
Ulf Wiger
etxuwig@REDACTED
Tue Dec 14 11:09:44 CET 1999
On Tue, 14 Dec 1999, Martin Bjorklund wrote:
[...]
mbj>init_gws(Node) ->
mbj> Cf = bt_cmd:bgetconfig(Node, cluster),
mbj> Gws =
mbj> foldl(
mbj> fun({_, "FrontendCluster", _, Vs}, Gws1) ->
mbj> foldl(
mbj> fun({_,Gw,[SNd, Ip, SPort, Profile],_},Gws2) ->
mbj> Nd = list_to_atom(SNd),
mbj> Port = list_to_integer(SPort),
mbj> [{to_proto(Gw), Nd, Ip, Port, Profile} | Gws2];
mbj> (_, Gws2) ->
mbj> Gws2
mbj> end, Gws1, Vs);
mbj> (_, Gws1) ->
mbj> Gws1
mbj> end, [], Cf),
mbj> GwRs = collect(Gws),
mbj> foreach(fun(GwR) -> ets:insert(bt_tab, {{gw, GwR#bt_gw.protocol}, GwR}) end,
mbj> GwRs).
mbj>
mbj>
mbj>... after I got this crash:
mbj>
mbj> error_info: {undef,[{config_file,parse_string,["sh: /home...\n"]},
mbj> {bt_conf,init_gws,1},
mbj> {bt_conf,init_tab,1},
mbj> {btest,init_server,1},
mbj> {proc_lib,init_p,5}]}
mbj>
[...]
mbj>Obviously, I have no calls to config_file:parse_string in
mbj>init_gws/1, as indicated by the backtrace. But, init_gws calls
mbj>bt_cmd:get_config, which looks like this:
mbj>
mbj>bgetconfig(Node, Type) ->
mbj> Cmd = cmd("bgetconfig"),
mbj> ibgetconfig(Cmd ++ " -t " ++ atom_to_list(Type) ++ " " ++
mbj> atom_to_list(Node)).
mbj>
mbj>ibgetconfig(Cmd) ->
mbj> Res = os:cmd(Cmd),
mbj> config_file:parse_string(Res).
mbj>
mbj>
mbj>... and there's the error.
mbj>
mbj>
mbj>The first question is why these last two calls don't show up in the
mbj>stack backtrace?
I know this one... I think! (:
ibgetconfig/1 is tail-recursive, so it doesn't consume a stack frame
(I'm not sure whether that explanation is technically correct...)
I've been surprised by this myself, but it's fairly logical, I think.
Only functions with outstanding computations will show up in the stack
trace.
/Uffe
--
Ulf Wiger, Chief Designer AXD 301 <ulf.wiger@REDACTED>
Ericsson Telecom AB tfn: +46 8 719 81 95
Varuvägen 9, Älvsjö mob: +46 70 519 81 95
S-126 25 Stockholm, Sweden fax: +46 8 719 43 44
More information about the erlang-questions
mailing list