Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
1

Наличие оптимизации кода - причина непредсказуемого поведения отладчика?

19.05.2016, 21:11. Показов 5517. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Отладчик Qt Creator-а иногда перепрыгивает через строки, его поведение совершенно не поддается логике. Слышал, что для этого в qt нужно отключить оптимизацию кода. Вопрос, как это сделать? спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2016, 21:11
Ответы с готовыми решениями:

Изменение поведения кода после применения скрптов
Столкнулся с неприятной ситуацией. Вот я сделал резиновую верстку, все отлично, прекрасно. В медиа...

В чем причина некорректной работы кода?
не закончив цикл в главной функции - строка 92, программа завершается без ошибок, цикл не проходит...

Указания по оптимизации кода
Что скажете? Не будет сильно грузить? 24 экземпляра этого скрипта находятся в сцене. Критика...

Советы по оптимизации кода
Написал парсер данных. Подскажите как можно было сделать проще? Стрелка должна быть в отдельной...

16
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
19.05.2016, 22:32 2
Цитата Сообщение от ctakah3112 Посмотреть сообщение
Отладчик Qt Creator-а иногда перепрыгивает через строки, его поведение совершенно не поддается логике. Слышал, что для этого в qt нужно отключить оптимизацию кода. Вопрос, как это сделать? спасибо
Вы уверены, что в оптимизациях дело? По умолчанию оптимизации в дебаге обычно везде отключены. А так - смотрите в .pro или в сmake файле.
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
20.05.2016, 07:03 3
ctakah3112, прежде всего, отлаживайте в отладке.

Добавлено через 16 секунд
Сборка Debug
0
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
20.05.2016, 10:02  [ТС] 4
1. А вы не могли бы конкретно сказать, что надо прописать в pro-файле? И каком именно месте?
2. Я итак работаю в сборке debug
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
20.05.2016, 10:27 5
Цитата Сообщение от ctakah3112 Посмотреть сообщение
1. А вы не могли бы конкретно сказать, что надо прописать в pro-файле? И каком именно месте?
2. Я итак работаю в сборке debug
Приведите кусок кода и покажите в нём строки, через которые перепрыгивает отладчик.
0
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
20.05.2016, 21:13  [ТС] 6
Цитата Сообщение от Wyn Посмотреть сообщение
Приведите кусок кода и покажите в нём строки, через которые перепрыгивает отладчик
Не думаю, что это поможет, но привожу ("перепрыгивание" происходит со строки 58, сразу на строку 75):
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
void ReadingClass::Read(QString path)
{
    QFile file(path);
    file.open(QIODevice::ReadOnly);
 
    int com_type_int(0);
    while (!file.atEnd())
    {
        char buf[512];
        file.readLine(buf, sizeof(buf));
        QString line = QString(buf);
 
        int ind = line.indexOf("//");
        if (ind!=0)//if line contains some code besides comments
        {
            if (line.contains('{'))
            {
                num_of_current_frame++;
                continue;
            }
            InterpretClass::Analize_Word(line, &com_type_int);
 
            if (com_type_int == (int)ReadReg)  //reading
            {
                char buf_adr[128];
                file.readLine(buf_adr, sizeof(buf_adr));
                QString line_adr = QString(buf_adr);
 
                //---cuting off comments-------------
                if (line_adr.indexOf("//") !=-1)
                    line_adr.chop(line_adr.size() - line_adr.indexOf("//"));
                else
                    line_adr.chop(2);//deleting garbage like /n/r at the end
                //-----------------------------------
 
                bool ok_adr=false;
                line_adr.toInt(&ok_adr, 16);
                if (!ok_adr)
                {
                    qDebug()<<"Error in Read-reg address!";
                    continue;
                }
            }
            else if (com_type_int==(int)Title)
            {
                char buf_text[1024];
                QString line_title;
                do
                {
                    file.readLine(buf_text, sizeof(buf_text));
                    //cut off comments:
                    QString current = QString(buf_text);
                    if (current.indexOf("//")!=-1)
                        current.chop(current.size() - current.indexOf("//"));
                    line_title += current;
                }
                while (line_title.lastIndexOf("$")<1);
                qDebug()<<line_title.replace("$", "");//СРАЗУ ПОСЛЕ ЭТОЙ СТРОКИ ОТЛАДЧИК ПРЫГАЕТ...
            }
 
            else if (com_type_int==(int)Description)
            {
                char buf_text[1024];
                QString line_descr;
                do
                {
                    file.readLine(buf_text, sizeof(buf_text));
                    //cut off comments:
                    QString current = QString(buf_text);
                    if (current.indexOf("//")!=-1)
                        current.chop(current.size() - current.indexOf("//"));
                    line_descr += current;
                }
                while (line_descr.lastIndexOf("#")<1);
                qDebug()<<line_descr.replace("#", "");//ПРЯМИКОМ В ЭТУ СТРОКУ, МИНУЯ ДАЖЕ СТРОКИ 61-75
            }
        }
    }
}
Всё-таки, в каком файле и что надо прописать, чтобы отключить оптимизацию? Помогите, пж
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
20.05.2016, 21:19 7
Цитата Сообщение от ctakah3112 Посмотреть сообщение
Всё-таки, в каком файле и что надо прописать, чтобы отключить оптимизацию? Помогите, пж
В .pro файле пропишите
Код
QMAKE_CXXFLAGS -= -O1 -O2 -O3 -Os
QMAKE_CXXFLAGS += -O0
1
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
21.05.2016, 16:19  [ТС] 8
Цитата Сообщение от Wyn Посмотреть сообщение
В .pro файле пропишите...
Спасибо за конкретный ответ, но почему-то не помогло. Отладчик продолжает перескакивать.
Бросается в глаза то, что в моем .pro-файле слово QMAKE_CXXFLAGS не выделилось как ключевое, то есть просто выглядит как какой-то левый текст...
Миниатюры
Наличие оптимизации кода - причина непредсказуемого поведения отладчика?  
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
21.05.2016, 16:28 9
Цитата Сообщение от ctakah3112 Посмотреть сообщение
Спасибо за конкретный ответ, но почему-то не помогло. Отладчик продолжает перескакивать.
Бросается в глаза то, что в моем .pro-файле слово QMAKE_CXXFLAGS не выделилось как ключевое, то есть просто выглядит как какой-то левый текст...
Это иногда бывает, подсветка начинает тупить.
Могу посоветовать только удалить полностью папку сборки и пересобрать проект. Если и это не поможет - тогда не знаю.
0
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
21.05.2016, 16:55  [ТС] 10
Цитата Сообщение от Wyn Посмотреть сообщение
Это иногда бывает, подсветка начинает тупить
Плюс к этому, IntelliSense (или как там в Qt называется автодополнение...) даже не видит слово QMAKE_CXXFLAGS как ключевое. Такое чувство, что чего-то не хватает, опции что ли какой-то...
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
21.05.2016, 17:04 11
Цитата Сообщение от ctakah3112 Посмотреть сообщение
Плюс к этому, IntelliSense (или как там в Qt называется автодополнение...) даже не видит слово QMAKE_CXXFLAGS как ключевое. Такое чувство, что чего-то не хватает, опции что ли какой-то...
Обновите Qt Creator до 4ой версии.
0
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
21.05.2016, 17:23  [ТС] 12
Цитата Сообщение от Wyn Посмотреть сообщение
Обновите Qt Creator до 4ой версии
Хотите сказать, что в Qt Creator - е ниже четвертой версии невозможно выключить оптимизацию кода?
0
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
21.05.2016, 17:49 13
Цитата Сообщение от ctakah3112 Посмотреть сообщение
Хотите сказать, что в Qt Creator - е ниже четвертой версии невозможно выключить оптимизацию кода?
Нет, но в Qt Creator 4 как минимум данное выражение подсвечивается. =)
Также в Qt Creator 4 включен статический анализатор Clang, что вам может здорово помочь, ибо ругается он на каждый чих и пых и скорее всего найдёт место где вы накосячили.

