32
dtrace отладка iOS приложений с помощью dtrace

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

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

В двух словах

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

• скрипты

• OS X / iOS Simulator

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

История

• truss (Unix)

• strace (Linux)

• dtrace (Sun OS, OS X)

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

Скрипт

<probe description> [/predicate/] {      <actions> } 

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

Скрипт

syscall::read:entry /execname == “bash”/ {      printf(“bash with pid %d called write\n”,pid); } 

Точка трассировки

Дополнительное условие

Действия

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

Скрипт

CPU ID FUNCTION:NAME 0 155 read:entry bash with pid 2958 called write 0 155 read:entry bash with pid 444 called write 1 155 read:entry bash with pid 448 called write 1 155 read:entry bash with pid 448 called write

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

Точки трассировки

provider:module:function:name

syscall, pid, objc read, write, +alloc

libc++.1.dylib, mach_kernel имя зонда (probe)

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

Точки трассировки

syscall::read:entryвход в функцию read для

всех процессов

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

Точки трассировки

syscall::read:returnвыход из read для всех

процессов

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

Точки трассировки

pid1234::read:выход и выход из read для

процесса с pid: 1234

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

Точки трассировки

objc123:NSString:-*:entryвход во все методы

NSString для процесса 123

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

Точки трассировки

syscall::read:entry, syscall::write:entry

Можно указывать несколько через запятую

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

Точки трассировки

BEGIN END

Специальные точки

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

Скрипт

syscall::read:entry /execname == “bash”/ {      printf(“bash with pid %d called write\n”,pid); } 

Дополнительное условие

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

Предикат

/expression/

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

Предикат

execname, pid, tid

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

Предикат

arg0..argX args[0]..args[X]

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

Предикат

перменные скрипта

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

Скрипт

syscall::read:entry /execname == “bash”/ {      printf(“bash with pid %d called write\n”,pid); } 

Действия

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

Скрипт

• Переменные

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

• Нет циклов и ветвлений

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

trace

syscall::read:entry{trace(execname)} !CPU ID FUNCTION:NAME 1 155 read:entry Google Chrome H

trace

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

printf

syscall::read:entry{printf(“arg0: %d”, arg0)} !CPU ID FUNCTION:NAME 0 155 read:entry arg0: 7

printf

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

ustacksyscall::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

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

Что можно делать

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

• Профилирование памяти для конкретных объектов

• Профилирование производительности

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

DEMO

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

Что не умеет

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

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

• выводить NSString

• не работает на девайсе

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

Указатели

printf(“%d”, copyin(arg0, 4));

указатель на int

копирует во временный буфер

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

С-strings

printf(“%s”, arg0); !

printf(“%s”, copyinstr(arg0));

указатель на c-string

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

“Фишки” D• автоматическое объявление переменных

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

• proc[execname, tid]++

• аггрегации

• @counts["write system calls"] = count();

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

Стандартные скрипты

• dtruss – эмуляция truss

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

• execsnoop – запуск новых процессов

• man -k dtrace – полный список

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

Instruments

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

Дополнительная информация

• man dtrace

• http://www.oracle.com/technetwork/server-storage/solaris10/solaris-dtrace-wp-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-from-dtrace/

• http://reverse.put.as/wp-content/uploads/2011/06/Debugging-Cocoa-with-DTrace.pdf