C++ получает информацию об исключении

У меня есть C++ dll, который я должен отладить. Из-за обстоятельств, при которых я использую dll, я не могу отладить его с помощью вызывающего приложения.

Так, я создал попытку - выгода, где выгода пишет исключение в файл.

Строка, которая должна быть отлажена, включает импортированные классы от третьей стороны dll, таким образом, у меня нет способа знать, какое исключение это. Когда я попробовал выгоду (исключение e), никакое сообщение не было записано в файл. Таким образом, я попробовал выгоду (...), которая действительно инициировала что-то:

использование станд.:: исключение:: что, единственная вещь, которая была записана в файл, равнялась "1". использование станд.:: исключение:: исключение, файл получил следующий код: "0579EF90".

Есть ли какой-либо способ для меня получить значимую информацию об исключении, которое было выдано?

TIA

CG

5
задан user228058 12 January 2010 в 16:27
поделиться

5 ответов

Если вы не используете catch(KnownExceptionType ex) и не используете knwoledge о KnownExceptionType для извлечения информации, то нет, вы не можете этого сделать.

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

Вы в худшем случае, исключение, исходящее из библиотеки, у вас нет информации об исключении, даже если у вас есть заголовки для lib, этот тип исключения там определять не нужно.

8
ответ дан 18 December 2019 в 09:50
поделиться

Если я вас правильно понимаю, вы уже сузили источник проблемы к конкретному вызову 3-й партийной библиотеки, но вам не разрешено отладки в прямом эфире приложения (сделать Я хочу спросить, почему?), И ваш вопрос: «Как я могу отладить исключение без каких-либо знаний о том, что является исключением«

Ответ, вы не можете. Как вы наблюдали, вы можете слепо догадаться и надеяться поймать правильную вещь. Вы также можете поймать (...), но это скажет вам точно ничего. Если бы вы могли отладить живую, вы можете установить отладчик, чтобы сломаться, когда исключение бросится и посмотрите, что там происходит.

Я думаю, что правильный ответ - это связаться с 3-й партийной библиотекой, которую вы сузили источник вопроса и спросите их. Это очень, очень плохое, чтобы бросить исключение и позволить ему проводить через модульные границы. Это заставляет меня подозревать, что это исключение Windows SEH для нулевого указателя DEREF или что-то, и вы компилируете таким образом, что поймать (...).

4
ответ дан 18 December 2019 в 09:50
поделиться

Может быть, попробовать ловить STD :: Exception & E

  1. std :: cout << e.what () << endl;
  2. См. Если вы можете бросить его на STD :: logic_Error, а std :: runtime_error - это должно дать вам некоторую подсказку, что вы имеете дело с
3
ответ дан 18 December 2019 в 09:50
поделиться

Во-первых, вы должны всегда Hollous Explies от Const Refect, другими словами:

catch( const std::exception & ex ) {
  ...
}

не делает это означает, что ваши исключения будут иметь точный тип, который вы поймите, и это может привести к потере Информация об исключении.

Однако, похоже, что ваша библиотека бросает что-то не полученное из STD :: Исключение - вам нужно выяснить, какой тип (в идеале базовый тип) есть.

1
ответ дан 18 December 2019 в 09:50
поделиться

Я немного запутался. С одной стороны, вы пишете CALL (STD :: исключение) не работал (вы должны использовать CALL (Const std :: исключение и) , кстати), с другой стороны Также напишите, что вы вызваны STD :: Исключение :: Что () . Как вы это сделали, если бы у вас не было STD :: Accession в первую очередь?

В любом случае, как только вы поймали что-либо, кроме ... , вы можете попытаться войти в систему RTTI INFO:

#include <typeinfo>

try {
  foreign_code(my_data);
} catch(const some_type& x) {
  std::cerr << "Yikes! Caught exception of type '" 
            << typeid(x).name() 
            << "' with its hand in the cookie jar!\n";
  std::abort();
}

, в то время как стандарт не имеет никаких предположений о результате STD :: type_info :: name () , большинство (если не все) компиляторы будут генерировать код, который излучает что-то, что по крайней мере несколько полезно.

Когда вы внутри отладчика VS, вы также можете настроить его так, чтобы он остановился на любых выдающихся исключениях. Это дает вам трассировку стека, и, таким образом, может дать вам ключ относительно того, какие данные, переданные в DLL, могут вызвать проблему.

1
ответ дан 18 December 2019 в 09:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: