ID:2689392
 
BYOND Version:513
Operating System:Windows 10 Home 64-bit
Web Browser:Opera LVL2 (core: 75.0.3969.282)
Applies to:Dream Daemon
Status: Open

Issue hasn't been assigned a status value.
Descriptive Problem Summary: Upon starting up my server on Dream Daemon, it seems to run fine. But once I log in and start moving around, or even standing still, about 60 seconds in, Dream Seeker starts hanging with me being able to do anything. Then about 30 seconds later the connection is closed and Dream Daemon just shuts itself down. No logs or runtimes, or any sort of events to explain what is going on other than what is shown in the Event Viewer.

UPDATE: Seems even when I do not log on, it still wants to crash.

Numbered Steps to Reproduce Problem: Startin the server on Dream Daemon and logging onto the game. Usually hangs a minute later.

Code Snippet (if applicable) to Reproduce Problem: Not applicable.


Expected Results:No hanging and Dream Daemon crashing.

Actual Results:
Faulting application name: dreamdaemon.exe, version: 5.0.513.1542, time stamp: 0x601349ac
Faulting module name: byondcore.dll, version: 5.0.513.1542, time stamp: 0x6013491d
Exception code: 0xc0000005
Fault offset: 0x00106b09
Faulting process id: 0x6244
Faulting application start time: 0x01d758da29fc19fb
Faulting application path: C:\byond\bin\dreamdaemon.exe
Faulting module path: C:\byond\bin\byondcore.dll
Report Id: d463361e-baa0-473c-95ea-5b899bd6cc22
Faulting package full name:
Faulting package-relative application ID:


Faulting application name: dreamdaemon.exe, version: 5.0.513.1542, time stamp: 0x601349ac
Faulting module name: byondcore.dll, version: 5.0.513.1542, time stamp: 0x6013491d
Exception code: 0xc0000005
Fault offset: 0x00106b09
Faulting process id: 0x5780
Faulting application start time: 0x01d758d69661c2ea
Faulting application path: C:\byond\bin\dreamdaemon.exe
Faulting module path: C:\byond\bin\byondcore.dll
Report Id: 8c635d5a-10e2-4fec-84d8-35f3c3f5e433
Faulting package full name:
Faulting package-relative application ID:


Faulting application name: dreamdaemon.exe, version: 5.0.513.1542, time stamp: 0x601349ac
Faulting module name: unknown, version: 0.0.0.0, time stamp: 0x00000000
Exception code: 0xc0000005
Fault offset: 0xffee0100
Faulting process id: 0x904
Faulting application start time: 0x01d758d607fbe283
Faulting application path: C:\byond\bin\dreamdaemon.exe
Faulting module path: unknown
Report Id: cee2217e-fcb7-45e5-87ef-b70230fa6ae9
Faulting package full name:
Faulting package-relative application ID:

Does the problem occur:
Every time? Or how often? It happens every time without fail. Seems to last longer when no one is on.
In other games? Negative.
In other user accounts? Same thing happens.
On other computers? Same thing happens.

When does the problem NOT occur? In no instance.

Did the problem NOT occur in any earlier versions? If so, what was the last version that worked? (Visit http://www.byond.com/download/build to download old versions for testing.) The problem did not occur in earlier versions, but I have clean compiled it to work on the newer version due to the same problem I was already experiencing.

Workarounds: None, as far as I know.

Does the same happen with the beta build? If so, I'll need a copy of your source to compile myself and investigate this further.
In response to Lummox JR
Where can I find the beta build? Found it. Looking to see if it will work with it
In response to Lummox JR
Okay, as silly as this sounds, running it with that actually made the game crash faster XD. I'll see about hosting the source in a moment.
I've downloaded it. I deleted the link from this thread; if you ever want to share privately with me you can send me a private message.
In response to Lummox JR
Awesome, thank you. Any assistance and insight you can provide would be muchly appreciated ^^
Okay, I've found the problem, and while I do think it deserves to be called a BYOND bug it's also mainly a problem in your code.

You have a Bump() proc that calls step_rand(), and it's possible if the atom is in a bad location that this will cause an infinite recursion. In this case it manifests as a stack overflow. (Weirdly, that isn't the exception code you got.)

The proc code has built-in checking for overflows, but it doesn't handle certain cases the best and sometimes it underestimates how far it can allow recursion before it throws an error.

This is not the easiest thing to handle or compensate for so there won't be a quick fix. The best thing is to fix your code. One way to do this is to add a var to your mobs that you can use to track recursion, and have the Move() proc look for that value. At the beginning of Move() you'd check first if it's over a certain threshold (heck, even 2 should be sufficient) and if it is, bail out. Otherwise, increment the value before calling ..(), then decrement it immediately after. It would look like this:

mob/var/tmp/move_recursion = 0   // tmp var so it doesn't save

mob/Move(newloc, newdir)
if(move_recursion > 3) return 0
... // your usual custom Move() logic before calling ..()
try
++move_recursion
. = ..()
catch() // empty catch block
--move_recursion
... // your usual custom logic after calling ..()

Your existing Bump() can then handle failing a step_rand() call a few times, but it will just give up after a number of tries.

By bailing out when move_recursion is greater than 3, you get the first Move() when it's 0, the next recursive move will have it at 1, then the next at 2, then the next at 3. That is, your Bump() that ends up indirectly calling Move() again will get 3 chances to get it right.
In response to Lummox JR
Alright, thank you very much for this informative response. I will see about looking for a coder to fix it if possible, as the one who made the current source and publicly shared it is no longer around.