 | Уровень сложности: простой Нам Кеунг, Старший программист, IBM
13.02.2009 Это вторая статья о новых и усовершенствованных утилитах для настройки производительности AIX® 5.2. В этой статье рассмотрено, как инструментальные средства помогают разработчикам AIX отлаживать поведение системы и приложений. Значительно усовершенствованные утилиты по настройке системы в AIX 5.2 помогают разработчикам и администраторам анализировать, собирать и идентифицировать информацию о поведении системы и приложений, а также распознавать проблемы.
Часть 1 охватывает элементы новой базовой платформы настройки производительности в AIX 5.2, которая обеспечивает согласованную работу всех команд настройки ядра. Также в первой части приведены детальные описания каждой новой или модифицированной команды настройки ядра.
Введение
В этой статье рассмотрены следующие утилиты:
- файловая система /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 - это разделяемый запятыми список названий функций. В обоих случаях имена могут содержать обобщающие метасимволы *, ?, []. Эти метасимволы интерпретируются так же, как интерпретирует их оболочка, но применяются к пространствам имен библиотек и функций, а не файлов.
- Чтобы проследить все вызовы пользовательского уровня, сделанные к любой функции в библиотеке С из внешнего окружения, необходимо ввести:
- Для трассировки вызова функции
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)
Обсудить
Об авторе  | |  | Нам Кеунг (Nam Keung) -- старший программист, работавший
в области развития AIX коммуникаций, AIX multimedia, разработки SOM/DSOM и производительности java. В настоящее время его назначение -- помощь ISV в разработке приложений, внедрение приложений, настройка производительности и обучение платформе IBM pSeries. Он работает программистом в IBM с 1989. Связаться с ним можно по адресу namkeung@us.ibm.com. |
Выскажите мнение об этой странице
|  |