WEB开发网
开发学院操作系统Linux/Unix IBM AIX 持续可用性: 第 8 部分:Probevue 阅读

IBM AIX 持续可用性: 第 8 部分:Probevue

 2008-12-30 08:33:15 来源:WEB开发网   
核心提示:当前,在动态跟踪领域还没有标准,IBM AIX 持续可用性: 第 8 部分:Probevue,POSIX 只为静态跟踪软件定义了跟踪标准,参见 IBM Redbookspublication IBM AIX Version 6.1 Differences Guide(SG24-7559)的第一章,如果在 WPAR 上有

当前,在动态跟踪领域还没有标准。POSIX 只为静态跟踪软件定义了跟踪标准,参见 IBM Redbooks

publication IBM AIX Version 6.1 Differences Guide(SG24-7559)的第一章。因此,在制定动态跟踪标准之前,在 ProbeVue 和其他 UNIX 动态跟踪功能之间无法兼容。

动态跟踪的好处和局限性

软件调试常常被认为是在开发系统或测试系统上执行的一项专门任务,这些系统尝试模拟真实的客户生产系统。

但是,由于硬件功能和软件工程最近的发展,这种定义现在已经过时了;这些发展包括:

高端服务器的处理能力和内存能力以及相关的存储技术已经大大增强,这使大型系统可以投入生产环境。

系统集成商开发的专有解决方案(例如,基于 ERP 软件的解决方案)实现了许多中间件和几个应用程序层,这也有助于扩大生产系统的规模。

现在的软件大多是多线程的,在许多处理器上运行。因此,根据执行线程的次序不同,两次运行的表现可能不一样:多线程应用程序一般是非确定性的。对于这样的软件,错误现象更难重现和调试。

因此,在当今的 IT 基础结构中,如果不能在生产系统本身中执行故障排除,判断问题的根源就会极其昂贵和困难。

ProbeVue 动态跟踪功能提供了在生产系统上检查问题的方法。ProbeVue 可以捕捉执行数据,而不需要安装专门用于调试的应用程序版本,因此不需要重新启动应用程序或重新引导服务器,不会中断服务。

另外,ProbeVue 有助于寻找在长期运行的作业上发生的错误根源;对于这种作业,异常累积的数据、队列溢出和应用程序或内核的其他缺陷常常在运行许多天或几个月之后才会暴露出来。

只要有可用的探测管理器,ProbeVue 就能够检查任何种类的应用程序,所以这种特殊的跟踪工具能够分析复杂的缺陷,比如由于多个子系统之间相互影响产生的故障。只需使用 ProbeVue 这一种跟踪工具,就能够对生产系统进行统一的检查。

请注意下面这些与 ProbeVue 相关的因素:

跟踪可执行程序而无需修改它,这要求用一个控制执行层封装二进制代码。控制执行层会在跟踪点上中断主代码并启动检查代码,从而支持上下文跟踪。通过一个解释器执行被检查的代码,以防止代码中的错误影响应用程序或内核。解释器语言比编译的语言慢;所以,动态解释的跟踪点可能比静态编译的跟踪点慢。

系统管理员和系统集成商需要深入了解应用程序的体系结构,仅仅了解跟踪工具是不够的。如果没有正确设置跟踪点和操作,那么软件检查可能是无效的(还可能会让应用程序更慢)。另外必须记住,在开发阶段越早进行应用程序调试,就越有效,因为软件开发人员更了解应用程序体系结构的内部情况。

由于这些原因,ProbeVue 是一个补充静态跟踪方法的跟踪工具,它可以在正在运行的生产系统中添加新颖的跟踪功能。

ProbeVue 动态跟踪的好处

作为一种动态跟踪功能,ProbeVue 的主要好处如下:

跟踪钩子不需要预编译。ProbeVue 检查未经修改的内核和用户应用程序。

在动态地启用之前,跟踪点或探测并不生效(不存在)。

在启用探测时,动态地提供在探测点上执行的探测操作(由检查代码指定)。

在探测操作中捕捉的跟踪数据可以立即显示在终端输出中,也可以保存到文件中供以后查看。

可以使用 ProbeVue 进行性能分析和问题调试。ProbeVue 可以在生产系统中安全地运行,并对检查代码中的错误提供保护。

随后介绍了ProbeVue 使用的一些术语。后续小节介绍 ProbeVue 使用的编程语言 Vue 和用来启动跟踪会话的 probevue 命令。

ProbeVue 术语