Да что вы носитесь с этой оптимизацией кода? Какие ваши доказательства, что всему виной именно оптимизация кода? Только не из серии "я так воображаюдумаю". К примеру во время сборки на вкладке "консоль сборки" высвечиваются все команды, с помощью которых и собирается ваш проект. Вы там флаги оптимизации видите?
Видимое вами поведение может также возникать из-за undefined behaviour, когда нарушается структура кода.
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
22.05.2016, 06:39 14
Цитата Сообщение от ctakah3112 Посмотреть сообщение
но привожу ("перепрыгивание" происходит со строки 58, сразу на строку 75):
А куда нужно было?
0
715 / 675 / 110
Регистрация: 29.05.2015
Сообщений: 4,063
22.05.2016, 07:41 15
Если перескакивает с одного дебига сразу на второй - может в них глюк? Закомментируйте эти строки и попробуйте без них, инфу можно выдать на экран с помощью QMessageBox, которая ещё и программу остановит до нажатия кнопки - увидите, что сюда дошла программа, и будет время подумать.
0
1 / 1 / 0
Регистрация: 26.10.2014
Сообщений: 74
22.05.2016, 17:17  [ТС] 16
Цитата Сообщение от icpu Посмотреть сообщение
А куда нужно было?
Ну явно же не туда. Нужно в строку 9, к новой итерации.
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
23.05.2016, 06:45 17
Цитата Сообщение от ctakah3112 Посмотреть сообщение
qDebug()<<line_descr.replace("#", "");//ПРЯМИКОМ В ЭТУ СТРОКУ, МИНУЯ ДАЖЕ СТРОКИ 61-75
Хотите сказать, сразу эта строчка выполняется? На моём опыте такое бывает только когда портишь стек, и то вероятность этого события крайне мала. В таком виде - точно. Хотя исключать такое нельзя, потому попробуйте массивы чаров заменить на QByteArray, тем более, что правильное построение логики позволит даже сэкономить на копировании даных.
Зато что я знаю точно, отладчик должен прыгать на закрывающую строчку, а креатор, особенно если его не обновлять (или обновлять слишком часто) умеет промахиваться. Если проблемы чисто косметические, сругнитесь и проигнорируйте.
0
23.05.2016, 06:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2016, 06:45
Помогаю со студенческими работами здесь

Методы оптимизации кода
Написал статью по оптимизации кода на С++. Ее можно почитать тут: А вы какие еще способы...

Нужен совет в оптимизации кода
Нужно оптимизировать метод Deallocate, который переводит нужный указатель из allotted в exempted,...

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru