Best way to track down infinite loop?

I have a program which is hanging and I want to track down which functions are causing it. It a program which uses lots of recursion and loops and clever algorithms which if I do one thing wrong can go into an infinite loop (or just a very big one). (For example it might be trying to count every grain of sand on a beach! But that’s not important right now.)

In the Unity 5 Profiler am I able to see which particular custom methods are being called or just the MonoDevelop functions like Update() and Start() ??

Secondly, is there any way yet to break out of an infinite loop when you are testing? Instead of having to restart my computer each time it hangs?

If this is windows, you can just close out Unity through the task manager. I’m not sure about macs though. Usually the console with some debug statements will at least show you debugs up to the point it hits a loop. If you’re having a lot of issues with infinite loops though, there may be other things to consider.

Clearly not. :wink:

Stick unique debug statements in you loops, see what is fired last.

Yes. Avoiding creating them in the first place. They are an error in programming. Use trapping and checks to ensure that can’t.

In Monodevelop you can attempt attaching to process and then periodically pausing/unpausing the execution. monodevelop will stop in on the specific lines it was running on when you hit pause, giving you some insight as to where the loop is.

if you find the infinite loop you can use the immediate window to change a specific runtime variable to break the loop (unless you did something like While(True){ } ).

pretty sure you can do the same in Visual Studio though I couldn’t help you there.

1 Like

My algorithms are sooo clever even I don’t understand them! Obviously I didn’t intend to have any infinite (or large loops) but with one thing spawning 10 things which spawn 10 things and so on… it can get out of control quite easily! I’ve put in special algorithms to stop things getting out of control but clearly they’re not working and I need to track down why!

Debug statements are a no go, since if I have an infinite loop it will write an infinite number of debug statements into the log files.

2 Likes

Really? I have never had this. (Dont remember my last infinite loop) Doesnt it just crash (Stop doing anything).
Please correct me.

Why are debug statements a no go? @zombiegorilla is suggesting to put them in different places (where code branches) in your code to figure out where your infinite loop is. If you use Debug.Log(“1”), Debug.Log(“2”), etc. you will see which ones are behaving as intended and which ones are not. If it writes it inifite time, well your found your issue.

Easiest way to isolate code blocks and narrow the problem

First thing that I usually check in those scenarios are guard statements - if you don’t have any, add them (f.e. in a form of Debug.Assert statements). Usual ones are either checking bounds of iterations (to isolate wrongly constructed if’s etc.) or caching previous iterator value and checking if it’s the same on next iteration (to isolate non-incrementing/changing control values).

Either way it’s a matter of isolating possible root causes and checking them one by one (preferably by prewritten unit tests or adding new ones/fixing existing). Or just attach a debugger, add some breakpoints on entry/before exit in the bracnches and step through it. It may be time consuming, but on the other hand does not require changing any of the existing code.

Whatever the method to debug this, you need to know what it’s supposed to do and how execution flows or you’ll be seeing values that don’t mean anything to you and thus can’t say if they’re correct or not (same goes for all conditions and guard statements).
So yeah, study your code and break it up if needed. Add comments to things you’ve figured out so you don’t need to relearn it later. At one point or the other you’ll probably need to do it anyway to either optimize or modify behaviour, might do it now if it’s having issues.

All everyone can say is only theory, as there’s no code to actually see. Unfortunately with custom code it might be any reason, so it boils down to “debug it”… :frowning:

1 Like

Yes, turn on “Deep Profiling” in the Profiler window.

There is one way, though I haven’t tried it personally: https://blogs.unity3d.com/2016/05/24/breakout-how-to-stop-an-infinite-loop-in-a-unity-c-script/
But if you’re on Windows you can at the very least use Task Manager (press Ctrl+Alt+Delete on your keyboard) and kill the Unity process if it is hanging rather than restarting your whole computer.

1 Like

I’ve gotten MonoDevelop to stop infinite loops. Just switch to MD, start debugging, and press “Pause”. It’ll stop you somewhere in the infinite loop, and you can step forward until you get how it’s looping.

