Erlang on FreeBSD/amd64

Brian Buchanan brian@REDACTED
Thu Feb 10 07:03:27 CET 2005


Benno,

I just did a little investigative work on this.  Here's an error I get:

=ERROR REPORT==== 9-Feb-2005::21:47:41 ===
Error in process <0.22.0> with exit value:
{badarg,[{erlang,demonitor,[{}]},{io,wait_io_mon_reply,2},{epp,scan_toks,2}]}

./disk_log.erl:none: internal error in parse_module;
crash reason: {badarg,[{erlang,demonitor,[{}]},
                       {io,wait_io_mon_reply,2},
                       {epp,scan_toks,2}]}


I instrumented the bootstrap version of the io module and discovered what
appears to be reference corruption in the interpreter after a process
waits in "receive".

My modified "io" prints out {monitor, MRef} after the call to
erlang:monitor in io:receive, {wait_io_mon_reply,MRef} at the top of
wait_io_mon_reply(), and {demonitor, MRef} right before the call to
erlang:demonitor().

The output should look like a bunch of:

{monitor,#Ref<0.0.0.122>}
{wait_io_mon_reply,#Ref<0.0.0.122>}
{demonitor,#Ref<0.0.0.122>}
{monitor,#Ref<0.0.0.124>}
{wait_io_mon_reply,#Ref<0.0.0.124>}
{demonitor,#Ref<0.0.0.124>}

etc.

And that's what I get for the first many iterations.  Then:

{monitor,#Ref<0.0.0.178>}
{wait_io_mon_reply,#Ref<0.0.0.178>}
{demonitor,{}}

(crash!)

Here's the first fragment of io:wait_mon_reply/2 so you can see my
modifications.

wait_io_mon_reply(From, Mref) when is_reference(Mref) ->
    erlang:display({wait_io_mon_reply, Mref}),
    receive
        {io_reply,From,Reply} ->
            erlang:display({demonitor, Mref}),
            erlang:demonitor(Mref),
            receive
                {'DOWN', Mref, _, _, _} -> true
            after 0 -> true


I made a few more tweaks after this to try to figure out if the
interpreter stack was being clobbered, but determined that the "From"
variable and any new variables I defined before the receive were not
affected.  I suspect something is broken in the implementation of
references.

Unfortunately, I have no real experience with the beam interpreter, and at
this point am not even sure how to get it running in gdb, so I must appeal
to someone more knowledgeable to provide some guidance here.

- Brian

-- 
Brian Buchanan <brian@REDACTED>
Principal Engineer
nCircle Network Security                             http://www.ncircle.com/



More information about the erlang-bugs mailing list