GCC Оптимизация и отладка - PullRequest
       45

GCC Оптимизация и отладка

0 голосов
/ 26 сентября 2018

Я не совсем понимаю следующее:

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

Я понимаю, что когда я строю программу с параметром -g, то исполняемый файл будет содержать символьную таблицу который содержит переменные, имена функций, ссылки на них и их номера строк.И когда я строю с опцией оптимизации, например, порядок инструкций может быть изменен, зависит от оптимизации.

Что я не понимаю, так это то, почему отладка сложнее.Я хотел бы увидеть пример и понятное объяснение.

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Пример, который может произойти:

int calc(int a, int b)
{
    return a << b + 7;
}

int main()
{
    int x = 5;
    int y = 7;
    int val = calc(x, y);
    return val;
}

Оптимизировано это может быть то же самое, что

int main()
{
    return 642;
}

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

0 голосов
/ 26 сентября 2018

простой пример:

int a = 4;
int b = a;
int c = b;
printf("%d", c);

можно оптимизировать как:

printf("%d", 4);

На самом деле в оптимизированных компиляторах компилятор вполне может сделать именно это (конечно, в машинном коде)

При отладке мы отладчик позволяет нам проверять память, связанную с a, b и c, но когда верхняя версия оптимизируется в нижнюю версию a, b и c, больше не существует в оперативной памяти.Это делает проверку оперативной памяти намного сложнее, чтобы выяснить, что происходит.

0 голосов
/ 26 сентября 2018

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

Как вы указаликод будет переупорядочен, и некоторые вызовы будут выполняться по-другому.Также другой оптимизацией могут быть развертывание цикла, предсказание перехода и упрощение вызовов функций.Эти оптимизации также будут различаться в зависимости от архитектуры, на которой вы работаете.

По всем этим (и другим) причинам ваш код может стать очень сложным для отладки, поскольку для вас совершенно очевидно, что именно делает компилятор, что означаетчто код, который вы хотите отлаживать, может отличаться от того, который вы написали.

...