I’m not 100% sure if this works every time - I can’t remember if I’ve seen it fail, but I think I have? I’ve also not gotten the Visual Studio debugger to do the same thing (which is annoying, since the MD debugger is poop, like MD in general). Maybe I should try to figure out what that’s about.

1 Like

Thanks. I just meant things like this that could cause problems (oversimplified):

void Create10Children(){
     Debug.Log("Creating 10 children");
    Create10Children();
}

That would crash both Unity and fill up the Log files! (I wouldn’t be silly enough to do something like that).

What I’m doing at the moment is counting how many things are spawned per frame and cutting out when it reaches a limit. My game’s a bit fractal-like so it has a bit of recursion and such like. But it’s a bit of a pain to debug!
I’m going to try the Deep Profiling on Unity 5. No pain no gain. :stuck_out_tongue:

I’ve been on projects which used third party assets or dlls that try to mess with Unity’s Main thread. they would start their own threads to listen to some net calls and then pass them to Unity’s main thread. Debugger simply wouldn’t work in those projects since the third party would make some call that’d cause the main thread to continue (which either made the debugger unusable, or crashed monodevelop)

if you’re doing fractal like effect then you don’t want to use recursion, cause its far too easy for you to hit the stack trace limit. I would use a Stack to track the data and depth, and call the function in a loop (not recursively). this can also allow you to break up the calls to over several frames.

if you want to look into this more, Igor Aherne made a fantastic video on his YouTube channel about this very topic (hidden in a 7+ hour video)

You would be silly not to. That is exactly the point of logging. Don’t worry about filling your logs. Your system manages your logs, they won’t fill and crash/damage your computer. And even if they get large, you can just clear them. I just put that code in a script in a new project. It seized Unity, and generated a couple of mbs of log files. But it is 100% clear from the logs where the infinite loop is happening.
Loop

(Filename: Assets/looptest.cs Line: 20)

Creating 10 children
UnityEngine.DebugLogHandler:Internal_Log(LogType, String, Object)
UnityEngine.DebugLogHandler:LogFormat(LogType, Object, String, Object[ ])
UnityEngine.Logger:Log(LogType, Object)
UnityEngine.Debug:Log(Object)
looptest:Create10Children() (at Assets/looptest.cs:20)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Create10Children() (at Assets/looptest.cs:21)
looptest:Start() (at Assets/looptest.cs:9)

(Filename: Assets/looptest.cs Line: 20)

Logging is a debugging tool. You have created a bug. Use it to find your bug. Simple.

4 Likes

Normally I thoroughly test each loop as I make it. That way the only loop that could be a problem is the last one I created. Combine this with never making algorithms too clever, and you are good to go.

One technique I use from time to time is make a long loop a coroutine. That way you can see its effects frame by frame in the editor.

You can also attach monodevelop or visual studio to Unity as a debugger. Then you can pause, step through, and set up break points.

Yeah, I kind of did that with some of my loops, to spread some things over several frames. Actually makes quite a nice effect of things being generated. But then I have to make sure things aren’t done out of order.

(One bug a fixed was I had a few “stray” vertices in some procedural meshes which weren’t being used by any faces but made the bounding box of the mesh wayyy too big. So I cleaned them up and it’s gone a lot faster.)

What I’m trying to do is try and use algorithms that are clever enough to give a “wow” factor but not too clever that they get out of hand and become chaotic and unpredictable. Its a fine line to tread. But I think you have got to try and push the envelope a bit.

Just remember, no one sees the algorithm, just the end result. Sometimes being too clever with our algorithms can actually detract from the end result.

4 Likes

Nicely put :slight_smile:

Yes. You simply need to enter the Task Manager (Windows) or the Activity Monitor (macOS) then forcibly stop Unity.

http://www.bleepingcomputer.com/tutorials/close-a-program-using-task-manager/
https://www.macobserver.com/tmo/answers/how-to-kill-stubborn-apps-hidden-processes-in-mac-os-x

2 Likes

Learn to debug with breakpoints, comment all the stuff out and add one thing back at a time until it screws up then narrow it down further then fix it.

2 Likes

On a Mac you can just hit cmd+opt+esc , select unity and hit force quit. Or if you use the dock, right click on unity and select force quit.

I’ve never heard of having to restart the computer before. Is that a windows thing?