Создание мини-дампов для _caught_ SEH исключений в DLL со смешанным кодом - PullRequest
3 голосов
/ 26 апреля 2010

Я пытаюсь использовать код, подобный 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?).

1 Ответ

1 голос
/ 05 мая 2010

Я обнаружил, что с помощью Vectored Exception Handling я могу получить уведомление о первом исключении любого исключения SEH и использовать его для создания мини-дампа.

...