ProbeVue 引入了一些与动态跟踪概念相关的术语。下面的列表描述 ProbeVue 使用的术语。

探测(probe)

探测是一种软件机制,它中断正常的系统操作,执行检查并获取关于当前上下文和系统状态的信息。这常常也称为跟踪(tracing)。

跟踪操作(tracing action)或探测操作(probe action)

这两个术语都是指探测所执行的操作。通常情况下,这些操作包括捕捉信息,即把全局信息和与上下文相关的信息的当前值写到跟踪缓冲区中。获得的信息(即捕捉到跟踪缓冲区中的信息)称为跟踪数据(trace data)。系统常常提供使用跟踪的功能;也就是,读取跟踪缓冲区中的数据并把数据提供给用户。

探测点(probe point)

探测点表示在正常系统活动期间可以探测的位置。在使用动态跟踪时,除非对探测点启用探测,否则探测点中不安装任何探测。

启用探测(enabling a probe)就是把一个探测附着到探测点上。

禁用探测(disabling a probe)就是从探测点中删除探测。

触发探测(triggering/firing a probe)是指进入探测并执行跟踪操作的条件。

ProbeVue 支持两种探测点。

探测位置(probe location)

这是用户代码或内核代码中的一个位置,在此位置上会执行某些跟踪操作(例如,捕捉跟踪数据)。如果在一个探测位置上启用了探测,那么当任何线程执行的代码到达此位置时,就会触发探测。

探测事件(probe event)

这是一个抽象事件,当发生此事件时,执行某些跟踪操作。探测事件不能简便地映射到某一代码位置。如果启用表示为探测事件的探测,那么当发生这个抽象事件时,就会触发探测。

ProbeVue 还按照探测类型区分探测点。

探测类型(probe type)

这表示一组具有相同性质的探测点;例如,在进入和退出系统调用时触发的探测,或者在更新系统统计数据时触发的探测。

按照探测类型区分探测,就为各种探测点建立了一个结构。因此,ProbeVue 需要与每个探测类型相关联的探测管理器。

探测管理器(probe manager)

这种软件代码定义具有相同探测类型的一组探测点(例如,系统调用探测管理器)。

Vue 编程语言

Vue 编程语言用来向 ProbeVue 提供跟踪规格说明。Vue 编程语言常常简称为 Vue 语言或 Vue。

Vue 脚本或 Vue 程序就是用 Vue 编写的程序。可以使用 Vue 脚本:

指定动态启用探测的探测点。

指定在触发探测时执行操作必须满足的条件(如果有的话)。

指定要执行的操作,包括要捕捉哪些跟踪数据。

把同一组操作与多个探测点关联起来。

简单地说,Vue 脚本告诉 ProbeVue 在哪里执行跟踪、什么时候执行跟踪以及要跟踪什么。

建议 Vue 脚本使用文件名后缀 .e 以区别于其他文件类型,但这不是必需的。

probevue 命令

probevue 命令用来启动动态跟踪会话(即 ProbeVue 会话)。probevue 命令以一个 Vue 脚本作为输入(从文件或命令行读取 Vue 脚本),并启动一个 ProbeVue 会话。根据命令行上传递的选项,可以把 ProbeVue 会话捕捉到的跟踪数据输出到终端,或者保存到用户指定的文件中。

ProbeVue 会话会一直处于活跃状态,直到在终端中按 <Ctrl-C> 或者在 Vue 脚本中执行退出操作。

每次调用 probevue 命令都会启动一个单独的动态跟踪会话。多个跟踪会话可以同时存在,但是每个会话只提供自己捕捉到的跟踪数据。

运行 probevue 命令是一个需要特权的操作,希望启动动态跟踪会话的非根用户需要有相应的特权。对 probevue 命令的详细描述,请参见 AIX Version 6.1 Commands Reference, Volume 4(SC23-5246)。

probevctrl 命令

probevctrl 命令修改和显示 ProbeVue 动态跟踪参数、每个处理器的跟踪缓冲区大小、使用的固定内存、拥有此会话的用户、启动此会话的进程的标识符以及此会话是否包含内核探测。

对 probevctrl 命令的详细描述,请参见 AIX Version 6.1 Commands Reference, Volume 4(SC23-5246)。

Vue 概述

Vue 既是编程语言,也是脚本语言。它不是 C 语言的扩展,也不是 C 和 awk 的简单组合。它是一种专门设计的动态跟踪语言。Vue 支持 C 和脚本语法中对动态跟踪最有用的一部分语法。

