Я пытаюсь использовать код, подобный clrdump , для создания мини-дампов в моем управляемом процессе.
Этот управляемый процесс вызывает код C ++ / CLI, который вызывает некоторый собственный статический код lib на C ++, в котором могут генерироваться исключения SEH (например, случайное нарушение доступа).
C# WinForms
->
C++/CLI DLL
->
Static C++ Lib
->
ACCESS VIOLATION
Наша политика заключается в том, чтобы создавать мини-дампы для всех исключений SEH (перехваченных и необработанных), а затем преобразовывать их в исключения C ++ для обработки кодом приложения. Это работает для чисто нативных процессов просто отлично; но когда приложение является приложением C # - не так много.
Единственный способ создания дампов из исключений SEH в процессе C # - это , а не их перехват, а затем, в качестве необработанных исключений, использовать обработчик Application.ThreadException
для создания мини-дампа. Альтернатива состоит в том, чтобы позволить CLR преобразовать исключение SEH в исключение .Net и перехватить его (например, System.AccessViolationException
) - но это означает, что дамп не создается, а информация теряется (информация трассировки стека в Exception
не такой же богатый, как мини-свалка).
Так как я могу обрабатывать исключения SEH, создавая минидамп * и , переводя исключение в исключение .Net, чтобы мое приложение могло попытаться восстановить?
Редактировать
Под «не перехватывать исключения» я также подразумеваю перехват и затем перебрасывание, что сохраняет богатую информацию об исключениях.
Прямо сейчас я рассматриваю возможность не подавлять System.Exception
или что-либо происходящее от System.SystemException
. Это означает, что AccessViolation
(и его друзья) всегда приводят к завершению программы и созданию дампа, а все другие сгенерированные исключения должны быть производными от некоторого подтипа (ApplicationException
?).