I'm not sure exactly what is causing this crash, but I suspect it may be a side-effect of the way you're monitoring the channel's connectivity state via a timer. For example, it could be that the timer is firing after the channel has already been destroyed (either because you're failing to cancel the timer when you destroy the channel or due to some race condition in your timer code).
A much better approach would be to use either the
NotifyOnStateChange() method or the
WaitForConnected() method to get notified when the state changes, so that you don't have to mess with timers to periodically check the state or worry about lifetime issues. The difference between these two methods is that the former uses a completion queue whereas the latter blocks a thread waiting for the state change. If you're already using the C++ async API, then you probably want the former; otherwise, you probably want the latter.
If you use NotifyOnStateChange(), note that this API may miss state transitions. For example, if the channel was in state IDLE when you first got a result and is now in state READY, it's likely that the channel was in state CONNECTING in between the two, but you might never have gotten a notification for it. But that's probably what you want, since what you really care about is when the channel goes into READY state, and if you miss that transition, that means that the channel went into READY but then immediately switched to another state, in which case you probably wouldn't want to have started a new attempt anyway.
If you use WaitForConnected(), you will probably want to call that whenever an RPC fails with a status like UNAVAILABLE. Then it will block until the channel is reconnected, at which point you can retry your RPC.
I hope this information is helpful.