Поймать сбой DLL в C / C ++ - PullRequest
       16

Поймать сбой DLL в C / C ++

3 голосов
/ 09 февраля 2011

Я вызываю функцию из DLL, например:

__declspec ( dllimport ) bool dll_function(...);

int main() {
  [...]
  if (dll_function(...)) {
    [...]
  }
}

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

Ответы [ 4 ]

4 голосов
/ 09 февраля 2011

Вы можете поймать AV с помощью ключевых слов __try и __except в компиляторе MSVC. Не все так полезно, вы не представляете, какой урон был нанесен. Состояние вашей программы может быть повреждено. Куча может быть взорвана, например, вызывая последующий случайный сбой. Размещение DLL в своем собственном процессе и использование IPC для общения с ней - единственный приемлемый подход.

2 голосов
/ 09 февраля 2011

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

Разве невозможно предотвратить падение DLL, если вы вызываете функцию только с действительными данными?Это должно быть предпочтительным решением в любом случае - но трудно сказать, не зная, какую DLL вы хотите использовать.Но в большинстве случаев вы должны иметь представление о том, что именно «данные» приводят к сбою ...

1 голос
/ 09 февраля 2011

Попробуйте посмотреть на:

http://msdn.microsoft.com/en-us/library/ms680634%28v=vs.85%29.aspx

и

Код Принудительного фильтра Олега Стародумова (www.debuginfo.com)

http://www.debuginfo.com/articles/debugfilters.html

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

Возможно, вам придется использовать __try для исключений. Опять же, вероятно, лучше исправить проблему или просто потерпеть крах, чем пытаться ее поймать. Я согласен с другими, что вместо того, чтобы подавлять или скрывать аварию, вы должны это исправить. Я не знаю, насколько хорошо вы можете восстановиться после сбоя - будет ли полезно продолжить выполнение после чего-то подобного?

0 голосов
/ 09 февраля 2011

Я не уверен, что это проблема, попробуйте указать правильное соглашение о вызовах. (__stdcall, __cdecl и т. Д.).

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

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