Sponsored LinksКатегорииLinksUnix Tutorial
Personal Development Ruslan Valiev Solaris Performance Team Damien Farnham Fintan Ryan Nicky Veitch Niall Mullen Sean McGrath DTrace Bryan Cantrill Brendan Gregg ZFS Tim Foster General Ben Rockwood Learning Solaris 10 Privacy policy |
Friday, 26 November. 2004Пробы в DTrace - продолжение
Процесс написания скрипта на языке DTrace - D - очень прост. После того, как вы выяснили, за чем вы хотели бы проследить в системе, нужно просто указать эти критерии в виде простейших фильтров проб, и подсказать, что делать DTrace, когда в процессе отладки попадается что-то удовлетворяющее критериям этих фильтров.
Начнём с простейшего: в DTrace есть две пробы, которые очень легко запомнить. В то же время, они бывают очень полезными при написании сложных d-скриптов. Называются эти пробы BEGIN и END, и исполняются они, как видно из названия, перед началом отладки и по её завершению. Как видно из примера ниже, синтаксис у языка D прост, понятен и многим знаком по другим языкам программирования: CODE: BEGIN { printf("Hello, world"); exit(0); } END { printf("The End"); } Если сохранить этот текст в файл, то позже его можно скормить команде dtrace в помощью ключика -s: dtrace -s ./try.d А результатом выполнения такой команды будет следующее: CODE: dtrace: script './try.d' matched 2 probes CPU ID FUNCTION:NAME 0 1 :BEGIN Hello, world 0 2 :END The End Первое поле - CPU - указывает процессор, на котором сработала та или иная проба DTrace. В данном случае мы пытались поймать встроенные пробы BEGIN и END, и потому они поймались на том же процессоре, который исполнял команду dtrace - 0. Поле ID - это числовой код проб BEGIN и END, и если вернуться к предыдущей записи в блоге - Пробы в DTrace, то в таблице всех проб, доступных для использования, первыми стоят именно пробы BEGIN и END, под номерами 1 и 2. Ну и последнее поле выводит имя той пробы, которая сработала. И если в теле процедуры обработки пробы есть какие-то операции, они будут выполнены. В нашем случае там стоят printf'ы, которые и выводят сообщения Hello, world и The End. С такой же лёгкостью можно ловить какие угодно пробы! Например, следующий пример будет ловить всё новые случаи выполнения системного вызова write и указывать, какой процесс его запросил - pid и execname это встроенные переменные DTrace, я позже расскажу о них подробнее. Итак, наш новый скрипт try.d, я для удобства не стал убирать из него BEGIN и END, чтобы была возможность сравнить и убедиться, что добавление любой другой пробы ничуть не сложнее. Как я уже говорил, можно отследить моменты входа и выхода из системного вызова - я в этом примере слежу за точками входа (entry): CODE: BEGIN { printf("Hello, world"); } syscall::write:entry { printf("pid: %d, execname: %s", pid, execname); } END { printf("This is the end."); } Результатом будет бесконечная таблица, похожая на приведённую ниже. Вам следует нажать Ctrl+C чтобы прервать трассировку. CODE: dtrace: script './try.d' matched 3 probes CPU ID FUNCTION:NAME 1 1 :BEGIN Hello, world 0 12 write:entry pid: 21053, execname: dtrace 0 12 write:entry pid: 20598, execname: rxvt 0 12 write:entry pid: 20595, execname: mozilla-bin 0 12 write:entry pid: 20595, execname: mozilla-bin 0 12 write:entry pid: 20475, execname: icewm 0 12 write:entry pid: 20475, execname: icewm 0 12 write:entry pid: 20595, execname: mozilla-bin 0 12 write:entry pid: 20595, execname: mozilla-bin 0 12 write:entry pid: 20595, execname: mozilla-bin 0 12 write:entry pid: 20595, execname: mozilla-bin 0 12 write:entry pid: 20475, execname: icewm 0 12 write:entry pid: 20475, execname: icewm 0 12 write:entry pid: 20595, execname: mozilla-bin 0 12 write:entry pid: 20595, execname: mozilla-bin 1 2 :END This is the end. Видите, как просто и понятно получается отлаживать работающую систему? Сразу становится видно, что за эти несколько секунд, что я ждал, к системному вызову write прибегли: собственно dtrace (потому что вывод данных производил), rxvt (терминал), mozilla-bin (браузер, естессно) и icewm - мой оконный менеджер. С таким же успехом можно вместо syscall::write:entry указать любую другую маску для проб DTrace. Вот лишь несколько вариантов: syscall::write:return - отслеживать лишь выходы из вызовов write syscall::write: - отслеживать и входы, и выходы из вызовов write syscall::: - отслеживать входы и выходы всех системных вызовов Defined tags for this entry: dtrace Обратные ссылки
URI этой записи для создания обратных ссылок (trackback)
Нет обратных ссылок
|