本节讨论 Vue 脚本的结构。

Vue 脚本的结构

Vue 脚本由一个或多个子句组成。可以按照任意次序指定 Vue 脚本中的子句。图 1 是 Vue 脚本的典型结构。

图 1 Vue 脚本的结构

IBM AIX 持续可用性: 第 8 部分:Probevue

下面是两个 Vue 脚本示例。

这个经典的 “Hello World” 程序向跟踪缓冲区输出 “Hello World” 并退出。#!/usr/bin/probevue
/* Hello World in probevue */
/* Program name: hello.e */
@@BEGIN
{
printf("Hello Worldn");
exit();
}

当在键盘上按 <Ctrl-C> 时,这个 “Hello World” 程序输出 “Hello World”。#!/usr/bin/probevue
/* Hello World 2 in probevue */
/* Program name: hello2.e */
@@END
{
printf("Hello Worldn");
}

Vue 脚本的每个子句由以下三个元素组成:

探测点规格说明

探测点规格说明指定要动态启用的探测点。

操作块

操作块指定在触发探测时要执行的探测操作集。

可选的断言

断言(如果有的话)指定在触发探测时要检查的条件。断言的运算结果必须为 TRUE,才会执行子句的探测操作。

下面详细描述这些元素。

探测点规格说明

探测点规格说明指定,当到达哪个代码位置或发生哪个事件时,就应该触发探测操作。多个探测点可以与同一组探测操作和断言(如果有的话)相关联,这只需在 Vue 子句的顶部提供一个用逗号分隔的探测规格说明列表。

探测规格说明的格式与探测类型相关。探测规格说明是一个由冒号分隔的有序字段元组。其一般格式如下:

@@<probetype>:<probetype field1>:...:<probetype fieldn>:<location>

AIX V6.1 支持以下探测类型:

1. 进入用户函数探测(uft 探测)

例如,下面的 uft 探测在进入 ID 为 34568 的进程中的 foo() 函数(在主可执行程序或装载的任何模块中,包括库)时触发:

@@uft:34568:*:foo:entry

2. 进入/退出系统调用探测(syscall 探测)

例如,下面的 syscall 探测在退出 read 系统调用时触发:

@@syscall:*:read:exit

3. 按照特定的时间间隔触发的探测(时间间隔探测)

例如,下面的时间间隔探测每 500 毫秒(时钟时间)触发一次:

@@interval:*:clock:500

操作块

操作块指定当一个线程到达探测点时要执行的操作集。支持的操作并不限于捕捉和格式化跟踪数据;可以使用 Vue 支持的各种操作。

Vue 中的操作块与过程式语言中的过程相似。它由依次执行的一系列语句组成。执行流基本上是顺序执行的。仅有的例外是,可以使用 if-else 语句实现有条件执行,以及使用 return 语句从操作块中返回。

但是,与过程式语言中的过程不同,Vue 中的操作块没有输出和返回值。它也不支持输入参数集。另一方面,在操作块中,可以访问触发探测的位置上的上下文数据,以此控制要执行的操作。

断言

如果在探测点上必须根据特定条件执行操作,就应该使用断言。

断言部分由探测规格说明部分后面紧接着出现的 when 关键字表示。断言本身由常规的 C 风格的条件表达式和外面的圆括号组成。

断言的格式如下:

when ( <condition> )

例如,下面的断言表示应该对 ID 为 1678 的进程执行探测点:

when ( __pid == 1678 )

探测管理器

探测管理器是动态跟踪的基本组件。探测管理器提供可以由 ProbeVue 检查的探测点。

在一般情况下,探测管理器支持一组属于同一领域并具有相同特性或属性的探测点,这些性质使这些探测点区别于其他探测点。在系统中控制流发生显著变化的位置,以及在发生状态变化和其他值得注意的情况的位置,启用探测点是有意义的。探测管理器负责只选择那些可以进行检查的位置上的探测点。

ProbeVue 当前支持以下三种探测管理器:

1. 系统调用探测管理器

系统调用(syscall)探测管理器支持在进入和退出基本 AIX 系统调用时触发探测。syscall 探测管理器接受采用以下格式之一的四个探测规格说明字段(其中的 <system_call_name> 字段应该替换为实际的系统调用名):

* syscall:*:<system_call_name>:entry
* syscall:*:<system_call_name>:exit

