Название: valgrind Отправлено: __Heaven__ от Декабрь 16, 2014, 11:07 Привет, друзья!
Поставил себе чудо утилиту valgrind. Только не понял, как этим чудом пользоваться. Произвёл в креаторе запуск и получил Цитировать Conditional jump or move depends on uninitialised value(s) Код, на который идет ссылка:в Positioner::repackElementsByVolumes(QVector<int> const&, QVector<int> const&) в positioner.cpp:1337 Код Участок считает количество подряд идущих значений в векторе. В упор не вижу ошибки. Ссылка идет на while(lastVol == *depend && depend != dependEnd). На сколько правильно пользоваться валгриндом из-под креатора? В качестве обучения я нашёл только 1 книгу на английском и кучу статей. Так понимаю, что хороших русскоязычных источников нет? Чем полезно профилирование? Так и не понял... Название: Re: valgrind Отправлено: Пантер от Декабрь 16, 2014, 11:12 Ищи утечки памяти по ключевому слову definitely.
А так, да, литература только на английском. На хабре было несколько статей, поищи. Или клочки инфы по форумам. Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 16, 2014, 11:17 А на сколько этот инструмент популярен в промышленном программировании?
Название: Re: valgrind Отправлено: Пантер от Декабрь 16, 2014, 11:26 Достаточно популярен. Я аналогов свободных не знаю.
Название: Re: valgrind Отправлено: navrocky от Декабрь 16, 2014, 11:29 Код
Ну видно же, что на последней итерации, когда depend == dependEnd, где dependEnd указывает за последний элемент массива, lastVol = *depend будет читать левые данные. Я valgrind использую часто, альтернатив нет, даже когда целевая платформа - винда (собираю в линуксе и прогоняю валгриндом). Под винду тоже искал что-то похожее, но там мрак. Есть от интела Inspector XE, но он такой неочевидный, тормозит при анализе еще похлеще valgrind и кажется стоит денег. Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 16, 2014, 11:40 Ну видно же, что на последней итерации, когда depend == dependEnd, где dependEnd указывает за последний элемент массива, lastVol = *depend будет читать левые данные. Ну, меня в последствии не интересует lastVol. То есть он на lastVol ругался в том выражении...И что теперь? Добавляем ситуацию в исключение и забываем? Кстати, раз уж о проверке кода, на сколько нужны всяческие проверялки типа разрекламированной pvs? Название: Re: valgrind Отправлено: Пантер от Декабрь 16, 2014, 11:49 Я юзаю cppcheck иногда, pvs не трогал.
Название: Re: valgrind Отправлено: navrocky от Декабрь 16, 2014, 11:51 Ну видно же, что на последней итерации, когда depend == dependEnd, где dependEnd указывает за последний элемент массива, lastVol = *depend будет читать левые данные. Ну, меня в последствии не интересует lastVol. То есть он на lastVol ругался в том выражении...И что теперь? Добавляем ситуацию в исключение и забываем? Кстати, раз уж о проверке кода, на сколько нужны всяческие проверялки типа разрекламированной pvs? Название: Re: valgrind Отправлено: Fregloin от Декабрь 16, 2014, 11:56 есть еще какие то тулзы гугловские, но походу они только с clang работают.
валгриндом прогоняю периодически, но честно говоря он много выдает мусора из загруженных библиотек (ругается как на кутешные так и на нативные линуксовые либы). Название: Re: valgrind Отправлено: Пантер от Декабрь 16, 2014, 12:05 есть еще какие то тулзы гугловские, но походу они только с clang работают. На Кьютовые можно фильтр установить, как и на другие.валгриндом прогоняю периодически, но честно говоря он много выдает мусора из загруженных библиотек (ругается как на кутешные так и на нативные линуксовые либы). Название: Re: valgrind Отправлено: Пантер от Декабрь 16, 2014, 12:05 Ну видно же, что на последней итерации, когда depend == dependEnd, где dependEnd указывает за последний элемент массива, lastVol = *depend будет читать левые данные. Ну, меня в последствии не интересует lastVol. То есть он на lastVol ругался в том выражении...И что теперь? Добавляем ситуацию в исключение и забываем? Кстати, раз уж о проверке кода, на сколько нужны всяческие проверялки типа разрекламированной pvs? Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 16, 2014, 12:06 валгриндом прогоняю периодически, но честно говоря он много выдает мусора из загруженных библиотек (ругается как на кутешные так и на нативные линуксовые либы). Так понимаю, что эти ошибки можно занести в исключения и при повторной проверке ловить реальные, свои ошибки.А ещё я не совсем понял, каким образом происходит анализ. Мне необходимо протыкать все возможности моей программы? Чтобы она залезла в каждую веточку? Название: Re: valgrind Отправлено: Igors от Декабрь 16, 2014, 12:39 В упор не вижу ошибки. Ссылка идет на while(lastVol == *depend && depend != dependEnd). Лучше переставить условия, т.к. *depend читает ячейку за границами вектора (и, возможно, доступной памяти). Также не ловите "хвост". Напр depend == dependEnd), count = 0, а Вы все равно добавляете пару.Лучше чуть поступиться оптимальностью, но упростить код, напр Код
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 16, 2014, 13:00 Спасибо.
Попробовал cppcheck - понравилась. Название: Re: valgrind Отправлено: Пантер от Декабрь 16, 2014, 13:03 Спасибо. Она не очень много показывает. Вообще, лучшая связка:Попробовал cppcheck - понравилась. 1. Включить максимально ворнинги при компиляции и все фиксить. 2. Собирать clang. 3. Пробегать периодически cppcheck. 4. Вставлять всякие проверки (ассерты). 5. Писать чистый кот. Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 16, 2014, 14:10 2. Собирать clang. Поясните, пожалуйста. Я читал про это средство, понял, что оно относится к RISK машинам и всё, что я о нем знаю.Название: Re: valgrind Отправлено: Пантер от Декабрь 16, 2014, 14:13 Это компиль же. Выдает больше ворнингов, чем гцц и компиляет быстрее.
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 16, 2014, 14:19 А вы отказались от gcc в пользу него?
Название: Re: valgrind Отправлено: Пантер от Декабрь 16, 2014, 14:22 В работе его использую, но деплоим под гцц. И под виндой я CLang не смог завести.
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 16, 2014, 14:38 а у меня на работе винда... Но я попробую его завести.
То есть, если я правильно понял, то clang создаёт код быстрее и сыпет больше анализа. Как насчёт отладки? QtCreator её поддерживает? Название: Re: valgrind Отправлено: Пантер от Декабрь 16, 2014, 14:42 Про кот быстрее, я бы не стал утверждать, но сборка быстрее идет и анализ лучше. Под виндой лучше погугли.
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 16, 2014, 14:51 Про кот быстрее, я бы не стал утверждать Я имел в виду время компиляции. Спасибо.Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 16, 2014, 15:54 А qt, получается, нужно будет пересобирать клэнгом?
Название: Re: valgrind Отправлено: Пантер от Декабрь 16, 2014, 15:56 Нет. По кайней мере, под Линухом. У меня вся система собрана гцц.
Название: Re: valgrind Отправлено: Пантер от Декабрь 16, 2014, 16:06 Чтобы в гцц и шланге врубить максимальные ворнинги:
Код: QMAKE_CXXFLAGS += -Wall -Wextra -pedantic Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 16, 2014, 16:07 Чтобы в гцц и шланге врубить максимальные ворнинги: thxКод: QMAKE_CXXFLAGS += -Wall -Wextra -pedantic Название: Re: valgrind Отправлено: Пантер от Декабрь 16, 2014, 16:09 Еще -Werror добавь, тогда ворнинги превратятся в ошибки и не дадут их игнорить. ;)
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 16, 2014, 17:08 Еще -Werror добавь, тогда ворнинги превратятся в ошибки и не дадут их игнорить. ;) И вообще прогать ;D ;D ;DНазвание: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 11:59 Компилятор я собрал используя VS2013.
Как это чудо теперь прикручивать? (см. аттач) mingw32-make ругается, что не найден. замена на cmake не помогла - кривые руки. Название: Re: valgrind Отправлено: Пантер от Декабрь 17, 2014, 12:04 Покажи вкладку Compilers.
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 12:07 До меня дошло, что там нужно покрутить - результат в аттаче.
Но, всё равно не собирает. Как и что указать, чтобы собирал? Сейчас на вкладке проектов вручную указал путь к mingw32-make. Цитировать 12:03:23: Running steps for project untitled10... 12:03:23: Configuration unchanged, skipping qmake step. 12:03:23: Starting: "C:\Qt\Qt5.4.0\Tools\mingw491_32\bin\mingw32-make.exe" C:/Qt/Qt5.4.0/Tools/mingw491_32/bin/mingw32-make -f Makefile.Debug mingw32-make[1]: Entering directory 'D:/QtProjects/build-untitled10-CLANG-Debug' g++ -c -pipe -fno-keep-inline-dllexport -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I../untitled10 -I'C:/Qt/Qt5.4.0/5.4/mingw491_32/include' -I'C:/Qt/Qt5.4.0/5.4/mingw491_32/include/QtWidgets' -I'C:/Qt/Qt5.4.0/5.4/mingw491_32/include/QtGui' -I'C:/Qt/Qt5.4.0/5.4/mingw491_32/include/QtCore' -I'debug' -I'.' -I'.' -I'C:/Qt/Qt5.4.0/5.4/mingw491_32/mkspecs/win32-g++' -o debug/main.o ../untitled10/main.cpp g++: error: CreateProcess: No such file or directory Makefile.Debug:352: recipe for target 'debug/main.o' failed mingw32-make[1]: *** [debug/main.o] Error 1 mingw32-make[1]: Leaving directory 'D:/QtProjects/build-untitled10-CLANG-Debug' mingw32-make: *** [debug] Error 2 makefile:34: recipe for target 'debug' failed 12:03:23: The process "C:\Qt\Qt5.4.0\Tools\mingw491_32\bin\mingw32-make.exe" exited with code 2. Error while building/deploying project untitled10 (kit: CLANG) When executing step "Make" 12:03:23: Elapsed time: 00:01. Название: Re: valgrind Отправлено: Пантер от Декабрь 17, 2014, 12:10 Он у тебя пытается таки g++ юзать. К сожалению, я тут помочь не могу - винды нет. :(
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 12:12 А если так?
Название: Re: valgrind Отправлено: Пантер от Декабрь 17, 2014, 12:13 видишь спец у тебя win32-g++, а надо шланг.
Вот, нагуглил, глянь http://qt-project.org/forums/viewthread/17516 Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 12:25 Сделал как в посте. Начал ругаться на неизвестные опции -fno-keep-inline-dllexport и -mthreads
Сделал Код: QMAKE_CXXFLAGS -= -fno-keep-inline-dllexport Насчёт win32-g++, кажись, без вариантов Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 12:28 Да и как меняется этот -spec? Я хучу common попробовать
Название: Re: valgrind Отправлено: Пантер от Декабрь 17, 2014, 12:30 Походу, все таки надо Кьют шлангом собирать.
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 12:32 Походу, все таки надо Кьют шлангом собирать. Неееееееет :)У меня этого ниразу не удавалось сделать... Название: Re: valgrind Отправлено: Пантер от Декабрь 17, 2014, 12:38 Там ничего сложного. Я с самого начала собирал вручную Кьют, бинарный вариант вообще не юзал. Выдели день на это, думаю, справишься. Правда, 5 Кьют сложнее стало собирать, но руководств достаточно много.
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 12:44 Пока ещё хочу побороться за совместимость.
С какими опциями вы компилируете проект? Как заставить собирать в 32/64 бит? Название: Re: valgrind Отправлено: Пантер от Декабрь 17, 2014, 12:49 64 под виндой я не осилил. А про какие опции ты спрашиваешь?
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 13:09 Я спрашивал про опции
Код: clang --options sources В общем мне удалось как-то соединить mingw32-make, Qt5.4 MSVC2013, clang. Компиляция начинается - сыпет уйму варнингов, в основном, что enum имеет int, а значения в них записываются в отрицательном виде (или что-то в этом роде) Цитировать enumerator value is not representable in the underlying type 'int' [-Wmicrosoft] Для создания связки делал свой mkspec win32-clang основываясь на разнице между linux-g++ и linux-clang (http://stackoverflow.com/questions/14578311/what-are-the-mkspecs-for-clang-to-build-qt)В итоге мы не можем скомпилировать строчку try { Название: Re: valgrind Отправлено: Пантер от Декабрь 17, 2014, 14:07 Никаких опций отдельно не настраиваю. Для приложения должно быть все равно gcc или clang.
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 14:48 Тему уже пора переносить в говорилку :) :) :) шучу
Во беда. Так и не вымучил clang под win32. Пересобирать qt лень. Вообще, как я понял, этот компиль можно прилепить к либе собранной любым широкоизвестным компилем. Интереса ради решил попробовать clang под линукс. Через 5 минут у меня уже был скомпилен проект :) Какого чёрта так сложно под виндой! :) :) :) Название: Re: valgrind Отправлено: Пантер от Декабрь 17, 2014, 14:50 Под виндой вообще хреново разрабатывать, ИМХО. Поэтому я разрабатываю под Линем. :)
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 14:51 Правда, у меня cppcheck поругался на непроинициализированные переменные в конструкторах. Clang же промолчал вовсе.
Название: Re: valgrind Отправлено: Пантер от Декабрь 17, 2014, 14:53 А включены -Wall -Wextra -pedantic?
Что за переменные? Может, они нормально сами инициализируются? Кот в студио! Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 14:59 А включены -Wall -Wextra -pedantic? Включил. Получил 8025 проблем. Да я же с ума сойду это шерстить :)Что за переменные? Может, они нормально сами инициализируются? Кот в студио! в основном ругается на -Wc++11-long-long из-за qint64 всяких Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 15:01 Что за переменные? Может, они нормально сами инициализируются? Кот в студио! Да там есть что-то на подобииКод: class Class() Название: Re: valgrind Отправлено: Пантер от Декабрь 17, 2014, 15:02 Советую поправить, а то среди этой простыни могут затесаться важные вещи. Или попробуй pedantic отключить.
Название: Re: valgrind Отправлено: Пантер от Декабрь 17, 2014, 15:02 Да и не должно на такое ругаться. Тут cppcheck перебдел.
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 15:03 Советую поправить, а то среди этой простыни могут затесаться важные вещи. Или попробуй pedantic отключить. А можно конкретно проверку -Wc++11-long-long отключить при выставленных опциях?Название: Re: valgrind Отправлено: Пантер от Декабрь 17, 2014, 15:05 Можно, разрешаю.что-то типа -Wno-c++11-long-long
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 15:08 Спасибо.
При отключении -pedantic 0 предупреждений. А cppcheck, как мне кажется, прав. Не совсем правильно писать какой-нибудь init() и потом вызывать его вместо конструктора. Буквально сегодня это прочитал у Страуструпа в книжке. Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 15:09 -Wno-c++11-long-long дал 0 предупреждений :)
Название: Re: valgrind Отправлено: Пантер от Декабрь 17, 2014, 22:16 __Heaven__, напиши, пожалуйста, хаутушку как заводить clang под виндой. Тебе люди спасибо скажут.
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 22:26 так у мну только собрать его удалось под виндой. а компилить он не хочет... (по некоторым данным, какие-то exceptions виноваты).
Нужно попробовать 12 студию. Название: Re: valgrind Отправлено: Пантер от Декабрь 17, 2014, 22:29 Ну, если осилишь, поделись с народом.
Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 17, 2014, 22:31 ок.
А вообще, на сайте у них есть бинарники. Это я от бедности собирать начал - админских прав нет у меня, а просить очередную игрушку неудобно. Название: Re: valgrind Отправлено: __Heaven__ от Декабрь 18, 2014, 00:06 Успех с гемороем в перемешку. :o
Для vs10 расскажу, как это сделать. Только половину команд (правдивее - больше или даже все), передаваемых клэнгу, не знаю. Название: Re: valgrind Отправлено: __Heaven__ от Февраль 15, 2015, 16:12 Это нормально? См. аттач
Название: Re: valgrind Отправлено: navrocky от Февраль 15, 2015, 23:20 Это у тебя ГТК-шный стиль кривой, смени.
Название: Re: valgrind Отправлено: __Heaven__ от Февраль 16, 2015, 09:01 Не понимаю...
Со стилями не работал Название: Re: valgrind Отправлено: navrocky от Февраль 17, 2015, 13:02 Ты сидишь в гноме, Qt-шные приложения у тебя использует прокси стиль для гнома, который использует нативный гномовский стиль для отрисовки виджетов. Так вот текущий гномовский стиль судя по всему криво написан и даёт эти ошибки.
Выхода два: 1) Забить на эту ошибку если приложения не крэшатся. 2) Сменить системный стиль оформления на другой или обновить его до последней версии. Ошибка, возможно, уйдёт. ЗЫЖ Сейчас ещё раз глянул в стек трейс, похоже ошибка в самом gtk-x11, видимо тут смена стиля не поможет. Попробуй эту ошибку заигнорить в valgrind. Название: Re: valgrind Отправлено: __Heaven__ от Февраль 17, 2015, 14:30 Спасибо
|