Форум программистов, компьютерный форум, киберфорум
С под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
1

Приложение завершается без каких-либо сообщений

10.10.2016, 16:03. Показов 1164. Ответов 10
Метки нет (Все метки)

Есть консольное приложение. В процессе работы возникает некая ошибка приводящая к тому что приложение просто тихо завершается как будто само (в консоли появляется приглашение на ввод команды). На всякий случай на сигнал SIGSEGV поставлен обработчик
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void print_backtrace(void)
{
    void *array[25];
    int nSize = backtrace(array, 25);
    char **symbols = backtrace_symbols(array, nSize);
 
    for (int i = 0; i < nSize; i++)
        printf("bt #%i %s\n", i, symbols[i]);
 
    free(symbols);
}
 
static void SIGSEGV_handler(int sig)
{
    print_backtrace();
    signal(sig, SIG_DFL);
    raise(sig);
}
 
int main(int argc, char* argv[])
{
    signal(SIGSEGV, SIGSEGV_handler);
...
однако ничего в консоль при таком аномальном завершении работы не пишется - то ли backtrace пустой что просто невозможно по моим понятиям то ли выбрасывается не SIGSEGV. Какие вообще варианты бывают аварийного завершения приложения? По моему опыту в консоль как правило пишется что то ужасное, а тут - тишина...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2016, 16:03
Ответы с готовыми решениями:

Зависание приложение во время выполнения каких-либо операций
Здрати.. У меня приложение на время выполнения цикла или вовремя запроса до URL зависает...

Вылетают игры без каких либо ошибок
Доброе утро. Столкнулся с проблемой. Собрал пеку, все настроил. Установил игры и весьма опечалился....

Запрет скачивание без каких либо действий
Доброго всем, у меня проблема, младший брат скачал что-то там на ноутбук, а антивирус не опознал, и...

При изменении каких либо данных программа либо вылетает, либо просто не изменяет данные
Добрый вечер. Только недавно начал заниматься С++. И вот возникли проблемы. При изменении каких...

10
6014 / 2136 / 744
Регистрация: 10.12.2010
Сообщений: 5,979
Записей в блоге: 3
10.10.2016, 16:46 2
Первое, что посоветую: привести обработчик сигналов в порядок. Он должен вызывать внутри себя только реентерабельные функции, поскольку обработчик сигнала не обязан вызываться в том же потоке, что и главная функция.

В вашем случае с этой точки зрения два косяка: вызов принтф-а (часть стандартного ввода-вывода -- не являются реентерабельными) и backtrace_symbols (вызывает внутри себя маллок). Пофиксите это, будем думать дальше.
0
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
10.10.2016, 18:22  [ТС] 3
HighPredator
-printf заменить на вывод в файл - будет норм?
-а как же без backtrace_symbols узнать где же я упал?

Добавлено через 1 час 15 минут
HighPredator, ещё раз подумал - если заложиться на то что принтф больше нигде в программе не идёт и падение происходит в одной точке то чем небезопасен приведённый код неясно
0
453 / 319 / 102
Регистрация: 02.10.2008
Сообщений: 1,245
Записей в блоге: 1
10.10.2016, 23:05 4
Вы впоследствии устанавливаете дефолтный обработчик и пересылаете SIGSEGV самому себе. Под линухами обычно данный сигнал в дефолте не только завершает прогу, но и скидывает корку Segmentation fault (core dumped). Если корки нет - то видать прога вываливается по другому сигналу.

Попробуйте убрать backtrace и работу с кучей free(), а printf выводит допустим нечто вроде ("получен SIGSEGV для %i",getpid()) Тогда точно можно будет определить наличие SIGSEGV.

З.Ы. не безопаснее ли использовать не signal() а sigaction(), или нужна совместимость с чем-то древним?
0
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
11.10.2016, 06:11  [ТС] 5
drfaust, тоже склоняюсь к тому что прилетает что-то другое, но что может так тихо ронять пока не понял. С sigaction просто не работал. А в чем крамола использования free в обработчике?
0
6014 / 2136 / 744
Регистрация: 10.12.2010
Сообщений: 5,979
Записей в блоге: 3
11.10.2016, 08:21 6
Цитата Сообщение от vxg Посмотреть сообщение
если заложиться на то что принтф больше нигде в программе не идёт и падение происходит в одной точке то чем небезопасен приведённый код неясно
Вы внимательно прочитали, что я написал? Принтф -- частный пример. Я специально указал, что все из stdio с этой точки зрения небезопасно. Так что закладываться нельзя. Я еще ни одной нормальной программы не видел, которая бы не использовала вообще никаких штатных средств ввода-вывода. Второе, это еще раз повторю маллок. Если код упал в нем, что вполне себе реально, то повторный заход туда... Ну вы сами все понимаете. Поэтому, сначала нужно нормально поймать и обработать сигнал, затем определить, откуда он вообще, а только потом трясти стектрейс.

Вот в каком ключе я обычно это делаю:
C
1
2
3
4
5
6
7
volatile sig_atomic_t signal_code = 0;
 
/* ... */
void signal_handler(int signal)
{
  signal_code = signal;
}
Все, дальше в нужном месте следует мониторить состояние переменной, и работать, только после завершения обработчиков сигналов. По теме:
http://www.ibm.com/developerworks/library/l-reent/ (общая теория и некоторые примеры с пояснениями)
http://man7.org/linux/man-pages/man7/signal.7.html (+ список реентерабельных функций, которые можно пользовать в обработчике сигналов)

Добавлено через 1 минуту
З.Ы. кстати вроде write пользовать можно..
1
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
11.10.2016, 09:17  [ТС] 7
HighPredator, статья и руководство, конечно, погрузили меня в нюансы, но даже в соответствии с ними - если printf или возможно даже malloc более нигде кроме обработчика не используются - то их можно безопасно вызывать (хотя ознакомившись с материалом у любого нормального человека вообще отпадёт желание предполагать что-либо как это делает IBM по поводу начинки библиотечных функций и вызывать в обработчике что-либо кроме официально безопасных функций). То есть код условно безопасный. Тем более что когда он вызывается все и так идёт к чертям и не до сантиментов - программа все равно через мс перестанет существовать. Основной акцент на том что падение тихое - и с обработчиком и без
0
6014 / 2136 / 744
Регистрация: 10.12.2010
Сообщений: 5,979
Записей в блоге: 3
11.10.2016, 10:02 8
Цитата Сообщение от vxg Посмотреть сообщение
Основной акцент на том что падение тихое - и с обработчиком и без
Маловероятно честно говоря.. Нет, есть у меня мысль как такое может быть, но это из разряда наркопаранойи. Попробуйте сделать хороший обработчик сигналов, и при отлове любого, сгенерируйте кордамп путем взвода сигнала 6 (сигаборт). Это (чисто имхо) более предпочтительно чем вызывать аборт непосредственно.

Добавлено через 31 секунду
Дальше можно кордамп поковырять, мало ли чего
1
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
11.10.2016, 11:41  [ТС] 9
HighPredator, сейчас запустил через gdb run может он падение озвучит...
0
453 / 319 / 102
Регистрация: 02.10.2008
Сообщений: 1,245
Записей в блоге: 1
11.10.2016, 18:44 10
Лучший ответ Сообщение было отмечено vxg как решение

Решение

Цитата Сообщение от vxg Посмотреть сообщение
А в чем крамола использования free в обработчике?
Если fprintf,read/write и т.п. ещё как-то можно ради дебага использовать в обработчиках(косяки не часто вылазят) то любая работа с кучей может кончится непредсказуемо. В libc очень много функций, использующих malloc/free и какая функция будет прервана сигналом науке неизсвестно.
Стоит в этот момент сделать хоть что-то с кучей в обработчике сигналов мы её уничтожаем, тут даже exit(1) не сработает(он, если не изменяет склероз попытается вернуть операционке всю занятую память, в том числе и для кучи, а её структуры разрушены - работа с кучей нереентабельна). завершить прогу удастся только с помощью abort() - а он файловые буфера не скидывает (возможна потеря/порча данных).

Кто может втихую закрыть прогу? https://ru.wikipedia.org/wiki/... 1%8B_(UNIX) - есть список сигналов и их действия по дефолту. Надо смотреть кто из них "завершает без core dump".

Почему sigaction? Он позволяет установить флаг SA_SIGINFO который вторым параметром (при использовании signal обработчик может получать только номер сигнала) может передать обработчику инфу, касательно данного сигнала - может оказаться при дебаге.
1
Модератор
3332 / 2116 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
12.10.2016, 06:47  [ТС] 11
Лучший ответ Сообщение было отмечено vxg как решение

Решение

drfaust, из того списка сигналов которые завершают тихо по работе программы там может быть SIGPIPE ибо сокеты имеются, но разве запись в разорванное соединение - это завершение программы!? Что за бред - всего-то должно вернуть ошибку и пойти дальше... я не прав?

Добавлено через 13 минут
drfaust, О БОЖЕ!!!! У send есть флажок который делает такое:
Don't generate a SIGPIPE signal if the peer on a stream-
oriented socket has closed the connection. The EPIPE error is
still returned. This provides similar behavior to using
sigaction(2) to ignore SIGPIPE, but, whereas MSG_NOSIGNAL is a
per-call feature, ignoring SIGPIPE sets a process attribute
that affects all threads in the process.
То есть без него мою программу прихлопнет всего лишь за запись в закрытый с той стороны сокет????

Добавлено через 10 часов 48 минут
...судя по документам так и есть - надо либо игнорировать сигнал либо слать флажок либо ставить опцию сокета. Никто не знает зачем они исторически сделали эту дикость включённой поумолчанию?

Добавлено через 6 минут
...страсти в чашке воды
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2016, 06:47

Выполнение каких-либо действий в цикле, пока приложение не будет закрыто
Возник вопрос с зацикливанием программы. Знаю что вопрос глупый (т.к. VB.NET пошагово все...

НЕ запускается без выдачи каких либо ошибок vs 2012
#include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;io.h&gt; #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt;...

Приложение без интерфейса, с кодом в Program.cs, завершается после выполнения
Добрый день. Есть приложение дергающее курсы валют с сайта нацбанка РБ. Интерфейс приложению не...

Происходит экстренное завершение приложения без каких-либо ошибок
Привет всем. В общем такая проблема. Написал я прогу и начал с ней работать. Запускаю прямо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.