Looking at your Tutorial1 class it is obvious that there are at least two problems with it, with the first problem being the reason for the crash.
First: during the very first render() invocation there is no vertex array bound to array index 0, since you are initializing your VAO/VBO
after your first render.
Therefore the draw call sources from NULL memory at vertex array index 0, which causes the crash.
By the way: Whenever a draw function crashes hard, the reason I observed in every single case in the past was sourcing from NULL client memory due to a vertex array index enabled but no buffer object bound to it, in which case the last argument to glVertexAttribPointer will be interpreted as a native address/pointer and not as an offset into a VBO. See the spec of
glVertexAttribPointer for this.
Second: you are recreating your VAO and VBO every single time as the last action in your render() method. This also will eventually result in the driver running out of memory/gl-name, since you leak each object allocation each frame. So you should once create the VAO/VBO in some "init()" method.
If you need to change the data inside that VBO, then use glBufferSubData().