这些探测规格说明表示在系统调用的进入点和退出点上设置探测。第二个字段设置为星号(*),表示对于所有进程触发这个探测。另外,可以在探测规格说明的第二个字段中指定进程 ID,从而只对特定的进程触发探测。

* syscall:<process_ID>:<system_call_name>:entry
* syscall:<process_ID>:<system_call_name>:exit

2. 用户函数探测管理器

用户函数跟踪(uft)探测管理器支持探测用户空间函数,这些函数可以在进程的 XCOFF 符号表中看到。当前,可以作为探测点的这些进入点只限于用 C 语言编写的函数。uft 探测管理器当前只接受采用以下格式的五个探测规格说明字段:

uft:<processID>:*:<function_name>:entry

注意:对于 uft 探测管理器,必须指定要跟踪的进程的 ID 和完整的函数名。另外,uft 探测管理器当前要求把第三个字段设置为星号(*),这表示在进程地址空间中装载的所有模块中搜索函数名,包括主可执行程序和共享模块。

3. 时间间隔探测管理器

时间间隔探测管理器支持以用户指定的时间间隔触发探测。这些探测点并不位于内核或应用程序代码中,而是基于时钟时间间隔探测事件。时间间隔探测管理器接受采用以下格式的四个探测规格说明字段:

@@interval:*:clock:<# milliseconds>

第二个字段设置为星号(*),表示在所有进程中都可以触发这个探测。当前,时间间隔探测管理器还不能根据进程 ID 筛选探测事件。对于第三个字段,当前只支持 clock 关键字,这表示时钟探测。

第四个(即最后一个)字段是 <# milliseconds> 字段,这是触发探测的时间间隔(以毫秒为单位)。当前,时间间隔探测管理器要求这个字段的值能够被 100 整除,而且只能由 0 到 9 的数字组成。因此,探测事件的时间间隔可以是 100ms、200ms、300ms 等等。

Vue 函数

与用 C 语言、FORTRAN 语言或其他原生语言编写的程序不同,用 Vue 编写的脚本无法访问 AIX 系统库或任何用户库提供的例程。但是,Vue 支持自己的特殊函数库,这些函数能够满足动态跟踪程序的需要。这些函数包括:

与跟踪相关的函数

get_function 返回当前探测所在的函数的名称

timestamp 返回当前的时间戳

diff_time 计算两个时间戳的差

跟踪捕捉函数

printf 格式化和输出变量和表达式的值

trace 输出数据,不进行格式化

stktrace 格式化和输出堆栈跟踪

列表函数

list 实例化一个列表变量

append 在列表中追加一个新的列表项

sum, max, min, avg, count 可以应用于列表变量的聚合函数

C 库函数

atoi, strstr 标准的字符串函数

支持试探性跟踪的函数

start_tentative, end_tentative 表示试探性跟踪的开始和结束

commit_tentative, discard_tentative 在试探性缓冲区中提交或丢弃数据

其他函数

exit 终止跟踪程序

get_userstring 从用户内存读取字符串

Vue 字符串函数只能应用于字符串类型的变量,不能应用于指针变量。在 Vue 中不需要 strcpy()、strcat() 等标准字符串函数,这是因为语言语法本身支持这些功能。

ProbeVue 动态跟踪示例

下面给出一个基本的 ProbeVue 示例,以此说明 ProbeVue 的工作方式,以及如何对正在运行的可执行程序使用 ProbeVue 而不需要重新启动或重新编译程序。

下面是必须执行的步骤:

1. 希望对示例 1 所示的 C 程序(名为 pvue)进行动态跟踪。

示例 1 要动态跟踪的 C 程序:pvue.c

#include <fcntl.h>
main()
{
int x, rc;
int buff[100];
for (x=0; x<5; x++){
sleep(3);
printf("x=%dn",x);
}
sleep (3);
fd=open("./pvue.c",O_RDWR,0);
x =read(fd,buff,100);
printf("[%s]n",buff);
}

2. 编译并在后台执行此程序:

# cc -q64 -o pvue pvue.c
# ./pvue &
[1] 262272

该命令返回进程 ID(212272),这个值将用作 Vue 脚本的参数。

3. 为了动态地跟踪 pvue 进程调用子例程 printf() 和 sleep() 以及进入和退出 read() 的次数,我们开发了一个 Vue 脚本 pvue.e,见示例 2。

此脚本以进程 ID 作为输入参数($1)。还要注意 Vue 脚本的第一行,它指定 probevue 作为此脚本的解释器。

示例 2 样例 Vue 脚本 pvue.e

