Сигнал segfault, всегда отправляемый в приложение

Это зафиксировало его для меня

http://www.sqlnewsgroups.net/group/microsoft.public.sqlserver.server/topic23830.aspx

По существу:-

Удалите следующие подразделы реестра, которые хранят настройки SID:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Server\MSSQL.X\Setup\SQLGroup HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.X\Setup\AGTGroup HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.X\Setup\FTSGroup HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL SQL Server\MSSQL.X\Setup\ASGroup

3
задан 7 April 2010 в 13:07
4 ответа

Это возможно для приложения или проигнорировать или сделать некоторую специальную обработку для сигнала неисправности сегментации. Страница руководства для сигнала и связанных страниц имеет детали о нем.

Одна возможная ситуация, которую я вижу, могла привести к описанному поведению (dmesg, сообщает segfaults, но приложение работает), то, что ветвления приложения и дочерний процесс segfaults. Для знания, если это верно, проверьте, совпадает ли идентификатор процесса, о котором сообщает dmesg, с тем в настоящее время рабочего процесса.

2
ответ дан 3 December 2019 в 05:54
  • 1
    +1, @noonex, делают dmesg segfaults совпадают с чем-либо известным (как запуск программы)? –  Chris S 7 April 2010 в 15:51

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

К сожалению, после того как тот сигнал пойман, ЧТО-ЛИБО - подозреваемый. Например, использование чего-либо, что выделяет память в обработчике SEGV, вероятно плохая идея. То же идет для функций variadic как printf (). Таким образом да, в то время как приложение обрабатывает сигнал, оно не может делать так эффективно, следовательно Вы только видите трассировки его в dmesg.

Так или иначе, да, сигнал отправляется в приложение, однако SEGV не является оперативным сигналом и может быть объединен ядром. Т.е. если память доступов программы, к которой это не имеет никаких прав получить доступ 15 раз, существует очень хороший шанс, что только один SEGV будет на самом деле поставлен, в зависимости от синхронизации недопустимого доступа к памяти.

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

3
ответ дан 3 December 2019 в 05:54

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

Сигнал может также быть полностью проигнорирован, но это - что-то, чего нужно избежать; получение SIGSEGV обычно означает, что существует что-то действительно, действительно неправильно продолжаясь.

0
ответ дан 3 December 2019 в 05:54
  • 1
    Никогда хорошая идея ' сохраните going' после того как Вы получаете SIGSEGV, если Вы не надеетесь зарегистрировать его до выхода. –  Tim Post♦ 7 April 2010 в 15:38
  • 2
    Я никогда не говорил, что это была хорошая идея (и я don' t думают, что это). Но программа может попытка обработать SIGSEGV и продолжать идти, таким образом, это - очень вероятная причина его имеющий долгое время работы несмотря на то, что получило SIGSEGVs. Это - хороший ответ для вопроса " почему это получало SIGSEGV, но продолжавший управлять? " таким образом, я don' t действительно видят основания для downvote здесь. –  Massimo 7 April 2010 в 16:56

Отказ сегментации обычно означает, что что-то пошло очень неправильно с внутренним состоянием приложения. Это может быть именно так повреждено, что это не может выполнить обработчик сигналов – обработчик сигналов, который, как предполагается, печатает дамп стека, мог отказать также.

Править: Я не сделал вполне понятого 'времени работы более старая' часть, таким образом, я пропустил ее. Поскольку теперь я вижу, что Ваш вопрос был, 'почему приложение все еще работает', таким образом, вот новый ответ:

Да, приложение может пережить SIGSEGV. Иногда SIGSEGV будет отправлен только в некоторый менее важный поток (он должен уничтожить целое приложение, но иногда он не делает), или даже просто дочерний процесс – что Вы видите, поскольку одно приложение может быть несколькими процессами или потоками.

0
ответ дан 3 December 2019 в 05:54
  • 1
    Но затем время работы приложения couldn' t быть до времени его последнего segfault... –  Massimo 7 April 2010 в 14:10
  • 2
    Обработчик сигналов, обслуживающий SIGSEGV, не может быть способен для печати контекста. Кроме того, SEGV может и объединяться ядром. –  Tim Post♦ 7 April 2010 в 16:26

Теги

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