LINUX.ORG.RU

Чем сделать автоматическую трассировку

 , ,


4

3

Добрый день, ЛОР.

Судя по всему, я хочу какой-то гибрид из gdb, ltrace (и, возможно, valgrind).

gdb позволяет смотреть трассировку программы при попадании на точку останова.

ltrace выводит все вызовы библиотечных функций (но только библиотечных).

А можно ли каким-то инструментом (например, тем же gdb, но ни в мане, ни в «инструкциях от Васянов» я ничего похожего не нашёл) запустить свою программу и получить полный лог её хождения по собственным функциям от начала до конца? Без брекпойнтов, чтобы программа могла работать в условиях, максимально приближенных к боевым? Понятно, можно нашпиговать каждую функцию отладочным выводом на std::cout, но может, можно это как-то автоматизировать?

★★★★★

backtrace() returns a backtrace for the calling program

Given the set of addresses returned by backtrace() in buffer, backtrace_symbols() translates the addresses into an array of strings that describe the addresses symbolically.

SR_team ★★★★★
()
Ответ на: комментарий от sparks

собирать свою прогу надо с -pg

Круто. Не знал о такой фитче. Надо будет попробовать.

anonymous
()

Тебе нужен профилировщик. Он строит «лог хождения по функциям». Как правило этот лог впоследствии конвертируется в агрегированное представление типа «сколько ВСЕГО тиков программа провела в каждой из функций» и затем может быть конвертирован в графическое представление. Тебе нужен результат первого шага. Я такое где-то видел, толи в oprofile, толи gprof, толи макосьный профайлер…

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

автор просил трассировку, а не профилировку

Да какая разница, что там ТС просил?! Он «тему» задал, больше от него на ЛОРе ничего не зависит.

anonymous
()

uftrace

The uftrace tool is to trace and analyze execution of a program written in C/C++. It was heavily inspired by the ftrace framework of the Linux kernel (especially function graph tracer) and supports userspace programs. It supports various kind of commands and filters to help analysis of the program execution and performance.

xaizek ★★★★★
()
Ответ на: комментарий от seiken

Просто -pg включает инструментирование функций. Можно -finstrument-functions вместо него (см. uftrace выше).

xaizek ★★★★★
()
Ответ на: комментарий от seiken

Не всё ли равно, если на выходе получаешь граф всех вызовов?

А можно ли каким-то инструментом (например, тем же gdb, но ни в мане, ни в «инструкциях от Васянов» я ничего похожего не нашёл) запустить свою программу и получить полный лог её хождения по собственным функциям от начала до конца?

sparks ★★★
()

полный лог её хождения по собственным функциям от начала до конца

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

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

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

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

Да какая разница, что там ТС просил?! Он «тему» задал, больше от него на ЛОРе ничего не зависит.

В квотезы!

hobbit ★★★★★
() автор топика

uftrace посмотри, может подойдёт

annulen ★★★★★
()
Ответ на: комментарий от hobbit

Ну так это, как водится. На пятой странице будут выяснять, что лучше: maya, max или блендер. ТС же спрашивал про трейсер какой-то там, кажется.

anonymous
()
valgrind --tool=callgrind

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

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

Ну так это, как водится. На пятой странице будут выяснять, что лучше: maya, max или блендер. ТС же спрашивал про трейсер какой-то там, кажется.

Кстати, как вам трассировка в новых rtx 30-ой серии?

Crocodoom ★★★★★
()

Ну и если скорость не критична, то самое простое - gdb заскриптовать как-то так (в гугле много примеров):

break puts
commands 1
backtrace
continue
end

snizovtsev ★★★★★
()
Последнее исправление: snizovtsev (всего исправлений: 1)
Ответ на: комментарий от pon4ik

systemtap и bpftrace я бы туда еще добавил. lttng, кстати, меньше всего вызвала проблем при первом использовании, но пользовался я ей мало. systemtap довольно старый проект со всеми плюсами (хорошей поддержкой сторонними проектами, тем же gdb) и минусами - не все в нем удобно. я бы копал в сторону bpftrace.

yetanother ★★
()
Ответ на: комментарий от sparks

Собираю с -pg, размер файла возрастает, но при запуске большого проекта gmon.out не создаётся.

У меня gcc, не clang. Тестовый хеллоуворлд при этом исправно создаёт gmon.out.

Затейливо.

hobbit ★★★★★
() автор топика
Ответ на: комментарий от sparks

Джентльменский SIGTERM за свои силы не засчитывается? Окей, копну в этом направлении, похоже на правду.

hobbit ★★★★★
() автор топика
Ответ на: комментарий от hobbit

угу, я не пробовал но по идее если ты повесишь обработчик на SIGTERM и там вызовешь exit(0); то всё должно быть окей, сам я не вникал особо, но судя по поведению он чтото при нормальном завершении финализирует и пишет в этот out

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

Не помогает. Добавил в программу завершение цикла событий по таймеру, непосредственно перед return(0) в main() сделал отладочный вывод, показывающий, что управление до return(0) доходит. Но файл не создаётся.

Могут быть ещё какие-то причины? Несовместимость с другими ключами компилятора, например? Хотя у меня там, кроме мордобитиев -Wall и -O2, никаких чудес…

hobbit ★★★★★
() автор топика
Ответ на: комментарий от sparks

Разобрался.

Тестовый хеллоуворлд я компилировал непосредственно из gcc, а реальный проект собирался из мейкфайла, где компиляция отделена от компоновки. Так вот, -pg, видимо, надо скармливать именно линкеру, а в первой попытке (как оказалось) он передавался только компилятору.

Теперь всё работает, лог создаётся.

Всем спасибо за ответы, в том числе и предложения других инструментов. Но gprof хорош тем, что он максимально «штатный», вероятность, что он есть в базовом репозитории произвольного дистрибутива, близка к 100%. Ну и собственно профилировка в перспективе может потребоваться…

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.