отслеживание функций systemtap в пользовательском пространстве

У меня есть простая программа на C++

main.cpp

#include <iostream>
using namespace std;

int addition (int a, int b)
{
  int r;
  r=a+b;
  return r;
}

int main ()
{
  int z;
  z = addition (5,3);
  cout << "The result is " << z;
}

Я хочу сгенерировать трассировку функции для этого - напечатать имена функций и их типы ввода-вывода и возврата.

Мой сценарий systemtap: para-callgraph.stp

#! /usr/bin/env stap

function trace(entry_p, extra) {
  %( $# > 1 %? if (tid() in trace) %)
  printf("%s%s%s %s\n",
         thread_indent (entry_p),
         (entry_p>0?"->":"<-"),
         probefunc (),
         extra)
}


probe $1.call   { trace(1, $$parms)  }
probe $1.return { trace(-1, $$return) }

Мой C++ Exec называется: a (скомпилирован как g++ -g main.cpp)

Command I run 
stap para-callgraph.stp 'process("a").function("*")' -c "./a > /dev/null"

 0 a(15119):->_GLOBAL__I__Z8additionii 
    27 a(15119): ->__static_initialization_and_destruction_0 __initialize_p=0x0 __priority=0x0
   168 a(15119): <-__static_initialization_and_destruction_0 
   174 a(15119):<-_GLOBAL__I__Z8additionii 
     0 a(15119):->main 
    18 a(15119): ->addition a=0x0 b=0x400895
    30 a(15119): <-addition return=0x8
   106 a(15119):<-main return=0x0

Здесь -> дополнение a=0x0 b=0x400895 : его адрес, а не фактические значения, т.е. 5, 3, которые я хочу.

How to modify my stap script?

person Step    schedule 12.11.2015    source источник
comment
Какие версии G++/SystemTap вы используете? Ваш код отлично работает для меня. Обратите внимание, что SystemTap использует информацию DWARF, предоставленную GCC, для отображения переменных, а версии GCC ›5.0 переключили DWARF на версию 4.   -  person myaut    schedule 15.11.2015
comment
Не могли бы вы дать мне ссылку на DWARF для Centos 7 (3.10.0-229.14.1.el7.x86_64) переводчик/драйвер Systemtap (версия 2.6/0.160, rpm 2.6-10.el7_1) gcc (GCC) 4.8.3 20140911 ( Красная шляпа 4.8.3-9)   -  person Step    schedule 16.11.2015


Ответы (1)


Похоже, это системная ошибка. Он должен вывести значение b, а не его адрес. Пожалуйста, сообщите об этом в список рассылки [email protected] (с версиями компилятора/и т. д. и другой информацией, как указано в man error::reporting.

Что касается изменения сценария, то в части $$parms локальные переменные преобразуются в красиво напечатанную строку. Его можно изменить на что-то вроде...

trace(1, $$parms . (@defined($foobar) ? (" foobar=".$foobar$) : ""))

чтобы добавить foobar=XYZ к записи трассировки, где бы ни был доступен параметр foobar. Чтобы обойти рассматриваемую ошибку systemtap, вы можете попробовать

trace(1, $$parms . (@defined($b) ? (" *b=".user_int($b)) : ""))

чтобы разыменовать переменную b, как если бы она была int *.

person fche    schedule 16.11.2015