Как использовать программный способ для перехвата системных вызовов, вызванных в запущенном процессе на Linux? - PullRequest
0 голосов
/ 28 июля 2011
  1. Как это сделать внешним процессом? Скажем, процесс A хочет знать, какие системные вызовы в процессе B? как Strace?
  2. Как распечатать системные вызовы, вызванные в самом процессе? как зарегистрировать какое-нибудь событие?

спасибо!

Ответы [ 2 ]

1 голос
/ 28 июля 2011
  1. Проверьте идентификатор процесса с помощью ps или чего-либо еще. Затем запустите "strace -p pidnumber".

  2. Вы можете проверить, как работает strace, доступен ли исходный код или просто вызвать strace из вашей программы ...

0 голосов
/ 28 июля 2011

Если речь идет только о конкретном системном вызове (не обо всех), вы можете переписать функцию-заглушку C и поместить ее в общую библиотеку и предварительно загрузить библиотеку перед выполнением целевого приложения, установив LD_PRELOAD.

Это приводит к тому, что ваша функция предпочтительнее функции, предоставляемой библиотекой C, когда динамический компоновщик разрешает вызовы функций.

Это работает только для динамически связанных приложений (почти всех), и вы должны быть двоично совместимы с используемой библиотекой C. Поскольку практически любой Linux использует glibc, а различные версии glibc совместимы с двоичными файлами, это не должно быть проблемой.

Вы можете посмотреть на fakeroot (как пример), как это сделать.

Добавить: Вместо повторной реализации всей оболочки системного вызова, вы также можете перенаправить вызов фактической реализации в библиотеку C. Я предполагаю, что вам нужно вручную загрузить библиотеку и разрешить адрес (не уверен насчет этого, но в противном случае вы, вероятно, в конечном итоге позвоните себе).

...