Могу ли я остановить COM от проглатывания исключенных исключений C ++ в процессе вызова?

Я поддерживаю проект, который использует межпроцессный COM с C ++. На верхнем уровне функций вызываемого абонента есть команды try / catch непосредственно перед возвратом через COM. Уловка конвертирует любые исключения C ++ в пользовательские коды ошибок, которые передаются обратно вызывающему абоненту через COM-уровень.

В целях отладки я хочу отключить этот try / catch и просто позволить исключению вызвать сбой в процессе вызова (как это обычно происходит с непонятным исключением C ++). К сожалению, для меня граница COM, похоже, проглатывает эти нечеткие исключения C ++, и я не получаю сбой.

Есть ли способ изменить это поведение в COM? Т.е., я хочу, чтобы это исключающее исключение C ++ вызывало сбои в процессе вызова.

Я хочу, чтобы это произошло, чтобы я мог подключить отладчик и посмотреть контекст, в котором генерируется исключение. Если я просто оставлю наш try / catch на месте и точку останова на уловке, тогда стек уже разворачивается, и поэтому мне уже слишком поздно.

Оригинальные «COM-мастера», которые написали это приложение, либо недоступны, либо не могут запомнить достаточно деталей.

c++,exception,com,

4

Ответов: 6


3 принят

Это как раз через полтора года после того, как вопрос был задан -

Раймонд Чен написал сообщение о том, как « отключить обработчик исключений, который COM« помогает »обернуть вокруг вашего сервера ». Похоже на окончательный ответ на вопрос. Если не для OP, для будущих читателей.


2

Я не думаю, что вы можете отключить это поведение, но есть способ обойти его, если вы используете Visual Studio и не против того, чтобы его заливали исключениями. Если вы перейдете в «Отладка»> «Исключения в VS» и выберите «Когда генерируется исключение>« Разрыв в отладчике »для исключений C ++, он попадет в отладчик в момент, когда будет выбрано исключение. К сожалению, вы затем можете определить, какие исключения вы можете игнорировать и какие из них представляют для вас интерес.

Значение по умолчанию для этого: «Продолжить» с «Если исключение не обрабатывается», которое установлено в «break into the debugger». Если он этого не сделает, это уже предполагает, что вам нужно будет выяснить, где именно были обнаружены исключения.


2

Если я правильно понимаю, ваша проблема заключается, по сути, в невозможности получить трассировку стека из исключения C ++. Я никогда не пробовал это сам, но на самом деле можно получить трассировку стека даже из блока catch.

См. Получение стека вызовов исключений из блока catch

В статье описывается процесс получения трассировки стека с помощью отладчика, но если вы не хотите, чтобы он был прикреплен, вы можете создать дамп в предложении catch (в одну сторону , другой ), а затем пройти процесс в свободное время ,


1

Посмотрите на Vectored Exception Handlers - в зависимости от вашего конкретного варианта использования, VEH можно использовать для перехвата обработки исключений SEH и сбоев / сбросов сил и т. Д.


0

Вы можете настроить разрыв 2-го уровня в отладчике с помощью sxe / sxd -c2 eh, который будет захватывать только необработанные исключения C ++. Вы также можете приложить отладчик «на лету» к вашему процессу во время загрузки с помощью GFlags . Конечно, вам придется отказаться от отладчика мыши-микки и использовать реальную сделку .

C ++, исключение, ком,
Похожие вопросы