Название: Повышение точности valgrind memcheck ? Отправлено: navrocky от Апрель 27, 2012, 17:07 Столкнулся с проблемой, что valgrind (из под qtcreator) показывает стеки на утечках не полные, т.е. не хватает одного или нескольких вызовов в вершине стека:
Код: 472 (52 direct, 420 indirect) bytes in 1 blocks are definitely lost in loss record 956 of 1,090 Такое ощущение, что между пунктом 1. и пунктом 2. пропущен один вызов или несколько, т.к. при переходе на строку №2. такой код: Код
То есть, очевидно течет где-то в недрах repgen.load(). Причем я уже нашел достаточно много таких утечек и они реально были, просто valgrind не показывал полностью стек, приходилось долго просматривать код вокруг. Компилируется проект с такими вот флагами: Код: /usr/bin/c++ -DDEBUG -DQT_GUI_LIB -DQT_XML_LIB -DQT_CORE_LIB -DQT_DEBUG -fno-elide-constructors -fno-implement-inlines -fno-implicit-inline-templates -fno-default-inline -fno-inline -Wall -Woverloaded-virtual -fexceptions -fnon-call-exceptions -g Как можно улучшить вывод valgrind? Какие еще ключи можно добавить компилятору? Название: Re: Повышение точности valgrind memcheck ? Отправлено: navrocky от Апрель 28, 2012, 10:08 бамп
Название: Re: Повышение точности valgrind memcheck ? Отправлено: GreatSnake от Апрель 28, 2012, 11:02 Какие еще ключи можно добавить компилятору? Чего-то не видно -O0.Название: Re: Повышение точности valgrind memcheck ? Отправлено: navrocky от Апрель 28, 2012, 12:14 Помогло! Благодарствую. Я что-то думал, что наличие -g подразумевает отключение оптимизации по умолчанию (
Название: Re: [РЕШЕНО] Повышение точности valgrind memcheck ? Отправлено: b-s-a от Май 01, 2012, 10:16 -g добавляет отладочные символы в код программы. К оптимизиции это вообще отношения не имеет.
А потом, как бы можно было отлаживать программу, которая без оптимизации работает, а с оптимизацией нет? Название: Re: [РЕШЕНО] Повышение точности valgrind memcheck ? Отправлено: GreatSnake от Май 01, 2012, 10:53 -g добавляет отладочные символы в код программы. К оптимизиции это вообще отношения не имеет. И каков, интересно, опыт отладки с -O3?А потом, как бы можно было отлаживать программу, которая без оптимизации работает, а с оптимизацией нет? И как успешно ставятся breakpoints в inline методах? Название: Re: [РЕШЕНО] Повышение точности valgrind memcheck ? Отправлено: navrocky от Май 03, 2012, 18:37 Отладчик при O3 забавно скачет по команде step ). Видимо отлаживаться с оптимизацией можно только дизассемблере.
Название: Re: [РЕШЕНО] Повышение точности valgrind memcheck ? Отправлено: b-s-a от Май 04, 2012, 10:53 И каков, интересно, опыт отладки с -O3? Хреновый я тебе скажу. Благо, у меня еще не было багов из-за оптимизации. Поэтому мне достаточно неоптимизированной.И как успешно ставятся breakpoints в inline методах? Название: Re: [РЕШЕНО] Повышение точности valgrind memcheck ? Отправлено: navrocky от Октябрь 23, 2012, 19:38 Вопрос остается открытый. Первую запись в стеке valgrind упорно не показывает. Что делать?
Вот такой код: Код
Вот так компилится: Код: g++ -g -O0 main.cpp -o test_valgrind Вот так запускаю valgrind: Код: valgrind --leak-check=full ./test_valgrind Результат: Код: ==7157== Memcheck, a memory error detector Вот сама суть результата: Код: ==7157== 1,000 bytes in 1 blocks are definitely lost in loss record 1 of 1 Здесь видно, что в стеке пропущен вызов func(). Соответственно такой эффект я наблюдаю везде и очень тяжко искать утечки. Код: vlad@vlad:~/tmp/test_valgrind> valgrind --version Кому несложно проверьте у себя этот пример, может существуют версии valgrind которые нормально отображают стеки? UPD. Установил последнюю версию 3.8.1 - та же петрушка. Название: Re: Повышение точности valgrind memcheck ? Отправлено: b-s-a от Октябрь 24, 2012, 10:41 Подозреваю, что дело не в valgrind, а в gcc. Который заинлайнил твою функцию. Попробуй указать ключ компиляции -g3 или -ggdb вместо -g. Если не поможет, то ищи опции gcc, принудительно отключающие встраивание.
Название: Re: Повышение точности valgrind memcheck ? Отправлено: navrocky от Октябрь 24, 2012, 17:40 Оптимизацию я выключил, в дизассемблер смотрел, функция есть, стек–фреймы создаются.
main(): Код: 7 { func(): Код: 2 { |