By default, calls to abort() in the MS CRT do not trigger an exception and forcefully terminate the process, making CrashRecoveryContext not very useful on Windows for catching abort(), and consequently, assert().  One solution is to create a custom abort() handler that calls RaiseException(), which will be caught by the handler in CrashRecoveryContext.<div>
<br></div><div>The relevant client-side code is:</div><div><br></div><div><font face="'courier new', monospace">void win_abort_handler(int) {</font></div><div><div><font face="'courier new', monospace">  RaiseException(0, 0, 0, NULL);</font></div>
<div><font face="'courier new', monospace">}</font></div><div><font face="'courier new', monospace"><br></font></div><div><div><font face="'courier new', monospace">void handle_llvm_fatal(void *User, const std::string &Reason) {</font></div>
<div><font face="'courier new', monospace">  std::cerr << "Caught LLVM ERROR: " << Reason << "\n";</font></div><div><font face="'courier new', monospace">  abort();  // Chains to win_abort_handler on Windows</font></div>
<div><font face="'courier new', monospace">}</font></div></div><div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">int main() {</font></div><div><font face="'courier new', monospace">  install_fatal_error_handler(handle_llvm_crash, NULL);</font></div>
<div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">  signal(SIGABRT, win_abort_handler);</font></div><div><font face="'courier new', monospace">  _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);</font></div>
<div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">  llvm_start_multithreaded();</font></div><div><font face="'courier new', monospace"><br></font></div>
<div><font face="'courier new', monospace">  ContextRecoveryContext::Enable();</font></div><div><font face="'courier new', monospace">  // "safe" calls with RunSafely()</font></div><div><font face="'courier new', monospace">  ContextRecoveryContext::Disable();</font></div>
<div><font face="'courier new', monospace"><br></font></div><div><font face="'courier new', monospace">  return 0;</font></div><div><font face="'courier new', monospace">}</font></div><div><br></div>
<div><br></div><div>Do you think it is a good idea to fold the abort signal handler and signal/_set_abort_handler into CrashRecoveryContext?  The handler can be registered in Enable() and removed in Disable(), like it is done in the POSIX implementation.</div>
<div><br></div><div><br></div>-- <br><br><div>Thanks,</div><div><br></div><div>Justin Holewinski</div><br>
</div>