Как работает «strace»?

2519
n0pe

Недавно я использовал mvдля перемещения большого количества файлов с моего жесткого диска на флэш-диск. Я забыл добавить подробный флаг, поэтому я понятия не имел, «где» было движение и сколько осталось переводов.

Я нашел straceутилиту и решил использовать ее в моем процессе mv. С помощью ps -ef | grep mvя смог найти pid процесса и затем побежал strace -p [PID]. Вот образец того, что я получил:

write(4, "\325\0\0s\1\1\224\0\0\0\0\0109\27\0\0\201\327\0\0\240H:\310xgM\337\274\26\"\273"..., 32768) = 32768 read(3, "\6\3319H\r\207\345\257\301JL)\2601C\t\303\22(\214\353\211\230;{\6\214\355nh@F"..., 32768) = 32768 write(4, "\6\3319H\r\207\345\257\301JL)\2601C\t\303\22(\214\353\211\230;{\6\214\355nh@F"..., 32768) = 32768 read(3, "ZK\301\332\263\214@\177\3352$\374\277];\255\265\364\240d\275\307P\237*\364\23\206\31\306\244\256"..., 32768) = 32768 write(4, "ZK\301\332\263\214@\177\3352$\374\277];\255\265\364\240d\275\307P\237*\364\23\206\31\306\244\256"..., 32768) = 32768 read(3, ".\341\355\32\366\7\365\244\4\4\221) = 0 fcntl(3, F_GETFL) = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW) fcntl(3, F_SETFD, FD_CLOEXEC) = 0 fcntl(3, F_DUPFD, 3) = 4 fcntl(4, F_GETFD) = 0 fcntl(4, F_SETFD, FD_CLOEXEC) = 0 getdents64(3, /* 4 entries */, 32768) = 120 getdents64(3, /* 0 entries */, 32768) = 0 close(3) = 0 newfstatat(4, "The Pick of Destiny",, AT_SYMLINK_NOFOLLOW) = 0 openat(4, "The Pick of Destiny", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3 fcntl(3, F_GETFD) = 0 fcntl(3, F_SETFD, FD_CLOEXEC) = 0 fstat(3, ) = 0 fcntl(3, F_GETFL) = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW) fcntl(3, F_SETFD, FD_CLOEXEC) = 0 fcntl(3, F_DUPFD, 3) = 5 fcntl(5, F_GETFD) = 0 fcntl(5, F_SETFD, FD_CLOEXEC) = 0 getdents64(3, /* 22 entries */, 32768) = 1008 getdents64(3, /* 0 entries */, 32768) = 0 close(3) = 0 

Итак, что именно мне дает Strace? Это вызовы ядра? Если они есть, что они значат (я знаю, что читают и пишут, но что это за цифры)?

Бонусный вопрос: есть ли способ для меня увидеть что-то «более низкое», чем то, что показывает мне полоса? Процессорные звонки, может быть?

2
You might be more interested in output of `lsof -p `, which shows you open files and mappings of a process. jkj 13 лет назад 3
@jkj - спасибо, это круто n0pe 13 лет назад 0

2 ответа на вопрос

4
new123456

Итак, что именно мне дает Strace?

То strace, что вам дают, это системные вызовы - вызовы, которые запрашивают ядро, делают то, что сам процесс не может сделать, например, открывает файлы. (например fcntl, closeи т. д. находятся в вашем следе).

Если они есть, что они значат (я знаю, что читают и пишут, но что это за цифры)?

fcntl (3, F_GETFD) = 0

Переводится в: системный вызов (fcntl) с аргументами (3, F_GETFD), который возвращает значение (0) .

Бонусный вопрос: есть ли способ для меня увидеть что-то «более низкое», чем то, что показывает мне полоса? Процессорные звонки, может быть?

Вы имеете в виду 1) прерывания процессора или 2) инструкции по сборке. Я не знаю, честно, но:

  1. Смотреть на огонь прерываний кажется не очень полезным.
  2. Наблюдение за инструкциями, выполняемыми процессором, кажется немного низким уровнем, и все же не столь полезным. Честно говоря, если бы я этого хотел, я бы просто запустил свою программу в очень медленном эмуляторе, который позволяет мне смотреть, какая сборка интерпретируется.

strace есть справочная страница - я предлагаю вам прочитать ее, если вы хотите узнать подробности о ее работе.

2
Drav Sloan

Вы в значительной степени поняли ответ прямо в своем первоначальном вопросе.

Поведение по умолчанию straceсостоит в том, чтобы сообщать, какие системные вызовы выполняются для этого процесса, он также сообщает о вызовах и обработчике этого сигнала.

В вашем примере вызываемые системные вызовы находятся в начале строки: fcntl()и getdents64() close()т. Д.

Показаны аргументы, которые были переданы этим системным вызовам - часто усеченные, так как необработанные данные могут иметь размер fstat(3, ) в ...килобайтах ( мегабайтах / гигабайтах) ( жертвует усечение). То, что представляют эти значения, варьируется от системного вызова к системному вызову, но man покажет, что они представляют (при условии, что у вас есть базовый набор страниц руководства, связанных с вызовами sys, установленными в вашей системе). man 2 fstatпокажет страницу руководства программиста для fstat и детализирует аргументы.

И результат этого системного вызова getdents64(3, /* 22 entries */, 32768) = 1008 1008в этом случае. Значение этого результирующего кода будет задокументировано на странице man (1) конкретного системного вызова, вызываемого таким же образом, как подробно аргументы. Обратите внимание, что в этом случае /* 22 entries */это другая операция усечения по strace, которая может быть расширена с помощью -e abbr=none.

Обратите внимание, что straceэто не универсальная команда, некоторые выпуски Unix используют truss, ktraceи dumpвыполнять аналогичную отладку в процессе. Вы также должны взглянуть на справочную страницу для strace, она поставляется с некоторыми расширенными опциями (возможно, это приближает ваш бонусный вопрос ), такими как -i(печать указателя инструкции) -v(многословие) -a(изменение местоположения - столбца - части результата чтобы увидеть больше аргументов, передаваемых команде) и фильтрацию выражений -e.

Редактировать добавил некоторые заметки о усечении аргумента других форм.

Похожие вопросы