Была статейка у Криса по этому поводу.
при возникновении критической ошибки, система завершает работу приложения еще до того, как будут сброшены дисковые буфера. Даже использование функции fflush ничего не решает (а вот скорость программы замедляет весьма радикально). Как же быть?! Да очень просто - создать в shared-memory кольцевой буфер заданного размера и весь отладочный вывод направлять туда, читая оттуда с помощью дочернего процесса. Тогда при аварийном завершении материнского процесса shared-memory не будет освобождена системой и дочерний процесс успеет принять последнее отладочное сообщение, отправленное упавшей программой. К тому же, этот метод работает намного быстрее прямой записи на диск.
http://www.insidepro.com/kk/200r.shtml