Часть 2. Обновления утилит для настройки производительности AIX 5.2

Это вторая статья о новых и усовершенствованных утилитах для настройки производительности AIX® 5.2. В этой статье рассмотрено, как инструментальные средства помогают разработчикам AIX отлаживать поведение системы и приложений. Значительно усовершенствованные утилиты по настройке системы в AIX 5.2 помогают разработчикам и администраторам анализировать, собирать и идентифицировать информацию о поведении системы и приложений, а также распознавать проблемы.

Часть 1 охватывает элементы новой базовой платформы настройки производительности в AIX 5.2, которая обеспечивает согласованную работу всех команд настройки ядра. Также в первой части приведены детальные описания каждой новой или модифицированной команды настройки ядра.

Нам Кеунг, Старший программист, IBM

Нам Кеунг (Nam Keung) -- старший программист, работавший в области развития AIX коммуникаций, AIX multimedia, разработки SOM/DSOM и производительности java. В настоящее время его назначение -- помощь ISV в разработке приложений, внедрение приложений, настройка производительности и обучение платформе IBM pSeries. Он работает программистом в IBM с 1989. Связаться с ним можно по адресу namkeung@us.ibm.com.



13.02.2009

Введение

В этой статье рассмотрены следующие утилиты:

  • файловая система /proc, которая была улучшена, и теперь предоставляет доступ к дополнительной информации о процессе;
  • утилиты /proc , обычно распространяемые с системами System V;
  • команда pstat;
  • команда truss.

Файловая система /proc

Для получения дополнительной информации об интересующем процессе в AIX 5.2, 32- и 64-битными процессами управления используется файловая система /proc и новые команды procwdx и procfiles. Также было создано два новых каталога: /proc/pid#/cwd и /proc/pid#/fd.

Файлы каталога /proc содержат данные, которые представляют состояние потоков и процессов в системе. В ходе работы системы это состояние постоянно изменяется. Чтобы уменьшить нагрузку на ресурсы системы, вызываемую чтением файлов /proc, файловая система /proc при генерации данных для этих файлов не останавливает работу операционной системы. При однократном чтении файла /proc обычно можно получить ясное и достаточно четкое представление о состоянии потока или процесса. Поскольку состояние потока или процесса меняется в ходе его выполнения, многократные запросы чтения файлов /proc могут вернуть представления с разными данными, которые могут противоречить друг другу.


Утилиты /proc

12 простых утилит, идентичных утилитам Solaris, очень полезны для разработчиков при отладке и анализе поведения процессов. Файловая система /proc предоставляет доступ к информации о текущем состоянии потоков и процессов, но информация эта представлена в двоичном коде. Утилиты /proc предоставляют ASCII-отчеты, содержащие некоторую из имеющейся в наличии информации.

Флаг -F следует использовать с осторожностью. Утилиты /proc tools (procfiles, procldd, procmap и procstack) приостанавливают изучаемые процессы на время исследования и вывода результатов . До тех пор пока прерывание не будет снято, процесс может простаивать. Применение двух процессов управления к одному исследуемому процессу может привести к хаосу.

В AIX 5.2 некоторые из утилит proc нельзя применить к core-файлам, также недоступна команда ptime.

