Перегруженное профилирование методов C++ с использованием SystemTap
Как я могу отличить перегруженные методы, используя пробники SystemTap?
Например
class A {
// ...
void doFoo();
void doFoo(int a);
// ...
};
В файле.stp:
probe process("foobar").function("A::doFoo<NO ARGS>").return {
// do something
}
probe process("foobar").function("A::doFoo<USING INT>").return {
// do something different
}
Учтите, что оба метода могут иметь несколько точек возврата, поэтому не стоит использовать .statement(@file:line)
,
1 ответ
Начиная с этапа 1.4, он должен работать для проверки искаженных имен, по крайней мере, если debuginfo их описал. Я создал тестовую программу на вашем примере, и "_ZN1A5doFooEv" и "_ZN1A5doFooEi" работали для случаев void и int соответственно. Хотя от компилятора зависит правильное имя MIPS_linkage_name. Иногда он может работать и из таблицы символов, но это не обязательно охватывает все оптимизированные версии функции, которые мог создать компилятор.
Чтобы увидеть все обнаруженные искаженные имена, попробуйте stap -l 'process("foobar").function("_Z*")'
, _Z необходим в шаблоне для запуска обработки искаженных имен.
Если stap находит точки проверки, но, похоже, они не срабатывают, как вы ожидаете, возможно, компилятор испускает несколько версий вашей функции, как встроенных, так и нет. Пытаться stap -l 'process("foobar").function("_Z*").*'
чтобы увидеть те вариации.call,.inline и.turn, которые находит скоба. Помните, что датчики.return не работают на inline, поэтому они соответствуют только экземплярам.call.
Обратите внимание, что синтаксис @file:line также работает для поиска функций, содержащих строку, поэтому вы можете использовать это также для привязки к форме function.return, а не только к пробам.statement. Вам не нужно беспокоиться обо всех точках возврата в этом случае - просто выберите любую строку в функции, которая вас интересует, и она перехватит все инструкции возврата. (Это при условии, что вы не имеете дело со строками.)