esp32 crashes when trying to dereference a pointer value
Ah, one of my friends pointed out the issue. It's a scope snag:

chunks is allocated on the stack in get32BitInt By returning a pointer to chunks, you are pointing to memory that is deallocated. Think of it as pointing to a member variable of a class that has already been destroyed
when you try to dereference deallocated memory, bad things can happen. usually in debug the compiler makes sure you fail hard
the easiest way to test this is to allocate chunks outside of that function and pass it in as a reference

So yeah, I was allocating memory within the scope of a function and then blowing that memory contents away when that functions scope ended.
I refactored my code to move the array outside of the scope of the parsing function and passed the pointer in to the parsing function to get populated:
void get32BitInt(WebsocketsMessage message, uint32_t *chunks)
{
  Serial.println(&quot;--------------------------------&quot;);
  Serial.println(&quot;raw parse:&quot;);

  std::string raw = message.rawData();

  // uint32_t chunks[message.length() / 4];
  int chunkIndex = 0;

  for (int i = 0; i &lt; message.length(); i += 4)
  {
    uint32_t chunk = 0;
    for (int j = 0; j &lt; 4; j++)
    {
      chunk &lt;&lt;= 8;
      chunk |= raw.at(i + j);
    }
    chunks[chunkIndex] = chunk;
    chunkIndex++;
  }

  Serial.println(&quot;parsed chunks:&quot;);
  for (int i = 0; i &lt; 11; i++)
  {
    Serial.print(chunks[i], HEX);
    Serial.print(&quot; == &quot;);
    Serial.println(chunks[i], BIN);
  }

  Serial.println(&quot;--------------------------------&quot;);
}

void addWebsocketListener()
{

  client.onMessage([&amp;](WebsocketsMessage message) {

    uint32_t gameFrame[message.length() / 4]; // *try moving gameFrame out of scope
    get32BitInt(message, gameFrame);

    Serial.print(&quot;game frame address: &quot;);
    Serial.println((int)&amp;gameFrame);

    Serial.println(&quot;storing first 32 bit integer in a variable&quot;);
    uint32_t firstNumber = *gameFrame;

    Serial.print(&quot;game frame first value: &quot;);
    Serial.println(firstNumber, HEX);

    Serial.println(&quot;printing frame:&quot;);
    for (int i = 0; i &lt; 11; i++)
    {
      Serial.println(gameFrame[i], HEX);
    }
  });
}


And now my controller isn't crashing :D

And now I understand scope when dealing with pointers a bit better :)