![Page 1: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/1.jpg)
dtraceотладка iOS приложений с помощью dtrace
![Page 2: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/2.jpg)
В двух словах
• вызовы функций
• скрипты
• OS X / iOS Simulator
![Page 3: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/3.jpg)
История
• truss (Unix)
• strace (Linux)
• dtrace (Sun OS, OS X)
![Page 4: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/4.jpg)
Скрипт
<probe description> [/predicate/] { <actions> }
![Page 5: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/5.jpg)
Скрипт
syscall::read:entry /execname == “bash”/ { printf(“bash with pid %d called write\n”,pid); }
Точка трассировки
Дополнительное условие
Действия
![Page 6: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/6.jpg)
Скрипт
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](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/7.jpg)
Точки трассировки
provider:module:function:name
syscall, pid, objc read, write, +alloc
libc++.1.dylib, mach_kernel имя зонда (probe)
![Page 8: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/8.jpg)
Точки трассировки
syscall::read:entryвход в функцию read для
всех процессов
![Page 9: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/9.jpg)
Точки трассировки
syscall::read:returnвыход из read для всех
процессов
![Page 10: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/10.jpg)
Точки трассировки
pid1234::read:выход и выход из read для
процесса с pid: 1234
![Page 11: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/11.jpg)
Точки трассировки
objc123:NSString:-*:entryвход во все методы
NSString для процесса 123
![Page 12: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/12.jpg)
Точки трассировки
syscall::read:entry, syscall::write:entry
Можно указывать несколько через запятую
![Page 13: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/13.jpg)
Точки трассировки
BEGIN END
Специальные точки
![Page 14: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/14.jpg)
Скрипт
syscall::read:entry /execname == “bash”/ { printf(“bash with pid %d called write\n”,pid); }
Дополнительное условие
![Page 15: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/15.jpg)
Предикат
/expression/
![Page 16: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/16.jpg)
Предикат
execname, pid, tid
![Page 17: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/17.jpg)
Предикат
arg0..argX args[0]..args[X]
![Page 18: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/18.jpg)
Предикат
перменные скрипта
![Page 19: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/19.jpg)
Скрипт
syscall::read:entry /execname == “bash”/ { printf(“bash with pid %d called write\n”,pid); }
Действия
![Page 20: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/20.jpg)
Скрипт
• Переменные
• Вызов функций
• Нет циклов и ветвлений
![Page 21: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/21.jpg)
trace
syscall::read:entry{trace(execname)} !CPU ID FUNCTION:NAME 1 155 read:entry Google Chrome H
trace
![Page 22: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/22.jpg)
printf
syscall::read:entry{printf(“arg0: %d”, arg0)} !CPU ID FUNCTION:NAME 0 155 read:entry arg0: 7
printf
![Page 23: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/23.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/24.jpg)
Что можно делать
• Анализ приложений и драйверов с применением сложных фильтров
• Профилирование памяти для конкретных объектов
• Профилирование производительности
![Page 25: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/25.jpg)
DEMO
![Page 26: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/26.jpg)
Что не умеет
• вызывать методы и функции пользовательского кода
• обращаться к мемберам объектов
• выводить NSString
• не работает на девайсе
![Page 27: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/27.jpg)
Указатели
printf(“%d”, copyin(arg0, 4));
указатель на int
копирует во временный буфер
![Page 28: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/28.jpg)
С-strings
printf(“%s”, arg0); !
printf(“%s”, copyinstr(arg0));
указатель на c-string
![Page 29: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/29.jpg)
“Фишки” D• автоматическое объявление переменных
• все массивы – ассоциативные
• proc[execname, tid]++
• аггрегации
• @counts["write system calls"] = count();
![Page 30: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/30.jpg)
Стандартные скрипты
• dtruss – эмуляция truss
• iosnoop, iotop – анализ работы с диском
• execsnoop – запуск новых процессов
• man -k dtrace – полный список
![Page 31: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/31.jpg)
Instruments
![Page 32: «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep](https://reader034.vdocument.in/reader034/viewer/2022052410/54b6aded4a79599f7b8b4594/html5/thumbnails/32.jpg)
Дополнительная информация
• 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