Russian Qt Forum

Программирование => Общий => Тема начата: __Heaven__ от Декабрь 16, 2014, 11:07



Название: 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
Код, на который идет ссылка:
Код
C++ (Qt)
   const int* depend = depends.constData(),
            * dependEnd = depend + depends.size();
 
   int nVolumes = volumes.size();
 
   // в вектор записывается пара объём - количество повторений подряд
   QVector< QPair<int, int> > valueMap;
   valueMap.reserve(nVolumes);
 
   int lastVol = -1;
   while (depend != dependEnd)
   {
       int count = 0;
       while(lastVol == *depend && depend != dependEnd)
       {
           ++count;
           ++depend;
       }
       valueMap << QPair<int, int> (lastVol, count);
       lastVol = *depend;
   }
 
Участок считает количество подряд идущих значений в векторе.
В упор не вижу ошибки. Ссылка идет на 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
Код
C++ (Qt)
   const int* depend = depends.constData(),
   while (depend != dependEnd)
   {
       int count = 0;
       while(lastVol == *depend && depend != dependEnd)
       {
           ++count;
           ++depend;
       }
       valueMap << QPair<int, int> (lastVol, count);
       lastVol = *depend;
   }
 

Ну видно же, что на последней итерации, когда 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?
Я думаю, они помогают. PVS, правда, анально огорожена, работает только с микрософтовским компилятором. Анализатор у неё, судя по всему, наиболее умный. Можешь попробовать триал погонять. Есть cppcheck - но он вообще ничего сложного не видит, показывает только очень простые и очевидные вещи.


Название: 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?
Я думаю, они помогают. PVS, правда, анально огорожена, работает только с микрософтовским компилятором. Анализатор у неё, судя по всему, наиболее умный. Можешь попробовать триал погонять. Есть cppcheck - но он вообще ничего сложного не видит, показывает только очень простые и очевидные вещи.

На сколько я помню, они добавляли другие компили.


Название: Re: valgrind
Отправлено: __Heaven__ от Декабрь 16, 2014, 12:06
валгриндом прогоняю периодически, но честно говоря он много выдает мусора из загруженных библиотек (ругается как на кутешные так и на нативные линуксовые либы).
Так понимаю, что эти ошибки можно занести в исключения и при повторной проверке ловить реальные, свои ошибки.

А ещё я не совсем понял, каким образом происходит анализ. Мне необходимо протыкать все возможности моей программы? Чтобы она залезла в каждую веточку?


Название: Re: valgrind
Отправлено: Igors от Декабрь 16, 2014, 12:39
В упор не вижу ошибки. Ссылка идет на while(lastVol == *depend && depend != dependEnd).
Лучше переставить условия, т.к. *depend читает ячейку за границами вектора (и, возможно, доступной памяти). Также не ловите "хвост". Напр depend == dependEnd), count = 0, а Вы все равно добавляете пару.

Лучше чуть поступиться оптимальностью, но упростить код, напр
Код
C++ (Qt)
typedef QPair <int, int> TPair;
QVector <TPair> valueMap;
valueMap.push_back(TPair(depends[0], 1));
 
for (int i = 1; i < depends.size(); ++i) {
if (depends[i] == depends[i - 1])
 ++valueMap.back().second;
else
 valueMap.push_back(TPair(depends[i], 1));
}
 


Название: 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
Чтобы в гцц и шланге врубить максимальные ворнинги:
Код:
QMAKE_CXXFLAGS += -Wall -Wextra -pedantic
thx


Название: 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
QMAKE_CXXFLAGS -= -mthreads
Ругается теперь на незнание -mthreads все равно.
Насчёт 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
Или CXXFLAGS, вроде, правильнее
В общем мне удалось как-то соединить 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()
{
int a;
public:
Class()
{
};
void setA(int).....


Название: 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
Спасибо