#!/usr/bin/probevue
@@BEGIN
{
printf("Tracing starts nown");
}
@@uft:$1:*:printf:entry
{
int count;
count = count +1;
printf("printf called %d timesn",count);
}
@@uft:$1:*:sleep:entry
{
int count1;
count1 = count1 +1;
printf("sleep called %d timesn",count1);
}
@@syscall:*:read:exit
when (__pid == $1)
{
printf("read enteredn");
}
@@syscall:*:read:entry
when (__pid == $1)
{
printf("read exitedn");
}
@@END
{
printf("Tracing ends nown");
}

4. 用 probevue 命令执行 pvue.e 脚本并通过参数传递要跟踪的进程 ID:

# probevue ./pvue.e 262272

这会获得示例 3 所示的跟踪输出。

示例 3 执行 Vue 脚本的输出

# ./pvue.e 262272
Tracing starts now
printf called 1 times
sleep called 1 times
printf called 2 times
/*
* Although the sleep precedes the printf in the loop, the reason we got the printf
in the trace was because the program was in the middle of the first sleep when we
started tracing it, and so the first thing we traced was the subsequent printf.
*/
sleep called 2 times
printf called 3 times
sleep called 3 times
printf called 4 times
sleep called 4 times
printf called 5 times
sleep called 5 times
read exited
read entered
printf called 6 times
^CTracing ends now
#

Vue 内置变量

Vue 定义了一组通用的内置变量:

__tid 目标线程的线程 ID

__pid 目标线程的进程 ID

__ppid 目标线程的父进程 ID

__pgid 目标线程的进程组 ID

__pname 目标线程的进程名

__uid, __euid 目标线程的真实和有效用户 ID

__trcid 执行跟踪的线程的进程 ID

__errno 目标线程当前的 errno 值

__kernelmode 内核模式(值为 1)或用户模式(值为 0)

__execname 当前的可执行程序名

__r3,..,__r10 用于函数参数或返回值的 GP 寄存器值

可以在 Vue 子句的断言部分中使用内置变量。在示例 2 中可以看到 __pid。

字符串

字符串数据类型代表字符串字面值。用户指定字符串类型的长度。下面是一个字符串声明的示例:

“String s[25]”

对于字符串数据类型,支持以下操作符:"+"、"="、"=="、"!="、">"、">="、"<" 和 "<="。

Vue 支持几个返回字符串数据类型的函数。它会根据需要在字符串数据类型和 C 风格的字符数据类型(char * 或 char[])之间进行转换。

列表

列表用来收集一组整数类型的值。它是一种抽象的数据类型,不能直接和标准的一元或二元操作符一起使用。Vue 对于列表类型支持以下操作:

构造函数 list(),用来创建列表变量。

连接函数 append(),用来在列表中添加列表项。

"=" 操作符,用来把一个列表赋值给另一个列表。

一组聚合函数,比如 sum()、avg()、min()、max() 等,它们操作一个列表变量并返回一个标量(整数)值。

示例 4 使用了列表变量 lst。列表数据类型的原型和详细解释可以在 AIX Version 6.1 General Programming Concepts: Writing and Debugging Programs(SC23-5259)的第四章 “Dynamic Tracing” 中找到。

符号常量

Vue 预定义了一些符号常量:

NULL

Errno 名称

Signal 名称

FUNCTION_ENTRY:表示函数入口点。用在 get_location_point() 中

FUNCTION_EXIT:表示函数退出点。用在 get_location_point() 中

Vue 中支持的 C 关键字/数据类型

表 1 列出 Vue 语言中使用的 C 关键字。

表 1 Vue 中的 C 关键字

支持的类型 只允许在头文件中使用的类型 不支持的类型
char auto break
double const case
else extern continue
enum register default
float static do
if typedef for
int volatile goto
long switch
return while
short
signed
sizeof
struct
union
unsigned
void

shell 的元素

在编译的初始阶段,Vue 把导出的 shell 变量(由 $ 前缀指定)和位置参数转换为它们的实际值。因此,ProbeVue 把 $1、$2 等替换为对应的值。

在把一般的环境变量赋值给字符串时,要确保它以反斜杠()开头和结尾。例如,如果把环境变量 “VAR=abcdef” 赋值给一个字符串,就会导致错误。在 Vue 脚本中,应该把它定义为 “VAR=”abcdef””。

限制:在 Vue 中不支持 $$、$@ 等特殊的 shell 参数。但是,可以通过其他预定义变量获得它们。

