strace: Как убедиться, что системный вызов вызвал другой системный вызов? - PullRequest
1 голос
/ 17 марта 2011

"strace - это трассировщик системных вызовов, то есть инструмент отладки, который распечатывает трассировку всех системных вызовов, выполненных другим процессом / программой."Что, если системные вызовы работают рекурсивно или один системный вызов вызывает другой системный вызов.Как я могу получить эту информацию?

Возможное решение - Мы можем создать простой переменный отступ, который мы увеличиваем при вводе системного вызова и уменьшаем при выходе.Теперь просто напечатайте «отступ» количество пробелов перед каждым вызовом.Таким образом, мы можем получить что-то вроде этого -

05:31:09.449402 getpriority(PRIO_PROCESS, 0) = 20
05:31:09.450514 ioctl(7, 0xc0186201, 0xbef86ac0) = 0
05:31:09.451817  ioctl(7, 0xc0186201, 0xbef86c10) = 0
05:31:09.524328 writev(4, [{"\4", 1}, {"ServiceManager\0", 15}, {"ServiceManager: addService(SMS, 0x15988)\n\0", 42}], 3) = 58
05:31:09.526862  futex(0x134ac, FUTEX_WAKE, 2147483647) = 0
05:31:09.527847   getpriority(PRIO_PROCESS, 0) = 20
05:31:09.528758 ioctl(7, 0xc0186201, 0xbef86ac0) = 0
05:31:09.529847 ioctl(7, 0xc0186201, 0xbef86c10) = 0

Имеет ли Strace или какой-либо другой инструмент эту функцию, или мне нужно изменить исходный код для достижения этой цели?

Ответы [ 2 ]

6 голосов
/ 17 марта 2011

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

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

0 голосов
/ 24 ноября 2015

Если у вас есть root-доступ, вы можете использовать ftrace для отслеживания вызовов функций ядра и фильтрации по именам интерфейсов syscall на стороне ядра. Используйте function_graph в качестве трассера (см. https://lwn.net/Articles/366796/ для объяснения). Поскольку «оригинальный системный вызов» также проходил через такой вызов, вы бы четко видели вызов после системного вызова в вызове после системного вызова. Справедливое предупреждение: я не уверен, насколько часто этот сценарий.

...