LINUX.ORG.RU

segfault и прочие read access

 ,


1

4

Так и знал, что кодя на с-подобных столкнусь с этой ****. На ровных местах вылезает ошибка «доступ к памяти». Какая то переменная где-то кем-то удалилась и не может быть прочитана в другом месте.

Есть вот такая чепуха, которая в треде парсит логи на предмет ошибок и прочего

//lambda - вызывается тредом, передает локальную переменную строку
[](std::string line){
  if (std::regex_search(line, std::regex(".*(some err).*"))) debug();
  if (std::regex_search(line, std::regex(".*(some err2).*"))) debug();
  if (std::regex_search(line, std::regex(".*(some err3).*"))) debug();
  //...
}


Когда тред каким-то образом убивается (в моем случае это в основном при выходе из программы) вылезают ошибки доступа к памяти. По call-stack вижу что где то далеко в std::regexp (где то в 18 хопе вверх от моего вызова регекса). Как я понимаю, в regex_search() переменная далее идет по цепочке вызовов и в ккакой то момент она удаляется. Вот как такое предотвратить? Ведь на момент вызова regex_search() переменная существовала? Как я понимаю это из-за того что переменная локальная? Когда тред завершается принудительно переменная удаляется.

Может быть сделать некий конвеер, чтобы не локальную переменную передавать? Как лучше сделать, чтобы избежать такого?

★★★★

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

Ой начались нравоучения. Пойди туда, пойди сюда. Мы просто общаемся, расслабься)

gobot ★★★★
() автор топика
Ответ на: комментарий от rumgot

Да, такая переменная есть. Другое дело, что иногда тред зависает, ждет зависшую камеру бесконечо. Вот в этом случае я его нахлобучиваю (а что еще делать?). В этом случае вылезают всякие артефакты мне не понятные.

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

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

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

Нет ли возможности использовать таймаут на запуск функции чтения?

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 3)
Ответ на: комментарий от AlexVR

А зачем его вообще убивать?

Виснет он намертво, если камера зависла

К треду я конечно имею доступ, но косвеный. Не мною он писан. Ffmpeg.

gobot ★★★★
() автор топика
Ответ на: комментарий от rumgot

Для этого я использую другой тред, гипервизор, если таймаут превышен, он и убивает зависший тред

gobot ★★★★
() автор топика
Ответ на: комментарий от BackDoorLover

Я понимаю, что такое владение ресурсами, но не так хорошо как ты. Поэтому я тут)

gobot ★★★★
() автор топика
Ответ на: комментарий от t184256

Спасибо за совет, но 6а Ц я не собираюсь зацикливаться, все же сложный язык, не по мне. Но интерес есть непреодолимый, поэтому я тут

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

Да, я убиваю тред. Что нужно сделать, чтобы избежать таких конфузов? В самой лямбде я как понял проверки никакие не пройдут?

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

Не нужен тебе никакой колстек, тебе нужно сесть, взять карандаш, и на бумажке нарисовать логику своего приложения с тредами.

Потом разместить переменные и посмотреть, какие треды пишут/читают какие переменные. Устранить конфликты и гонки данных. Для этого тебе нужно разобраться в том, как вообще работают треды в частности и С++ в целом.

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

если тебе уже 3 человека 5 раз сказали про валгринд, то может стоит прислушаться.

Спасибо, пока воздержусь. Проблема не насущная. Мне не решение нужно, а понимание откуда ноги растут. Теория

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

Да нет. Не на какой функции падает. А на какой функции зависает тред? Ты там писал, что из-за того, что камера зависла. Т.е. ты там вызываешь чтение через функцию ffmpeg или типа того?

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)
Ответ на: комментарий от rumgot

Ааа...где зависает. Это я не отслеживал. Где то в недрах ffmpeg. Да и часто это бывает, для меня это не новость. Камеры вообще часто зависают. Я ffmpeg(саму программу, не либы) статично внедрил в свой код. Кое что разумеется подправил. В целом работает хорошо.

gobot ★★★★
() автор топика

В теории, если я не буду тред завершать «корректно». Как я могу корректно завершить оставшиеся «хвосты»? Я как понимаю они живучие. Как всю эту требуху убить?

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

Я ffmpeg(саму программу, не либы) статично внедрил в свой код.

Как это понять? Ты вызываешь программу ffmpeg из своего кода? Или взял исходники ffmpeg и вставил их в свой код?

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

На чем? Что сложнее чего? При чем тут это вообще?

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

Там с разных тредов поступают данные в лямбду...

debug() потокобезопасен?

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