示例 4 演示如何使用各种变量类型和内核变量。Vue 脚本中的注释解释各个变量的范围。

示例 4 样例 Vue 脚本 pvue2.e

#!/usr/bin/probevue
/*
* Strings are by default Global variables
*/
String global_var[4096];
/*
* Global variables are accessible throughout the scope of Vue file in any clause
*/
__global global_var1;
__kernel long lbolt;
/*
* Thread variables are like globals but instantiated per traced thread first
* time it executes an action block that uses the variable
*/
__thread int thread_var;
/*
* Built-in variables are not supposed to be defined. They are by default
* available to the clauses where is makes any sense. They are : __rv, __arg1,
* __pid etc. __rv (return value for system calls) makes sense only when system
* call is returning and hence available only for syscall()->exit() action block.
* While __arg1, __arg2 and arg3 are accessible at syscall()->entry(). As system
* call read() accespts only 3 arguments so only __arg1, __arg2 and __arg2 are
* valid for read()->entry() action block.
* __pid can be accessed in any clause as current process id is valid everywhere
*/
int read(int fd, void *buf, int n);
@@BEGIN
{
global_var1=0;
lst=list();
printf("lbolt=%lldn",lbolt);
}
@@uft:$1:*:printf:entry
{
global_var1=global_var1+1;
append(lst,1);
}
/*
* Valid built-in variables : __pid, __arg1, __arg2, __arg3
* __rv not valid here, its valid only inside read()->exit()
*/
@@syscall:*:read:entry
when ( __pid == $1 )
{
/*
* Automatic variable is not accessible outside their own clause. So auto_var
* will result in error out of read()->entry()
*/
__auto int auto_var;
thread_var=__arg1;
global_var=get_userstring(__arg2,15);
global_var1=__arg3;
printf("At read()->entry():n");
printf("tfile descriptor ====>%dn", thread_var);
printf("tfile context (15 bytes)====>%sn", global_var);
printf("tMAX buffer size ====>%dn", global_var1);
}
/* Valid built-in variables : __pid, __rv
* __arg1, __arg2 and __arg2 are not valid here, they are valid only in
* read()->entry()
*/
@@syscall:*:read:exit
when ( __pid == $1 )
{
printf("At read()->exit(): bytes read=%d by read(%d, %s, %d)n",__rv,
thread_var, global_var, global_var1);
}
@@END
{
/*
* auto_var not accessible here as its an Automatic variable in clause
"read:entry"
*/
printf("nthread_var=%d global_var=%s global_var1=%dn", thread_var,
global_var, global_var1);
}

示例 5 给出将用这个 Vue 脚本跟踪的 C 文件。

示例 5 要跟踪的示例 C 程序

#include <fcntl.h>
main()
{
int x,rc,fd;
int buff[4096];
for (x=0; x<5; x++){
sleep(3);
printf("x=%dn",x);
fd=open("./pvue.c",O_RDWR,0);
rc =read(fd,buff,4096);
close(fd);
}
}

示例 6 给出跟踪程序的输出。

示例6 pvue2.e 脚本的输出

# ./pvue2.e 356786
lbolt=13454557
At read()->entry():
file descriptor ====>3
file context (15 bytes)====>
MAX buffer size ====>4096
At read()->exit(): bytes read=190 by read(3, , 4096)
At read()->entry():
file descriptor ====>3
file context (15 bytes)====>#include <fcntl
MAX buffer size ====>4096
At read()->exit(): bytes read=190 by read(3, #include <fcntl, 4096)
At read()->entry():
file descriptor ====>3
file context (15 bytes)====>#include <fcntl
MAX buffer size ====>4096
At read()->exit(): bytes read=190 by read(3, #include <fcntl, 4096)
At read()->entry():
file descriptor ====>3
file context (15 bytes)====>#include <fcntl
MAX buffer size ====>4096
At read()->exit(): bytes read=190 by read(3, #include <fcntl, 4096)
At read()->entry():
file descriptor ====>3
file context (15 bytes)====>#include <fcntl
MAX buffer size ====>4096
At read()->exit(): bytes read=190 by read(3, #include <fcntl, 4096)
^C

关于 ProbeVue 的其他需要考的因素

工作负载分区(WPAR)支持 ProbeVue。但是,如果在 WPAR 上有活跃的 ProbeVue 会话,就不能迁移 WPAR。在 WPAR 上必须授予 ProbeVue 特权。

Tags:IBM AIX 持续

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接