Могу ли я остановить COM от проглатывания необработанных исключений C ++ в процессе вызываемого? - PullRequest
4 голосов
/ 16 июня 2009

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

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

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

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

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

Ответы [ 6 ]

3 голосов
/ 25 января 2011

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

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

2 голосов
/ 16 июня 2009

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

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

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

2 голосов
/ 16 июня 2009

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

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

1 голос
/ 16 июня 2009

Взгляните на Векторные обработчики исключений - в зависимости от вашего конкретного случая использования VEH может использоваться для перехвата обработки исключений SEH и принудительного завершения аварий / дампов / чего угодно.

0 голосов
/ 16 июня 2009

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

0 голосов
/ 16 июня 2009

То, что вам нужно, это включить «перерыв при возникновении исключения» в вашем отладчике. Таким образом, вы немедленно остановитесь, когда возникнет исключение, и к вашим услугам будет весь стек вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...