C++ 应用程序探针管理器
“C++ 探针管理器”支持使用与 C 探针管理器相同的方法调查 C++ 应用程序。 支持任何 C++ 函数上的“uft”式入口/出口调查,包含核心可执行文件中的成员、过载、运算符和模版函数。 C++ 中的函数入口/出口调查必须使用 @@uftxlc++ 探针管理器。
@@uftxlc++ 式调查规范中所有元组的用法和格式都与 @@uft 式调查字符串相同,函数名称除外。 因为 C++ 允许过载单个函数名称,所以调查字符串中指定的函数名称可能必须包含函数的参数类型,以唯一标识调查的函数。
例如:
@@uftxlc++:12345:*:"foobar(int, char *)":entry
@@uftxlc++:/usr/test:*:"foobar(int, char *)":entry
注: 上述探针字符串中缺少返回类型,因为它未参与常规函数的名称修饰算法。 如果是模版函数,那么用户必须指定要调查的显式模版实例化,还必须指定模版实例化的返回类型:
@@uftxlc++:12345:*:void foobar<int>(int, char *):entry
注: 探针字符串必须使用引号将上述两个示例中指定的函数名括起,如果缺少引号,那么 probevue 命令将发出错误信号。 使用引号不只因为冒号“:”,还因为逗号“,”。逗号运算符用来分隔同一行上的多个调查,没有引号的调查较优先。 这导致对用户显示非常强大的错误消息。
当调查类成员函数或名称空间中定义的函数时,调查字符串中必须使用完整的函数名。 要避免调查字符串中单冒号 (:) 元组分隔符和完整 C++ 名称中双冒号 (::) 作用域解析运算符之间任何的模糊性,调查字符串中整个函数名称元组都必须加上引号。
@@uftxlc++:12345:*:"Foo::bar(int)":entry
限制:
- 不支持访问从虚拟基类继承的数据字段。
- 模板类不受支持并且不得包括在 C++ 头中。
- 至成员的指针不受支持。
- 要探测带有类定义的类,类的对象已在头文件中作为全局对象或者以哑元函数形式进行实例化。
例如:
以下是 c++ 应用程序
#include "header.cc"
main()
{
int i = 10;
incr_num(i);
float a = 3.14;
incr_num(a);
char ch = 'A';
incr_num(ch);
double d = 1.11;
incr_num(d);
}
“header.cc”的内容
# cat header.cc
#include <iostream.h>
template <class T>
T incr_num( T a)
{
return (++a);
}
int dummy()
{
int i=10,j=20;
incr_num(i);
float a=3.14;
incr_num(a);
char ch ='A',dh='Z';
incr_num(ch);
double d=1.1,e=1.11;
incr_num(d);
return 0;
}
Vue 脚本 vue_cpp.e 的内容
##C++
#include "header.cc"
##Vue
@@uftxlc++:$__CPID:*:"incr_num<int>(int)":entry
{
printf("Hello1_%d\n",__arg1 );
}
@@uftxlc++:$__CPID:*:"incr_num < float > (float)" :entry
{
printf("Hello2_%f\n",__arg1 );
}
@@uftxlc++:$__CPID:*:"incr_num < char > ( char )":entry
{
printf("Hello3_%c\n",__arg1 );
}
@@uftxlc++:$__CPID:*:"incr_num < double > ( double )":entry
{
printf("Hello4_%lf\n",__arg1 );
exit();
}
执行:
/usr/vacpp/bin/xlC app.c++
# probevue -X ./a.out vue_cpp.e
Hello1_10
Hello2_3.140000
Hello3_A
Hello4_1.110000
第四个元组中的函数原型可以指定为扩展的正则表达式 (ERE)。 ERE 应该包含在 ‘”/’ 和 ‘/”’ 之间,例如 "/<ERE>/"。 当函数原型指定为 ERE 时,将探测与指定模块中的指定正则表达式匹配的所有函数。
/* Probe entry of all the C++ functions in the executable a.out */
@@uftxlc++:$__CPID:a.out:”/.*/”:entry
/* Probe exit of all the C++ functions with ‘foo’ word in it */
@@uftxlc++:$__CPID:*:”/foo/”:exit
在函数名指定为正则表达式的入口调查中,无法访问个别参数。 但是,probevue 函数 print_args() 可以用于显示函数名及其参数。 将根据函数的可跟踪表中可用的参数类型信息来显示参数值。
在函数名指定为正则表达式的出口调查中,无法访问返回值。