Here's how you crash an Arduino.
char myBuffer[17] = "----------------";
char happyFace[] = ":-) ";
void loop() {
static int bufPos; // static is only initialized once, so we don't clobber it every loop.
strcpy(myBuffer+bufPos,happyFace); // copy the happyFace string (up to the terminating 0x00 at the end) into myBuffer, at offset bufPos
lcd.clear(); // wipe the screen
lcd.print(myBuffer); // print myBuffer - that is, display characters from myBuffer until a 0x00 is reached.
bufPos += strlen(happyFace); // add the string length of happyFace (4 bytes here), excluding the 0x00, to the bufPos.
delay(500); // wait half a second
}
Looks innocent, right? Uses a buffer to employ "appending" a string onto another string, through use of a buffer-counter (I guess I could use a *pointer, but my in-head compiler doesn't utilize that yet

). So every loop, you'll have another smiley on the screen. hehe, cute.
Except that... once you reach the end of the available space... the program compiled, right? It does just what it's told... it just keeps on truckin'. It's only 17 characters long, but bufPos is an int, so it's allowed to run off into oblivion, +22, +36, +59... and it'll still write it there. Oops. So if you happen to be writing to an out-of-range buffer pointer, you start clobbering over unpredictable memory areas, many of which are in use around it (holding counters, variables, etc). Happy face bunny starts going Godzilla on the memory map. Guess what? Program crashes... at first the program will behave erratically, storing bogus values in your log or jumping to random places in the code. Then, once it finally finds an infinite loop to cozily settle into (like a while() loop that never ends), it'll "crash".
That code is too confusing for me to look over right now, but I just wanted to point this buffer issue out, since I saw a lot of pointers, pointer-addition, pointer-assignment, etc., going on in there. Quite possible that your buffers are just getting scrambled up with out-of-range addresses...