Невозможно добавить зонд perf для методов C ++

Я пытаюсь добавить perf probe для метода C ++ в свою библиотеку, но получаю следующее:

$ perf probe --exec=/path/to/file --add='my::Own::Method'
Semantic error :There is non-digit char in line number.

Вот список доступных функций:

$ perf probe --funcs --exec=/path/to/file

И попробовал некоторые функции C, которые также включены. Для них можно добавить зонд. Итак, я попробовал искалеченное имя (например, _ZN2my8Own16Method), а perf probe говорит, что его не существует.

Есть ли способ обойти эту проблему?


person Trevor Norris    schedule 24.11.2013    source источник


Ответы (2)


В качестве обходного пути вы можете получить адрес метода с помощью objdump, и perf probe его примет.

  $ perf probe -x /path/file '0x643f30'
Added new event:
  probe_libfile:abs_643f30 (on 0x643f30 in /path/file)

You can now use it in all perf tools, such as:

    perf record -e probe_libfile:abs_643f30 -aR sleep 1

Обратите внимание, что perf probe ожидает смещения от файла, а objdump и readelf возвращают адрес после корректировки адреса загрузки. Для -pie исполняемого файла, где адрес загрузки равен 0, адреса будут такими же.
Для исполняемых файлов, отличных от -pie, вы можете получить адрес загрузки, посмотрев на вывод readelf -l /path/file и выполнив поиск смещения 0x000000 и посмотрев, что VirtAddr он указывает на, а затем вычтите это число из адреса символа, полученного от objdump --syms или readelf --syms. Обычно это 0x400000

person ceeaspb    schedule 16.12.2016
comment
objdump ./<executable> --syms | grep -i <method> работал у меня. Первый столбец вывода - это адрес, который нужно передать perf probe. Но к адресу необходимо добавить 0x, иначе команда perf завершится ошибкой. - person Marc Sherman; 13.12.2018

Вы можете запустить это, чтобы увидеть все имена функций в их искаженной форме C ++:

perf probe --exec=/path/to/file --funcs --no-demangle --filter='*'

Найдите тот, который вам нужен (фактическое имя функции будет среди искаженных токенов), и добавьте его с опцией --no-demangle.

person John Zwinck    schedule 01.12.2020