LINUX.ORG.RU

C++ --- шаблоны и отладка


0

0

Си++ не знаю, но по работе пришлось столкнуться с отладкой и профилированием программы, которая посторена на большой бибилиотеке шаблонов (больше 20 тысяч строк). На самом нижнем уровне вызываются функции из некоторых бибилиотек на чистом Си.

Вопрос: профилировщик выводит информацию о функциях как имя_функции(список аргументов). Разгрести, что же в итоге вызывается на самом нижнем уровне, в данный момент сложно.

Типичная информация о функции выглядит, например, так:

---

gmm::mult_by_row<gmm::row_matrix<gmm::rsvector<double> >, std::vector<double,std::allocator<double> >, std::vector<double, std::allocator<double> >> (gmm::row_matrix<gmm::rsvector<double> > const&, std::vector<double,std::allocator<double> > const&, std::vector<double, std::allocator<double>>&, gmm::abstract_dense)

---

Внизу же вызывается какялибо функция из Lapack или BLAS.

Как узнать, какая именно?

Например, есть функция mult(x,y), где x может быть вектором какого-либо сорта, вектором-строкой, вектором столбцом, заполненной матрицей, разреженной матрицей в одном формате, разреженной матрицей в другом формате и так далее. То же самое с у.

"Внизу" вызываются уже функции, специфичные для конкретных аргументов, из той или иной библиотеки. "Уровень вложенности" шаблонов для этого умножения большой.

Как проще всего узнать, что именно вызвалось на самом нижнем уровне и для каких аргументов?

Заранее спасибо.


Проще всего наверное прочитать в книжке по C++ про шаблоны и смотреть исходный код.

anonymous
()
Ответ на: комментарий от anonymous

Да, надо посмотреть специализации шаблонов для конкретных типов аргументов (вектор, матрица и т.д.). Соответственно в них и будут сидеть нужные вызовы.

Можно запустить прогу (слинкованную с debug-версией lapack) под valgrind --tool=callgrind и посмотреть на callgraph.

А можно вообще пойти с конца. Найти все места в библиотеке, в которых вызываются функции lapack, и уже от них смотреть "вверх".

yz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.