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

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

10.10.2016, 16:03. Показов 1883. Ответов 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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
10.10.2016, 18:22  [ТС]
HighPredator
-printf заменить на вывод в файл - будет норм?
-а как же без backtrace_symbols узнать где же я упал?

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

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

З.Ы. не безопаснее ли использовать не signal() а sigaction(), или нужна совместимость с чем-то древним?
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
11.10.2016, 11:41  [ТС]
HighPredator, сейчас запустил через gdb run может он падение озвучит...
0
599 / 421 / 136
Регистрация: 02.10.2008
Сообщений: 1,796
Записей в блоге: 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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru