delorie.com/archives/browse.cgi | search |
Piotr Wyderski wrote: > I don't know the reason, just report the program's > behaviour. But to provide you more context: this > code is a critical error handler. All it has to do is: > > 1. immediately stop the world in a nice way, > as this thread is all about. When "sig" is suspended, > no more points follow. I think the only safe way to do this is to invoke the debugging APIs, e.g. DebugActiveProcess: http://msdn.microsoft.com/en-us/library/ms679295(VS.85).aspx > 2. dump detailed stack traces + module list + > the emergency stop reason description to > the set of log files; > > 3. call std::abort in order to generate a core file for post-mortem analysis. There's a cygwin utility called 'dumper.exe' that generates a gdb-debuggable core dump of a running process; take a look at how it works. You could hack that into a task monitor for your critical process. It could be running at a higher priority and waiting on a named event; then in your application, when you want to invoke the critical error handler, you just signal the event - you should be immediately pre-empted in favour of the now-ready higher priority process, and it can call DebugActiveProcess to freeze (and then core-dump) the monitored process. With a following tailwind, you should get an even more immediate and accurate freezing of your application's state than if one of the app's own threads is engaged in multiple system calls to enumerate and suspend threads one-by-one. cheers, DaveK -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/
webmaster | delorie software privacy |
Copyright © 2019 by DJ Delorie | Updated Jul 2019 |