2

Недавно я использовал 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{c,$\246]\204\342\261\"\374K\234\264\17\26\346\246\327\347m"..., 32768) = 32768

а потом некоторые:

fcntl(3, F_GETFD)                       = 0
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 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", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 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, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 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 ответа2

4

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

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

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

fcntl(3, F_GETFD) = 0

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

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

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

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

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

2

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

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

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

Отображаются аргументы, которые были переданы этим системным вызовам - часто усеченные, поскольку необработанные данные могут иметь размер в килобайтах / мега / гигабайтах ) fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) (... дарит усечение). То, что представляют эти значения, варьируется от системного вызова к системному вызову, но 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 .

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .