2016-01-19 5 views
2

Насколько я знаю (исправьте меня, если я ошибаюсь, пожалуйста), управляемые языки (или, по крайней мере, C#) не собираются делать segfault (по крайней мере, когда нет Unsafe или непосредственно занимаются unmanaged memory). Это противоположно неуправляемому языку (или, по крайней мере, C++), где вы можете получить segfault, просто взглянув на кошку рядом с вами на секунду во время кодирования.Как управляемый язык не гарантирует segfault

Вопрос: Каким образом обеспечивается соответствие этого языка? были построены и протестированы так тщательно. Или у них есть какой-то способ поймать этот segfault и справиться с ним так или иначе?

Мотивация позади этого вопроса: У меня есть приложение C#, которое вызывает родную библиотеку C++ (оба были созданы мной). Когда моя C++ DLL делает segfault, все приложение идет вниз (некоторые службы идут вниз), что совсем не хорошо. Я знаю, что при получении segfault это означает, что что-то было сделано неправильно и нужно исправить. Однако, по крайней мере, мне нужен какой-то механизм для решения этой проблемы, когда ошибка (может вызвать segfault). На компьютере клиента работает C++ DLL.

+1

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

+0

@JoachimPileborg Я полностью с вами, что устранение проблемы - единственное логическое решение. Но я даже не могу взять журнал, чтобы узнать, что произошло. Самое лучшее сообщение журнала, которое у меня было. «Что-то не так с вашей программой»: D –

+1

@HumamHelfawi Добавить внутренние записи и трассировки, записать в свой собственный файл журнала. По крайней мере, это может помочь сократить местоположение, если вы не можете использовать отладчик. –

ответ

2
  1. Они не позволяют вручную освобождать память.
  2. Они не позволяют вам читать/писать с/на произвольные адреса памяти (C++ также не позволяет этого, но синтаксис языка делает возможным).
  3. (как особый вид выше). Они проверяют доступ каждого массива, независимо от того, находится ли он в пределах массива.
  4. Насколько я знаю, у них нет неопределенного поведения (кроме бузеров, при звонке небезопасный код)

Я хочу, чтобы какой-то механизм, чтобы решить эту проблему, когда сбоит (может привести к Segfault) C++ DLL работает на компьютере клиента.

Проблема заключается в том, что даже если вы могли бы продолжить свою программу (я не знаю, предлагает ли Windows/C# какой-либо механизм для этого), она больше не может находиться в допустимом состоянии, поэтому в зависимости от что такое ошибка и к каким типам ресурсов вы имеете доступ, это может привести к худшим ошибкам, чем просто сбой программы, включая уничтожение пользовательских данных.

+0

Иными словами, они используют защитную методологию и вообще не ловят эту ошибку. Они просто убедились, что этого не произойдет? –

+0

В принципе да. Тем не менее, вы все еще можете иметь, например, «nullReferenceException» или «IndexOutOfRangeException», но, вопреки segfault, они могут быть пойманы стандартными языковыми конструкциями. – MikeMB

+0

Yup эти ошибки настолько добры и дружелюбны ... Спасибо, что поняли :) –