LINUX.ORG.RU
ФорумAdmin

Сигнал SIGABRT


0

2

Добрый день! Друзья!Подскажите,пожалуйста, в каких случаях ОС linux может посылать сигнал SIGABRT. Источником сигналов может быть как сама операционная система, так и другие пользовательские программы(т.е пользователь). Когда пользователь является источником сигнала SIGABRT мне удалось найти:выполнение команды kill -6 [pid] или использование системного вызова abort(). А вот может ли сама ОС генерировать данный сигнал и если может,то в каких случаях, я не выяснила. Может, вы литературу какую-нибудь посоветуете, а то я уже много перечитала,а нужной информации не нашла. Заранее большее спасибо!


Ответ на: комментарий от Sylvia

Спасибо!Эту статью видела. Как я поняла, там как раз речь идет о пользователе, как об источнике сигнала или я ошибаюсь? Меня там смущает фраза:«Также SIGABRT вызвается утверждениями (англ. assertions; средство отладки Си — макроопределение assert() вызывает abort() если утверждение переданное в качестве аргумента ложно).» Это означает, что инициатором сигнала выступает ОС или нет?

Masha ()
Ответ на: комментарий от Masha

The assert() macro inserts diagnostics into programs. When executed, if the expression is false (that is, compares equal to 0), assert() writes information about the call that failed on stderr and then calls abort().

Короче, если программа словила SIGABT от ассершна, считай она сама себе сделала аборт.

anonymous ()
Ответ на: комментарий от anonymous

Спасибо!Я с радостью!В первой половине августа я не могу, а потом с радостью!:)Спасибо еще раз!

Masha ()
Ответ на: комментарий от anonymous

Ну то есть это не ОС послала сигнал,а прорамма сама себе, то есть фактически подьзователь,я правильно понимаю?

Masha ()
Ответ на: комментарий от anonymous

Спасибо! Ну вот...А как бы узнать,может ли ОС генерировать данный сигнал и в каких случаях?Или выяснить,что она его генерировать не может...

Masha ()
Ответ на: комментарий от Masha

Мне такое не встречалось. Да и википедия говорит, что SIGABRT is sent by the process to itself when it calls the abort libc function.

А что собственно падает-то? Наверно как раз какой нибудь assert() и не проходит - в вашем коде или в коде, который вы используете.

anonymous ()
Ответ на: комментарий от anonymous

Да...Я вот тоже не могу найти информацию. Вообще просто у нас падает один из наших модулей по непонятным причинам,есть подозрением, что вследствие получения сигнала. И действительно, аналогичная запись в логах воспроизводится, если отправлять данный сигнал с помощью утилиты kill. Но пользователь сигнал не посылал...соответсвенно,встал вопрос о возможной генерации сигнала системой...

Masha ()
Ответ на: комментарий от Masha

ИМХО, данный сигнал отправляет процесс только сам себе. Хотя, конечно, можно приколоться и kill-ом выслать. Но ядро точно такого не шлет.

prox ()
Ответ на: комментарий от Masha

>Вообще просто у нас падает один из наших модулей

Может вы просто не ловите exception?

mky ★★★★★ ()
Ответ на: комментарий от Sylvia

выловить можно через gdb


ulimit -c unlimited
(включаете сохранение дампов core)

запускаете программу, делаете то что делали, что она упала,
при sigabrt должен быть сохранен дамп core

запускаете gdb

gdb программа core

вводите bt
для обратной трассировки, смотрите где именно не прошел assert

если программа собрана с флагом компилятора -g (и не сделан strip или не установлены LDFLAGS=-s) то точность будет вплоть до номера строки в исходниках

Sylvia ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.