Автор Тема: segmentation fault и отладочная печать  (Прочитано 2908 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн mihail_1

  • Местный житель
  • ***
  • Topic Author
  • Сообщений: 176
segmentation fault и отладочная печать
« : 14 Декабря 2012, 16:22:34 »
При запуске программа (исходник на си) через некоторое время завершается сообщением segmentation fault. Поскольку программа еще отлаживается в ней много отладочных сообщений на экран. Поскольку их много, при запуске поток вывода перенаправляется в файл.
Но когда программа аварийно останавливается в файл не записываются несколько последних сообшений, поэтому запустил оставив вывод на экран. Ошибка не произошла. Проверил многократно - если вывод на экран ошибки нет, если в файл - есть, если запускаю под valgrind ошибки нет.
Как может работа программы зависеть от того куда направлен поток вывода?
 

Оффлайн qupl

Re: segmentation fault и отладочная печать
« Ответ #1 : 14 Декабря 2012, 18:55:27 »
Легко, программа убивается ДО того как сообщения доходят до консоли (вывод в файл быстрее).

Оффлайн mihail_1

  • Местный житель
  • ***
  • Topic Author
  • Сообщений: 176
Re: segmentation fault и отладочная печать
« Ответ #2 : 14 Декабря 2012, 19:06:55 »
Да не убивается она ни чем, если сообщения идут на консоль, и если запущена под отладчиком тоже работает без ошибок, а вот если в файл - умирает стабильно и последние сообщения в файл попать не успевают. Из-за этого невозможно напрямую выяснять причину.
 

Оффлайн qupl

Re: segmentation fault и отладочная печать
« Ответ #3 : 14 Декабря 2012, 19:09:31 »
Значит я не понял ситуации. При выводе в консоль ошибки нет совсем, а при выводе в файл есть? (код тот же)

Оффлайн mihail_1

  • Местный житель
  • ***
  • Topic Author
  • Сообщений: 176
Re: segmentation fault и отладочная печать
« Ответ #4 : 14 Декабря 2012, 19:12:01 »
Тот же исходник и та же сборка.
Только в командной строке в конце есть или нет ' > file.txt'
 

Оффлайн qupl

Re: segmentation fault и отладочная печать
« Ответ #5 : 14 Декабря 2012, 19:15:35 »
mihail_1, в коде есть места критичные к времени между операторами?

Оффлайн mihail_1

  • Местный житель
  • ***
  • Topic Author
  • Сообщений: 176
Re: segmentation fault и отладочная печать
« Ответ #6 : 14 Декабря 2012, 19:23:54 »
Явных быть не должно, но могут быть ошибки с флагами управляющими потоками (нитями), хотя вроде все уже по сто раз проверены.

В логе сообщений ошибка 4 в libmysqlclient_r.so.15.0.0
В логе mysql сообщение, что произошла ошибка 127 при чтении таблицы
Команда check для данной таблицы выдает Ok
 

Оффлайн qupl

Re: segmentation fault и отладочная печать
« Ответ #7 : 14 Декабря 2012, 19:39:01 »
Закомментировать отладочные сообщения "с конца" или с того момента как они обрываются и до конца. Проверить осталась ли ошибка с перенаправлением в файл. Дальше плясать по обстоятельствам, по крайней мере место где просиходит баг обозначится.
Ошибка чтения таблиц БД может быть , например, таймаутом выполнения запроса.

Оффлайн mihail_1

  • Местный житель
  • ***
  • Topic Author
  • Сообщений: 176
Re: segmentation fault и отладочная печать
« Ответ #8 : 14 Декабря 2012, 20:09:53 »
Можно конечно позакоментировать, но то что успело попасть в файл здесь никак не поможет. Система не сразу кидает все в файл, а буферезует до целого блока какой-то длинны и последнее сообщение в файле обычно не целое. При аварийном завершении содержимое буфера теряется.

Не совсем понял: таймаут не передается как результат а прямо вызывает прекращение работы? Так ведь нельзя!
Я проверяю все что возвращают вызовы mysql и в случае ошибки выдаю сообщение и вызываю exit(). (при этом будет нормальное завершение и буфер сохранится)
 

Оффлайн qupl

Re: segmentation fault и отладочная печать
« Ответ #9 : 14 Декабря 2012, 20:28:01 »
Про таймаут - это размышления на тему, почему могут возникать ошибки на целых по факту таблицах.

Оффлайн mihail_1

  • Местный житель
  • ***
  • Topic Author
  • Сообщений: 176
Re: segmentation fault и отладочная печать
« Ответ #10 : 14 Декабря 2012, 20:41:20 »
В принципе запрос на чтение может быть выдан в то время, когда выполняется запрос на вставку многих тысяч записей и выполняется он явно не мгновенно, но вроде бы это нормальная ситуация и запрос на чтение должен дождаться завершения запроса на вставку, а не вызывать аварийное завершение программы.
Хотя нагрузка на диски близка к 100%, но врятли то смещение по времени которое даст запись отладок на диск или на консоль на это может повлиять - время встаки существенно больше.
 

Оффлайн Olej

Re: segmentation fault и отладочная печать
« Ответ #11 : 15 Декабря 2012, 23:24:57 »
Явных быть не должно, но могут быть ошибки с флагами управляющими потоками (нитями), хотя вроде все уже по сто раз проверены.

В логе сообщений ошибка 4 в libmysqlclient_r.so.15.0.0
В логе mysql сообщение, что произошла ошибка 127 при чтении таблицы
Команда check для данной таблицы выдает Ok

1. mihail_1, насколько я помню, вы достаточно путаетесь в многопоточном программировании, а здесь (при недостаточности синхронизаций) всё зависит от соотношений времени;
(сделайте для эксперимента все свои действия последовательно в одном потоке - и весь ваш цирк с segmentation fault прекратится)

2. как-раз mysql (или его клиентские библиотеки ... не помню деталей) - очень не любят параллельное выполнение.

3. после printf() в отладочных операторах делайте сразу же fflush() - и не будет у вас буферизации, и будет вам счастье  ;D


Сообщение объединено: 17 Декабря 2012, 22:34:25
А fflush() из программы действует даже на угловую скобку в командной строке?
(у меня стоят printf(), а не fprintf())
Без разницы. fflush() - это "немедленно опорожнить буфер", а куда - это уже не важно, если вы перенаправили в файл, то в файл.
« Последнее редактирование: 17 Декабря 2012, 22:34:25 от Olej »
 

Оффлайн mihail_1

  • Местный житель
  • ***
  • Topic Author
  • Сообщений: 176
Re: segmentation fault и отладочная печать
« Ответ #12 : 16 Декабря 2012, 23:26:09 »
Проблем с многопоточным программированием у меня поубавилось после того, как вынул из системного блока умершую линейку памяти. Но тогда ошибки сыпались почти из всех стандартных библиотек. В этот раз похоже память не виновата.

На многопоточную клиентскую библиотеку mysql жалуются многие, но при работе с разными таблицами или запросами только на чтение из одной она ведет себя хорошо. Но есть подозрение что чтение во время или сразу после большой вставки в одну таблицу завершается segmentation fault. Я предполагал, что mysql сам разведет запросы во времени, но теперь меняю алгоритм так чтобы запретить это у себя и не сильно потерять производительность.

А fflush() из программы действует даже на угловую скобку в командной строке?
(у меня стоят printf(), а не fprintf())
 

Теги: