dtrace
отладка iOS приложений с помощью dtrace
В двух словах
•

вызовы функций

•

скрипты

•

OS X / iOS Simulator
История
•

truss (Unix)

•

strace (Linux)

•

dtrace (Sun OS, OS X)
Скрипт
<probe description>
[/predicate/]
{
     <actions>
} 
Скрипт
Точка трассировки

syscall::read:entry
Дополнительное условие
/execname == “bash”/
{
     printf(“bash with pid %d ...
Скрипт
CPU ID
0 155
0 155
1 155
1 155

FUNCTION:NAME
read:entry bash with pid 2958 called write
read:entry bash with pid 4...
Точки трассировки
syscall, pid, objc

read, write, +alloc

provider:module:function:name
libc++.1.dylib, mach_kernel

имя ...
Точки трассировки

syscall::read:entry
вход в функцию read для
всех процессов
Точки трассировки

syscall::read:return
выход из read для всех
процессов
Точки трассировки

pid1234::read:
выход и выход из read для
процесса с pid: 1234
Точки трассировки

objc123:NSString:-*:entry
вход во все методы
NSString для процесса 123
Точки трассировки

syscall::read:entry,

syscall::write:entry
Можно указывать несколько
через запятую
Точки трассировки

BEGIN
END
Специальные точки
Скрипт
syscall::read:entry
Дополнительное условие
/execname == “bash”/
{
     printf(“bash with pid %d called writen”,pid)...
Предикат

/expression/
Предикат

execname, pid, tid
Предикат

arg0..argX
args[0]..args[X]
Предикат

перменные скрипта
Скрипт
syscall::read:entry
/execname == “bash”/
{
     printf(“bash with pid %d called writen”,pid);
} 
Действия
Скрипт
•

Переменные

•

Вызов функций

•

Нет циклов и ветвлений
trace
syscall::read:entry{trace(execname)}
!

CPU ID
1 155

FUNCTION:NAME
read:entry Google Chrome H
trace
printf
syscall::read:entry{printf(“arg0: %d”, arg0)}
!

CPU ID
0 155

FUNCTION:NAME
read:entry arg0: 7
printf
ustack
syscall::read:entry{ustack()}
!

CPU ID
FUNCTION:NAME
1 155
read:entry
libsystem_kernel.dylib`read+0xa
CFNetwork`__...
Что можно делать
•

Анализ приложений и драйверов с применением
сложных фильтров

•

Профилирование памяти для конкретных
...
DEMO
Что не умеет
•

вызывать методы и функции пользовательского
кода

•

обращаться к мемберам объектов

•

выводить NSString
...
Указатели
копирует во временный
буфер

printf(“%d”, copyin(arg0, 4));
указатель на int
С-strings
printf(“%s”, arg0);
!

printf(“%s”, copyinstr(arg0));
указатель на c-string
“Фишки” D
•

автоматическое объявление переменных

•

все массивы – ассоциативные
•

•

proc[execname, tid]++

аггрегации
...
Стандартные скрипты
•

dtruss – эмуляция truss

•

iosnoop, iotop – анализ работы с диском

•

execsnoop – запуск новых пр...
Instruments
Дополнительная
информация
•

man dtrace

•

http://www.oracle.com/technetwork/server-storage/solaris10/solaris-dtracewp-16...
Upcoming SlideShare
Loading in …5
×

«Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep

1,003 views

Published on

Доклад о том, как можно использовать утилиту dtrace для отладки iOS приложений. Эта утилита может быть полезна при отладке сложных случаев, когда необходимо задать какие-либо правила для фильтрации вызываемых функций.

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,003
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

«Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep

  1. 1. dtrace отладка iOS приложений с помощью dtrace
  2. 2. В двух словах • вызовы функций • скрипты • OS X / iOS Simulator
  3. 3. История • truss (Unix) • strace (Linux) • dtrace (Sun OS, OS X)
  4. 4. Скрипт <probe description> [/predicate/] {      <actions> } 
  5. 5. Скрипт Точка трассировки syscall::read:entry Дополнительное условие /execname == “bash”/ {      printf(“bash with pid %d called writen”,pid); }  Действия
  6. 6. Скрипт CPU ID 0 155 0 155 1 155 1 155 FUNCTION:NAME read:entry bash with pid 2958 called write read:entry bash with pid 444 called write read:entry bash with pid 448 called write read:entry bash with pid 448 called write
  7. 7. Точки трассировки syscall, pid, objc read, write, +alloc provider:module:function:name libc++.1.dylib, mach_kernel имя зонда (probe)
  8. 8. Точки трассировки syscall::read:entry вход в функцию read для всех процессов
  9. 9. Точки трассировки syscall::read:return выход из read для всех процессов
  10. 10. Точки трассировки pid1234::read: выход и выход из read для процесса с pid: 1234
  11. 11. Точки трассировки objc123:NSString:-*:entry вход во все методы NSString для процесса 123
  12. 12. Точки трассировки syscall::read:entry,
 syscall::write:entry Можно указывать несколько через запятую
  13. 13. Точки трассировки BEGIN END Специальные точки
  14. 14. Скрипт syscall::read:entry Дополнительное условие /execname == “bash”/ {      printf(“bash with pid %d called writen”,pid); } 
  15. 15. Предикат /expression/
  16. 16. Предикат execname, pid, tid
  17. 17. Предикат arg0..argX args[0]..args[X]
  18. 18. Предикат перменные скрипта
  19. 19. Скрипт syscall::read:entry /execname == “bash”/ {      printf(“bash with pid %d called writen”,pid); }  Действия
  20. 20. Скрипт • Переменные • Вызов функций • Нет циклов и ветвлений
  21. 21. trace syscall::read:entry{trace(execname)} ! CPU ID 1 155 FUNCTION:NAME read:entry Google Chrome H trace
  22. 22. printf syscall::read:entry{printf(“arg0: %d”, arg0)} ! CPU ID 0 155 FUNCTION:NAME read:entry arg0: 7 printf
  23. 23. ustack syscall::read:entry{ustack()} ! CPU ID FUNCTION:NAME 1 155 read:entry libsystem_kernel.dylib`read+0xa CFNetwork`__CFSocketReadWithError(__CFSocket*, unsigned char*, long, CFStreamError*)+0x1e CFNetwork`SocketStream::socketRead(unsigned char*, long, CFStreamError*)+0x1c
  24. 24. Что можно делать • Анализ приложений и драйверов с применением сложных фильтров • Профилирование памяти для конкретных объектов • Профилирование производительности
  25. 25. DEMO
  26. 26. Что не умеет • вызывать методы и функции пользовательского кода • обращаться к мемберам объектов • выводить NSString • не работает на девайсе
  27. 27. Указатели копирует во временный буфер printf(“%d”, copyin(arg0, 4)); указатель на int
  28. 28. С-strings printf(“%s”, arg0); ! printf(“%s”, copyinstr(arg0)); указатель на c-string
  29. 29. “Фишки” D • автоматическое объявление переменных • все массивы – ассоциативные • • proc[execname, tid]++ аггрегации • @counts["write system calls"] = count();
  30. 30. Стандартные скрипты • dtruss – эмуляция truss • iosnoop, iotop – анализ работы с диском • execsnoop – запуск новых процессов • man -k dtrace – полный список
  31. 31. Instruments
  32. 32. Дополнительная информация • man dtrace • http://www.oracle.com/technetwork/server-storage/solaris10/solaris-dtracewp-167895.pdf • http://docs.oracle.com/cd/E19253-01/817-6223/ • http://www.tablespace.net/quicksheet/dtrace-quickstart.html • http://www.brendangregg.com/dtrace.html#DTraceToolkit • http://initwithfunk.com/blog/2013/05/31/breaking-bad-with-dtrace/ • http://www.friday.com/bbum/2008/01/26/objective-c-printing-class-name-fromdtrace/ • http://reverse.put.as/wp-content/uploads/2011/06/Debugging-Cocoa-withDTrace.pdf

×