C ++ получить информацию об исключении - PullRequest
4 голосов
/ 12 января 2010

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

Итак, я создал try -catch, где catch записывает исключение в файл.

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

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

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

1011 * ТИА *

CG

Ответы [ 5 ]

7 голосов
/ 12 января 2010

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

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

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

3 голосов
/ 12 января 2010

Если я вас правильно понимаю, вы уже сузили источник проблемы до конкретного вызова сторонней библиотеки, но вы не можете отлаживать приложение в режиме реального времени (я хочу спросить, почему?) , и ваш вопрос «как я могу отладить исключение, не зная, что такое исключение»

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

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

3 голосов
/ 12 января 2010

возможно попробуйте перехватить std :: exception & e

  1. std :: cout << e.what () << endl; </li>
  2. посмотрите, можете ли вы привести его к std :: logic_error и std :: runtime_error - это должно дать вам некоторое представление о том, с чем вы имеете дело
1 голос
/ 12 января 2010

Я немного растерялся. С одной стороны, вы пишете catch(std::exception) не работает (вы должны использовать catch(const std::exception&), кстати), с другой стороны, вы также пишете, что вы вызвали std::exception::what(). Как ты это сделал, если у тебя не было std::exception во-первых?

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

#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 голос
/ 12 января 2010

Во-первых, вы должны всегда перехватывать исключения по константной ссылке, другими словами:

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

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

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

...