Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461

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

10.10.2016, 16:03. Показов 1955. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.10.2016, 16:03
Ответы с готовыми решениями:

Зависание приложение во время выполнения каких-либо операций
Здрати.. У меня приложение на время выполнения цикла или вовремя запроса до URL зависает полностью... На 100-200мс Как сделатьт что бы...

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

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

10
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
10.10.2016, 16:46
Первое, что посоветую: привести обработчик сигналов в порядок. Он должен вызывать внутри себя только реентерабельные функции, поскольку обработчик сигнала не обязан вызываться в том же потоке, что и главная функция.

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

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

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

З.Ы. не безопаснее ли использовать не signal() а sigaction(), или нужна совместимость с чем-то древним?
0
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
11.10.2016, 06:11  [ТС]
drfaust, тоже склоняюсь к тому что прилетает что-то другое, но что может так тихо ронять пока не понял. С sigaction просто не работал. А в чем крамола использования free в обработчике?
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
11.10.2016, 08:21
Цитата Сообщение от 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
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
11.10.2016, 09:17  [ТС]
HighPredator, статья и руководство, конечно, погрузили меня в нюансы, но даже в соответствии с ними - если printf или возможно даже malloc более нигде кроме обработчика не используются - то их можно безопасно вызывать (хотя ознакомившись с материалом у любого нормального человека вообще отпадёт желание предполагать что-либо как это делает IBM по поводу начинки библиотечных функций и вызывать в обработчике что-либо кроме официально безопасных функций). То есть код условно безопасный. Тем более что когда он вызывается все и так идёт к чертям и не до сантиментов - программа все равно через мс перестанет существовать. Основной акцент на том что падение тихое - и с обработчиком и без
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
11.10.2016, 10:02
Цитата Сообщение от vxg Посмотреть сообщение
Основной акцент на том что падение тихое - и с обработчиком и без
Маловероятно честно говоря.. Нет, есть у меня мысль как такое может быть, но это из разряда наркопаранойи. Попробуйте сделать хороший обработчик сигналов, и при отлове любого, сгенерируйте кордамп путем взвода сигнала 6 (сигаборт). Это (чисто имхо) более предпочтительно чем вызывать аборт непосредственно.

Добавлено через 31 секунду
Дальше можно кордамп поковырять, мало ли чего
1
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
11.10.2016, 11:41  [ТС]
HighPredator, сейчас запустил через gdb run может он падение озвучит...
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
11.10.2016, 18:44
Лучший ответ Сообщение было отмечено 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
Модератор
 Аватар для vxg
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
12.10.2016, 06:47  [ТС]
Лучший ответ Сообщение было отмечено 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.10.2016, 06:47
Помогаю со студенческими работами здесь

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

Выполнение каких-либо действий в цикле, пока приложение не будет закрыто
Возник вопрос с зацикливанием программы. Знаю что вопрос глупый (т.к. 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; #include &lt;dos.h&gt; #define...

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru