Retrieve string data after we stop threads that could GC

This could read invalid data in c_str because that string buffer was
retrieved before handling auxilary threads. But that handling could
result in a GC which would move the pointer that c_str would point at.

By retrieving the pointer after GC'ing we make sure we have the correct
data. Also improve the error message if we fail to run `` so we have
more useful information.