This is the mail archive of the cygwin mailing list for the Cygwin project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: How to detect a cygwin thread?

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.

> 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.


Unsubscribe info:
Problem reports:

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]