Инструментальные средства proc - это утилиты, которые используют возможности /proc. Для большинства из них исходными данными является список идентификаторов процессов (pid), а также /proc/nnn в качестве идентификатора процесса, поэтому выражение /proc/* можно использовать для задания всех процессов в системе.

Таблица 1. Различия между Solaris и AIX 5.2

Solaris 2.9 AIX 5.2
pflags [-r] [pid | core] procflags [-r] [pid]
pcred [pid | core] proccred [pid]
pmap [-rxIF] [pid | core]procmap [-F] [pid]
pldd [-F] [pid | core]procldd [-F] [pid]
pstack [-F] [pid | core]procstack [-F] [pid]
pfiles [-F] [pid]procfiles [-nF] [pid]
ptime command [argument]недоступно
proctree
Отображает дерево процессов, содержащее заданные PID-идентификаторы процесса или пользователей. Чтобы отобразить родителей и всех детей процесса 12312, необходимо ввести:
> proctree 21166
11238    /usr/sbin/srcmstr
  21166    /usr/sbin/rsct/bin/IBM.AuditRMd

Чтобы отобразить родителей и детей процесса 21166, включая детей процесса 0, необходимо ввести:

> proctree –a 21166 
1    /etc/init
   11238    /usr/sbin/srcmstr
      21166    /usr/sbin/rsct/bin/IBM.AuditRMd

procstack
Выводит шестнадцатеричные адреса и символьные имена каждого фрейма стека текущего потока в процессе. Чтобы отобразить текущий стек процесса 15052, необходимо ввести:
> procstack 15052
15052 : /usr/sbin/snmpd
d025ab80  select   (?, ?, ?, ?, ?) + 90
100015f4  main   (?, ?, ?) + 1814
10000128  __start   () + 8c

В данном примере procstack вывел "мусор" или неправильную информацию для верхнего фрейма стека и, возможно, для следующего по старшинству фрейма стека. Иногда эта команда будет ошибочно выводить "No frames found on the stack" ("В стеке не было найдено фреймов"), и иногда она выведет: "deadbeef ???????? (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ...)." На момент написания этой статьи исправления для этой ошибки еще не было выпущено. Когда исправление будет готово, нужно будет загрузить APAR IY48543.

procmap
Отображает таблицу адресов процессов. Чтобы узнать адресное пространство процесса 13204, необходимо ввести:
>procmap  13204 
13204 : /usr/sbin/biod 6
10000000	  3K	read/exec	biod
20000910	  0K	read/write	biod
d0083100	 79K	read/exec	/usr/lib/libiconv.a
20013bf0	 41K	read/write	/usr/lib/libiconv.a
d007a100	 34K	read/exec	/usr/lib/libi18n.a
20011378	  4K	read/write	/usr/lib/libi18n.a
d0074000	 11K	read/exec	/usr/lib/nls/loc/en_US
d0077130	  8K	read/write	/usr/lib/nls/loc/en_US
d00730f8	  2K	read/exec	/usr/lib/libcrypt.a
f03c7508	  0K	read/write	/usr/lib/libcrypt.a
d01d4e20    1997K	read/exec 	/usr/lib/libc.a
f0337e90     570K	read/write	/usr/lib/libc.a
procldd
Отображает список библиотек, загруженных процессом. Чтобы вывести список динамических библиотек, загруженных процессом 11928, необходимо ввести > procldd 11928. Вывод этой команды может выглядеть следующим образом:
 11928 : -sh
 /usr/lib/nls/loc/en_US
 /usr/lib/libcrypt.a
 /usr/lib/libc.a
procflags
Отображает трассировочные флаги процесса, а также его сигналы ожидания и блокировки. Чтобы отобразить трассировочные флаги процесса 28138, необходимо ввести:
> procflags 28138
28138 : /usr/sbin/rsct/bin/IBM.HostRMd
data model = _ILP32 flags = PR_FORK
/64763: flags = PR_ASLEEP | PR_NOREGS
/66315: flags = PR_ASLEEP | PR_NOREGS
/60641: flags = PR_ASLEEP | PR_NOREGS
/66827: flags = PR_ASLEEP | PR_NOREGS
/7515: flags = PR_ASLEEP | PR_NOREGS
/70439: flags = PR_ASLEEP | PR_NOREGS
/66061: flags = PR_ASLEEP | PR_NOREGS
/69149: flags = PR_ASLEEP | PR_NOREGS
procsig
Выводит список сигналов процесса. Чтобы вывести весь список сигналов (signal actions), определенных для процесса 30552, необходимо ввести:
> procsig 30552
30552 : -ksh
HUP caught
INT caught
QUIT caught
ILL caught
TRAP caught
ABRT caught
EMT caught
FPE caught
KILL default RESTART BUS caught
proccred
Выводит информацию о credential процесса. Чтобы отобразить credential для процесса 25632, необходимо ввести:
> proccred  25632
25632: e/r/suid=0  e/r/sgid=0
procfiles
Выводит список дескрипторов открытых файлов. Чтобы отобразить статус и управляющую информацию файловых дескрипторов, открытых процессом 20138, необходимо ввести:
> procfiles –n 20138
20138 : /usr/sbin/rsct/bin/IBM.CSMAgentRMd
  Current rlimit: 2147483647 file descriptors
   0: S_IFCHR mode:00 dev:10,4 ino:4178 uid:0 gid:0 rdev:2,2
      O_RDWR  name:/dev/null
   2: S_IFREG mode:0311 dev:10,6 ino:250 uid:0 gid:0 rdev:0,0
      O_RDWR size:0   name:/var/ct/IBM.CSMAgentRM.stderr
   4: S_IFREG mode:0200 dev:10,6 ino:255 uid:0 gid:0 rdev:0,0
procwdx
Выводит текущий рабочий каталог процесса. Для вывода текущего рабочего каталога процесса 11928 необходимо ввести:
 > procwdx 11928
11928 :  /home/guest
procstop
Останавливает процесс. Чтобы остановить процесс 7500 событием PR_REQUESTED, необходимо ввести >procstop 7500.
procrun
Перезапускает процесс. Чтобы перезапустить процесс 30192, остановленный событием PR_REQUESTED, необходимо ввести > procrun 30192.
procwait
Ожидает завершения всех заданных процессов. Чтобы ожидать завершения процесса 12942 и вывести его статус, необходимо ввести > procwait -v 12942. Вывод этой команды может выглядеть следующим образом:
12942 : terminated, exit status 0

Команда pstat

Команда pstat, которая отображает множество системных таблиц (таблица процессов, таблица inode-узлов или таблица статусов процессоров), была перенесена в AIX 5.2 с прежними функциями. Команда pstat интерпретирует содержимое различных системных таблиц и записывает свои результаты в стандартный поток вывода.

Эта команда не поддерживается в Solaris 2.9. Используйте команду pstat из командной строки AIX 5.2 (после приглашения на ввод). Ознакомьтесь со справкой по команде, в которой дается подробное описание вместе с примерами, или используйте краткую сводку по синтаксису из таблицы 2.

Таблица 2. Флаги

-aВыводит записи в таблице процессов
-AВыводит все записи в таблице потоков ядра
-fВыводит файловую таблицу
-iВыводит i-node-таблицу и адреса блоков данных i-node
-pВыводит таблицу процессов
-PВыводит только работоспособные потоки ядра в таблице потоков
-sВыводит информацию об использовании свопинга или пространства страниц
-SВыводит статус процессоров
-tОтображает структуру tty
-u ProcSlotВыводит пользовательскую структуру с информацией о процессе в специальный слот таблицы процессов. При попытке отобразить выгруженный из памяти процесс будет сгенерировано сообщение об ошибке.
-TВыводит системные переменные. Краткое описание этих переменных приведено в var.h
-U ThreadSlot Выводит пользовательскую структуру с информацией о потоке ядра в заданный слот таблицы потоков ядра (kernel thread table). При попытке отобразить выгруженный из памяти поток ядра будет сгенерировано сообщение об ошибке.

Чтобы отобразить все потоки в таблице потоков ядра и пользовательскую структуру данных потока в слоте 0 таблицы потоков, необходимо ввести:

>pstat -A -U 0
THREAD TABLE:

SLT ST    TID      PID    CPUID  POLICY PRI CPU    EVENT  PROCNAME    FLAGS
  0 s       3        0  unbound    FIFO  10  78            swapper
        flags:  kthread
  1 s     103        1  unbound   other  3c   0               init
        flags:  local wakeonsig cdefer unknown: 0x10000
  2 r     205      204        0    FIFO  ff  78               wait
        flags:  funnel kthread
  3 r     307      306        1    FIFO  ff  78               wait
        flags:  funnel kthread
  4 s     409      408  unbound      RR  11   0             reaper
        flags:  kthread
  
UTHREAD AREA:

        UTHREAD AREA FOR SLOT   0 (swapper)

SAVED MACHINE STATE
    m/q:0x00000000  iar:0x0004baa8  cr:0x28222024
    msr:0x000010b2    lr:0x0004baa8   xer:0x20000018  kjmpbuf:0x00000000
    backtrack:0x00   tid:0x00000000  fpeu:0x01       excp_type:0x00000000
    ctr:0x00000000 *prevmst:0x00000000 *stackfix:0x2ff3b2a8 intpri:0x00
    …

General Purpose Regs
          0x00000000  0x40000000  0x00054035  0xdff3c000  0x00000106
    Adspace:
MST Segment Regs
     0:0x00000000   1:0x0003800e   2:0x00044011   3:0x0003c00f
     4:0x007fffff   5:0x007fffff   6:0x007fffff   7:0x0003402d
     …
     
General Purpose Regs
     0:0x00037ae4   1:0x2ff3b2a8   2:0x00675148   3:0xe2000154
     4:0xffff0000   5:0x01fe4400   6:0x00000003   7:0x00000000
     8:0x0017b140   9:0x00000001  10:0x2ff3b338  11:0x0017b140
    12:0x000010b2  13:0x01066178  14:0x01000085  15:0x00000000
    ….

SYSTEM CALL STATE
    error code:0x00  *kjmpbuf:0x00000000

PER-THREAD TIMER MANAGEMENT
    timer[0] = 0x0

SIGNAL MANAGEMENT
    *sigsp:0x000000000   code:0x0

MISCELLANOUS FIELDS:
   fstid:0x00000000   ioctlrv:0x00000000   selchn:0x00000000
   link:0x00000000   loginfo:0x00000000   fselchn:0x00000000
   selbuc:0x00000000sigssz:0x0000000000000000 User msr:0x0000000000000000
   *context:0x0000000000000000   **errnopp:0x00000000c0c0fade
   *stkb:0x0000000000000000
   *audsvc:0x00000000     scsave[0]:0x00000000   scsave[1]:0x00000000
   …

USER AREA:

   USER AREA OF ASSOCIATED PROCESS swapper (SLOT   0, PROCTAB 0x01fe4200)
    handy_lock:0x00000000  timer_lock:0x00000000
    map:0x00000000  *semundo:0x00000000  *pinu_block:0x00000000
    compatibility:0x00000001  lock:0x00000000
    ulocks:0x00000000  *message:0x00000000  irss:0x0000000000000000
    lock_word:0x00000000  *vmm_lock_wait:0x00000000  vmmflags:0x00000000

SIGNAL MANAGEMENT
   Signals to be blocked (sig#:hi/lo mask,flags,&func)
     1:hi 0x00000000,lo 0x00000000,0x00000000,0x00000000

INTERNAL SIGNALS
    64:hi 0x00000000,lo 0x00000000,0x00000000,0x00000000
    65:hi 0x00000000,lo 0x00000000,0x00000000,0x00000000
    
USER INFORMATION
   CRED Structure Not Found


ACCOUNTING DATA
    start:0x3f818c87  ticks:0x00000000  acflag:0x0000  pr_base:0x00000000
    pr_size:0x00000000  pr_off:0x00000000  pr_scale:0x00000000
    process times:
           user:0x00000000s 0x00000000us
            sys:0x00000000s 0x0007df0dus
    children's times:
           user:0x00000000s 0x00000000us
            sys:0x00000000s 0x00000000us

CONTROLLING TTY
    *ttysid:0x00000000  *ttyp(pgrp):0x00000000
    ttyd(evice):0x00000000  ttympx:0x00000000  *ttys(tate):0x00000000
    tty id: 0x00000000  *query function: 0x00000000

RESOURCE LIMITS AND COUNTERS
    ior:0x00000000  iow:0x00000000  ioch:0x00000000
    text:0x0000000000000000  data:0x0000000000000000  stk:0x01000000
    max data:0x08000000  max stk:0x01000000  max file(blks):0xffffffff
    *tstart:0x00000000  sdsize:0x00000000
    *datastart:0x00000000  *stkstart0x20000000
    U_minbreak:0x0000000020000000  U_breakhiwater 0000000020000000
    U_min_mmap:0x0000000000000000 U_brkseg 00000002 U_stkseg 00000002
FILE SYSTEM STATE
    *curdir:0x00000000  *rootdir:0x00000000
    cmask:0x0000  maxindex:0x00000000
    U_fd_slcks[0].u_fd_slock:0x00000000
    U_fd_slcks[1].u_fd_slock:0x00000000
    U_fd_slcks[2].u_fd_slock:0x00000000
    fso_lock:0x00000000  lockflag:0x00000000  fdevent:0x00000000

FILE DESCRIPTOR TABLE
    *ufd: 0x2ff3cee8

Чтобы вывести системные переменные, необходимо ввести:

> pstat -T
SYSTEM VARS:

Buffers	20
Files		853
e_files	853
procs		262144
e_procs	128
threads	524288
e_threads	224
clists		16384
maxproc	128
	…

Чтобы вывести записи из таблицы для текущего ядра, необходимо ввести:

> pstat -P
THREAD TABLE:

SLT ST    TID      PID    CPUID  POLICY PRI CPU    EVENT  PROCNAME     FLAGS
  2 r     205      204        0    FIFO  ff  78               wait
        flags:  funnel kthread  
 67 r    435f     619c  unbound   other  3c   6              pstat
        flags:

Чтобы вывести таблицу процессов, необходимо ввести:

> pstat -p
PROC TABLE:

SLT ST    PID   PPID   PGRP   UID  EUID  TCNT  NAME
  2 a     204      0      0     0     0     1  wait
        FLAGS:swapped_inno_swapfixed_prikproc
  3 a     306      0      0     0     0     1  wait
        FLAGS:swapped_inno_swapfixed_prikproc
124 a    7cc2   6fae   7cc2     0     0     1  pstat
        FLAGS:swapped_in execed

Чтобы вывести процессоры, необходимо ввести:

> pstat -S
STATUS OF PROCESSORS:

CPU     TID  TSLOT     PID  PSLOT  PROC_NAME
  0     205      2     204      2  wait
  1    5ab7     90    7cc4    124  pstat

Чтобы вывести информацию по пространству страниц, необходимо ввести:

> pstat -s
PAGE SPACE:

          USED PAGES   FREE PAGES
             1261       129811

Truss

Команда truss доступна для UNIX SVR4. Эта команда полезна при трассировке системных вызовов одного или более процессов. В AIX 5.2 распознаются все базовые типы системных вызовов. В AIX 5.1 распознавалось только около 40 системных вызовов.

truss - это основанная на /proc отладочная утилита, которая выполняет и трассирует команду или трассирует существующий процесс. Она выводит имена всех сделанных системных вызовов и их параметров и кодов возврата. Параметры системного вызова отображаются в символьном виде. truss выводит информацию обо всех сигналах, полученных процессом. Версия AIX 5.2 поддерживает трассировку библиотечных вызовов. Для каждого вызова truss выводит параметры и коды возврата. Она также может трассировать подмножество функций библиотеки, подмножество процедур в определенной библиотеке. Для каждой строки вставляются отметки времени.

В AIX 5.2 утилита truss упакована в bos.sysmgt.serv_aid, который записан на базовом диске дистрибутива AIX. Ознакомьтесь со справкой по командам, включающей примеры ее использования, или используйте информацию, представленную ниже.

-a - выводит строки параметров, переданные в каждый выполненный системный вызов.

> truss –a  sleep
execve("/usr/bin/sleep", 0x2FF22980, 0x2FF22988)  argc: 1
argv: sleep
sbrk(0x00000000)                                = 0x200007A4
sbrk(0x00010010)                                = 0x200007B0
getuidx(4)                                             = 0
…
…
__loadx(0x01000080, 0x2FF1E790, 0x00003E80, 0x2FF22720, 0x00000000) = 
   0xD0077130 access("/usr/lib/nls/msg/en_US/sleep.cat", 0)   = 0
_getpid()                                       = 31196
open("/usr/lib/nls/msg/en_US/sleep.cat", O_RDONLY) = 3
kioctl(3, 22528, 0x00000000, 0x00000000)        Err#25 ENOTTY
kfcntl(3, F_SETFD, 0x00000001)                  = 0
kioctl(3, 22528, 0x00000000, 0x00000000)        Err#25 ENOTTY
kread(3, "\0\001 •\001\001 I S O 8".., 4096)    = 123
lseek(3, 0, 1)                                  = 123
lseek(3, 0, 1)                                  = 123
lseek(3, 0, 1)                     	             = 123
_getpid()                         	             = 31196
lseek(3, 0, 1)                     	             = 123
Usage: sleep Seconds
kwrite(2, " U s a g e :   s l e e p".., 21) 	    = 21
kfcntl(1, F_GETFL, 0x00000000)           	    = 2
kfcntl(2, F_GETFL, 0x00000000)           	    = 2
_exit(2)

-c - считает трассируемые системные вызовы, ошибки, но не выводит результаты выполняемой трассировки. Итоговый отчет создается после завершения трассируемой команды или в случае прерывания truss. Если используется флаг -f, в расчеты включаются все трассированные системные вызовы, ошибки и сигналы для дочерних процессов.

	> truss –c ls
	syscall			seconds   	calls  errors
execve				.00		1
__loadx			.00	      17
_exit				.00		1
close				.00		2
kwrite				.00		5
lseek                     	.00		1
setpid                   	.00	       1
getuidx                   	.00	      19
getdirent                 	.00	       3
kioctl                    	.00	       3
open                      	.00	       1
statx                     	.00	       2
getgidx                   	.00	      18
sbrk                      	.00	       4
access                    	.00	       1
kfcntl                    	.00	       6
                         	----	     ---    ---
sys totals:               	.01	      85      0
usr time:                 	.00
elapsed:                  	.01

-d - в каждую строку с выводимой информацией включается временная метка. Время выводится в секундах относительно начала трассировки. Первая строка вывода трассировки покажет системное время, с которого отмерялись отдельные временные метки. По умолчанию временные метки не измеряются.

	>truss –d sleep
0.0029:        execve("/usr/bin/sleep", 0x2FF22978, 0x2FF22980)  argc: 1
0.0369:        sbrk(0x00000000)                 = 0x200007A4
0.0381:        sbrk(0x0000000C)                 = 0x200007A4
0.0394:        sbrk(0x00010010)                 = 0x200007B0
0.0406:        getuidx(4)                       = 0
0.0416:        getuidx(2)                       = 0
0.0426:        getuidx(1)                       = 0
0.0436:        getgidx(4)                       = 0
0.0446:        getgidx(2)                       = 0
0.0456:        getgidx(1)                       = 0
0.0468:        __loadx(0x01000080, 0x2FF1E780, 0x00003E80, 0x2FF22710, 
   0x00000000) = 0xD0077130

-D - на каждой строке вывода отображается разница во времени. Разница во времени отражает время, прошедшее от момента регистрации последнего сгенерированного события потока до генерирования текущего события LWP (Light Weight Process, легковесный процесс). По умолчанию приращение времени не указывается.

	>truss –D sleep
0.0002:        execve("/usr/bin/sleep", 0x2FF22978, 0x2FF22980)  argc: 1
0.0345:        sbrk(0x00000000)                 = 0x200007A4
0.0013:        sbrk(0x0000000C)                 = 0x200007A4
0.0013:        sbrk(0x00010010)                 = 0x200007B0
0.0012:        getuidx(4)                       = 0
0.0010:        getuidx(2)                       = 0
0.0010:        getuidx(1)                       = 0
0.0010:        getgidx(4)                       = 0
0.0011:        getgidx(2)                       = 0
0.0010:        getgidx(1)                       = 0
0.0012:        __loadx(0x01000080, 0x2FF1E780, 0x00003E80, 0x2FF22710, 
   0x00000000) = 0xD007130

-e - выводит переменные окружения, которые были переданы в каждый выполненный системный вызов.

>truss –e ls
execve("/usr/bin/ls", 0x2FF22980, 0x2FF22988)    argc: 1
envp: _=/usr/bin/truss MANPATH=:/opt/freeware/man LANG=en_US
LOGIN=root PAGER=pg ENSCRIPT=-G -broot@nkeung   VISUAL=/usr/bin/vi
RPC_SUPPORTED_PROTSEQS=ncadg_ip_udp
  PATH=/usr/java14/jre/bin:/usr/java14/bin:/usr/opt/ifor/bin:/perf/
     jinsight2.1:/usr/vvac/bin:/usr/vacpp/bin:/usr/bin:/etc:/usr/sbin:/
     usr/ucb:/usr/bin/X11:/sbin:/usr/local/bin:/usr/idebug/bin:/usr/
     lib:/usr/prod/bin:/usr/afs/bin:/usr/vatools/bin:/opt/freeware/bin:.:/
     var/ifo
/usr/opt/ifor/ls/conf

LC__FASTMSG=true CGI_DIRECTORY=/usr/HTTPServer/cgi-bin
EDITOR=/usr/bin/vi PSCH=> TTYNAME=pts/3 LOGNAME=root
MAIL=/usr/spool/mail/root SECONDS=34097 MOZILLA_HOME=/opt/netscape
LOCPATH=/usr/lib/nls/loc PS1=$_place ${PWD}: ${PSCH}
PRINTER=labnetps HOST=nkeung
DOCUMENT_SERVER_MACHINE_NAME=nkeung.austin.ibm.com USER=root
AUTHSTATE=compat DCE_USE_WCHAR_NAMES=1 DEFAULT_BROWSER=netscape
SHELL=/usr/bin/ksh ODMDIR=/etc/objrepos DOCUMENT_SERVER_PORT=80
HOME=/ FCEDIT=/usr/bin/vi TERM=ansi MAILMSG=[YOU HAVE NEW MAIL]
_place=root@nkeung ITECONFIGSRV=/etc/IMNSearch PWD=/home
DOCUMENT_DIRECTORY=/usr/HTTPServer/htdocs TZ=CST6CDT LPDEST=labnetps
ENV=${START[(_$-=1)+(_=0)-(_$-!=_${-%%*i*})]} START=//.kshrc
TRY_PE_SITE=1 ITECONFIGCL=/etc/IMNSearch/clients
ITE_DOC_SEARCH_INSTANCE=search A__z=! LOGNAME
NLSPATH=/usr/lib/nls/msg/%L/%N:/usr/lib/nls/msg/%L/%N.cat
sbrk(0x00000000)                                = 0x20000EA8
…..

-u - [!] [LibraryName [...]::[!]FunctionName [...] ] (имя библиотеки, имя функции). Трассирует динамически загруженные функции пользовательского уровня из пользовательских библиотек. LibraryName - это разделяемый запятыми список имен библиотек. FunctionName - это разделяемый запятыми список названий функций. В обоих случаях имена могут содержать обобщающие метасимволы *, ?, []. Эти метасимволы интерпретируются так же, как интерпретирует их оболочка, но применяются к пространствам имен библиотек и функций, а не файлов.

  • Чтобы проследить все вызовы пользовательского уровня, сделанные к любой функции в библиотеке С из внешнего окружения, необходимо ввести:
    >truss –u "libc.a::*" ls
  • Для трассировки вызова функции open() в libc.a при выполнении команды motd необходимо ввести:
    > truss -t open -u 'libc*::*open*' /usr/bin/cat /etc/motd
    open("/etc/motd", 0400000000)                   = 3
    ******************************************************************
    *  
    * Welcome to AIX Version 5.2!                                    *
    *
    * Please see the README file in /usr/lpp/bos for information 
    * pertinent to   *
    * this release of the AIX Operating System.                      *
  • Для трассировки вызовов функции malloc() и отключения трассировки вызовов функции strlen() в библиотеке libc.a при выполнении команды ls необходимо ввести:
    >truss -u libc.a::malloc,!strlen ls
    execve("/usr/bin/ls", 0x2FF22970, 0x2FF22978)    argc: 1
    sbrk(0x00000000)                                = 0x20000EA8
    sbrk(0x00000008)                                = 0x20000EA8
    sbrk(0x00010010)                                = 0x20000EB0
    getuidx(4)                                      = 0
    getuidx(2)                                      = 0
    getuidx(1)                                      = 0
    getgidx(4)                                      = 0
    getgidx(2)                                      = 0
    getgidx(1)                                      = 0
    __loadx(0x01000080, 0x2FF1E760, 0x00003E80, 0x2FF226F0, 0x00000000) = 
       0xD0077130
    ->libc.a:malloc(0xc)
    <-libc.a:malloc() = 20001058            0.000000
    ->libc.a:malloc(0x188)
    <-libc.a:malloc() = 20001078            0.000000
    ->libc.a:malloc(0x40)
    <-libc.a:malloc() = 20001208            0.000000
    ->libc.a:malloc(0x3c)
    <-libc.a:malloc() = 20001258            0.000000
  • Для трассировки в библиотеке libc.a всех функций с именами, начинающимися на "m", во время выполнения команды ls необходимо ввести:
    >truss -u libc.a::m*,!strlen ls
    execve("/usr/bin/ls", 0x2FF22970, 0x2FF22978)    argc: 1
    ->libc.a:malloc(0xc)
    <-libc.a:malloc() = 20001058            0.000000
    ->libc.a:malloc(0x188)
    ….
    kwrite(1, 0xF0382258, 1)                        = 1
    ->libc.a:mbswidth(0x20021678, 0x9)
    ->libc.a:mbtowc(0x2ff21520, 0x2ff21420, 0x1)
    ->libc.a:mbtowc(0x2ff21522, 0x2ff21421, 0x1)
    ->libc.a:mbtowc(0x2ff21524, 0x2ff21422, 0x1)
    …
    <-libc.a:mbswidth() = 9         0.000000
    .netscapekwrite(1, 0xF0382258, 9)                = 9
    ->libc.a:mbswidth(0x20022af8, 0x8)
    ->libc.a:mbtowc(0x2ff21520, 0x2ff21420, 0x1)
    ->libc.a:mbtowc(0x2ff21522, 0x2ff21421, 0x1)
    ->libc.a:mbtowc(0x2ff21524, 0x2ff21422, 0x1)
    ->libc.a:mbtowc(0x2ff21526, 0x2ff21423, 0x1)
    <-libc.a:mbswidth() = 8         0.000000
                     kdb.corekwrite(1, 0xF0382258, 25)         = 25
    ->libc.a:mbswidth(0x2001f900, 0x3)
    ->libc.a:mbtowc(0x2ff21520, 0x2ff21420, 0x1)
    ->libc.a:mbtowc(0x2ff21522, 0x2ff21421, 0x1)
    ->libc.a:mbtowc(0x2ff21524, 0x2ff21422, 0x1)
    <-libc.a:mbswidth() = 3         0.000000
                      usrkwrite(1, 0xF0382258, 21)              = 21
  • Для трассировки всех вызовов функций из библиотеки libcurses.a и исключения трассировки вызовов функций из libc.a во время выполнения команды foo необходимо ввести:
    >truss -u libcurses.a,!libc.a::* foo
  • Для трассировки вызова функции refresh() из libcurses.a и вызова функции malloc() из libc.a во время выполнения команды foo необходимо ввести:
    >truss -u libc.a::malloc -u libcurses.a::refresh foo

Ресурсы

Научиться

Получить продукты и технологии

  • IBM trial software: ознакомительные версии программного обеспечения для разработчиков, которые можно загрузить прямо со страницы сообщества developerWorks.(EN)

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=369529
ArticleTitle=Часть 2. Обновления утилит для настройки производительности AIX 5.2
publish-date=02132009