Шаблоны функций оставляют линии отладкиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Шаблоны функций оставляют линии отладки

Сообщение Anonymous »

Я работаю в кодовой базе, которая широко использует шаблоны. Это вызывает много проблем с отладкой, потому что компилятор практически не оставляет отладки информации, чтобы связать объектный код обратно к исходным строкам кода. Например, я не могу пройти через следующую (MRE) функцию по одной строке за раз, если я выберу любой уровень оптимизации, кроме -O0 :

Код: Выделить всё

#include 
#include 
#include 

#ifdef NO_TEMPLATE
using T = int;
#else
template 
#endif
__attribute__((noinline))
int func(T n) {
int count = 0;
while(n != 1) {
if (n % 2 == 0)
n = n / 2;
else
n = 3*n + 1;
count++;
}
return count;
}

int main() {
srand(time(0));
int x = rand() % 10000;
int iters = func(x);
printf("func(%d) => %d iters\n", x, iters);
}
Если я превращаю функцию в неэлементную версию, которая принимает int, то я могу пройти через цикл в отладчике, даже с -O2 .
Наиболее запутанная вещь в этом для меня-это то, что с атрибутом noinline , созданные объект-код, идентичные для меня. https://godbolt.org/z/jyc67Vef7образной[code]$ g++ -g3 -O1 mre.cc -DNO_TEMPLATE && gdb a.out -n -batch -ex 'tb func' -ex r -ex n -ex n -ex n
Temporary breakpoint 1, func (n=n@entry=4522) at mre.cc:13
13 while(n != 1) {
14 if (n % 2 == 0)
15 n = n / 2;
18 count++;
< /code>
Но шаблонная версия выходит сразу после разрыва функции: < /p>
$ g++ -g3 -O1 mre.cc && gdb a.out -n -batch -ex 'tb func' -ex r -ex n -ex n -ex n
Temporary breakpoint 1, func (n=n@entry=7368) at mre.cc:13
13 while(n != 1) {
main () at mre.cc:27
27 printf("func(%d) => %d iters\n", x, iters);
func(7368) => 132 iters
[Inferior 1 (process 2183425) exited normally]
< /code>
Почему шаблонная версия, кажется, дает практически нет информации о линии по линии? Есть ли доступны какие -либо варианты, кроме компиляции с -O0 [/code], чтобы иметь возможность отлаживать шаблон функции?

Подробнее здесь: https://stackoverflow.com/questions/797 ... ebug-lines
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»