LINUX.ORG.RU

Завиcание на qDebug

 , ,


2

2

Проблема появилась после обновления с ubuntu 14.10 до 16.04 и сборки программы с qt5 вместо qt4. Не представляю как это дебажить. Зависает не на первом вызове, а через некоторое время. В чем может быть причина?

1  write                                                                      syscall-template.S
2  _IO_new_file_write                                                         fileops.c         
3  new_do_write                                                               fileops.c         
4  _IO_new_file_xsputn                                                        fileops.c         
5  buffered_vfprintf                                                          vfprintf.c        
6  _IO_vfprintf_internal                                                      vfprintf.c        
7  ___fprintf_chk                                                             fprintf_chk.c     
8  ??                                                                                           
9  ??                                                                                           
10 QMessageLogger::debug(const char *, ...) const                                               


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

нет, я никуда не перенаправлял

Ower
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Для начала попробовать версию отсюда

Я бы поостерёгся с такого начинать и тем более советовать. Да, теоретически есть вероятность, что проблема в Qt, но всё же гораздо вероятнее, что в самой программе проблема, которая просто раньше не проявлялась.

Я бы всё-таки сначала погонял всякие проверки, помахал valgrind-ом и др. И уже если ничего не помогает - начал бы щупать версии Qt.

hobbit ★★★★★
()

Также напоминаю, что qDebug - это инструмент для отладки и ничего больше. Если у тебя он действительно используется в качестве такового, и ты ищешь проблему, которая возникла ещё до него - можно попробовать и другие способы отладки, логгирование в файл, например.

Я бы ещё посмотрел, не являются ли передаваемые в qDebug строки объектами, которые уже как-то испорчены. В этом случае и qDebug может вызвать зависание, разумеется.

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

Так ничего не падает, это из отладчика трейс.

И он был бы как раз таким, пока поток спит, ожидая освобождения места. Я потому и спросил, так как понял, что висит в ядре.

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

Убрать qDebug в том месте не проблема - он там больше не нужен. Мне хочется разобраться почему он вызывает зависание. в qdebug такое:

qDebug("[Class::function]: %jd/%d", (intmax_t)qint64_variable, bool_variable);

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

qDebug(«[Class::function]: %jd/%d», (intmax_t)qint64_variable, bool_variable);

%d

bool_variable

Как минимум одна проблема найдена, попытка прочитать 32-битный int за пределами булевой переменной. Не уверен, что это и есть причина зависаний, я бы открыл в отладчике и посмотрел во что сформировалась строка, возможно она не заканчивается нулём. Также можно собрать Qt самому в режимах debug и release, проверить повторяемость, по крайней мере на шаг к причине проблемы станет ближе.

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

попытка прочитать 32-битный int за пределами булевой переменной

А разве здесь числовые типы меньшие int не приводятся в тип int (как в функциях семейства printf)?

shnnmnn
()
Ответ на: комментарий от shnnmnn

Нет, это не проблема. Но попробуй переписать так:

qDebug() << "[Class::function]:" << qint64_variable << bool_variable;
Убрать кавычки это qDebug().noquote() <<

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 2)
Ответ на: комментарий от shnnmnn

А разве здесь числовые типы меньшие int не приводятся в тип int (как в функциях семейства printf)?

Приводить или нет может решить только компилятор на основании всякой эвристики, такой как атрибуты функций и строка форматирования, известная на этапе компиляции. Это нестандарт и в общем случае не работает.

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

Да ты шо.
http://stackoverflow.com/questions/2725044/can-i-assume-booltrue-int1-for-any...

Integral promotion applies and the bool value will be promoted to an int and this promotion must yield 1.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf

If the destination type is bool, see 4.12. If the source type is bool, the value false is converted to zero and

the value true is converted to one.

someoneelsenotme
()

У меня такой вопрос. Программа собиралась тем же самым компилятором, с теми же настройками, что и библиотека Qt?

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

А разве здесь числовые типы меньшие int не приводятся в тип int (как в функциях семейства printf)?

Перечитал ещё раз документацию, всё верно, интегральные типы размером меньше int приводятся к int во всех variadic-функциях.

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

Ты путаешь статическое приведение с правилами приведения для функций с переменным количеством аргументов.

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

Программа собиралась тем же самым компилятором, с теми же настройками, что и библиотека Qt?

Минутку, разве в Linux это важно? Я слышал что это проблема оффтопика, но никак не Linux. Или я что-то упустил?

Автор темы так и не попробовал qDebug() <<

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от someoneelsenotme

Могу ещё раз повторить, что ты путаешь статическое приведение с правилами приведения для функций с переменным количеством аргументов. Твои ссылки выше к теме не имеют отношения.

Dendy ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Пока что новых зависаний не было, кроме изначальных пары раз. Но, возможно, недостаточно долгими были сессии программы.

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

Чтоб падало на qDebug - вангую что сбой памяти где то в другом месте. НИКОГДА не видел чтобы падало на вызове qDebug, поэтому с большой долей вероятности предполагаю проблемы с памятью - где-то затаилась ошибка.

Да, проведи memtest компа где падало.

Еще - бывает надо собрать проект начисто и падения прекратятся, есть такая проблемка.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

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

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

многопоточное. не переопределялся. висло в главном потоке

Ower
() автор топика
4 июля 2018 г.

Возможно, это косяк в докере

Я недавно столкнулся абсолютно с такой же проблемой. Наработка на отказ - 10-30 минут. Программа интенсивно писала логи в консоль.

После того, как это же наигралось на невинном

cat /dev/urandom | hexdump
стало ясно, что проблема в ОС.

В родительской ОС не наигрывалось, а вот в докере - в лучшем виде.

Товарищи расследовали это дело, и вот что у них вышло:

https://github.com/containerd/console/pull/27

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