Эквивалент «truss -T» и «truss -U» в Linux?

12

Есть ли эквивалент того, что делает -Tи -Uвариант trussутилиты Solaris в Linux.

Они должны указывать системный вызов ( -T) или библиотечную функцию ( -U), которая при вызове отслеживаемым приложением приведет к его остановке.

Или, в противном случае, я бы хотел, чтобы любой процесс, запущенный отслеживаемым приложением, был остановлен (как если бы он был уничтожен SIGSTOP), как только он выполняет заданный системный вызов или заданный вызов функции совместно используемой библиотеки.

straceи ltraceв Linux предоставляют большую часть возможностей Solaris truss, но, похоже, они этого не делают.

Например:

truss -f -T open cmd

Было бы похоже, strace -f cmdза исключением того, что если выполняющийся процесс cmdили какой-либо из его потомков выполняет какой-либо openсистемный вызов, он будет немедленно остановлен (и я могу возобновить его позже, когда мне будет удобно)

В некоторых случаях я мог использовать gdbs catch syscall, но я искал решение, которое могло бы удобно следовать за вилками и продолжать делать это для всех разветвленных процессов и продолжать делать это даже после execves.

Кажется, я вспоминаю какую-то утилиту, предоставляющую такую ​​же функциональность, даже одну (или опции для той же утилиты), для одношаговых приложений между некоторыми вхождениями некоторого системного вызова, как это удаленно, но моя память подводит меня, я даже не могу быть уверен, это было в Linux.

Стефан Шазелас
источник
1
На самом деле это не ответ на ваш вопрос, но у GDB есть несколько вариантов следования за форками, просто он не отключает execve. Тем не менее, он по-прежнему выполняет только один процесс за раз, что, вероятно, мешает работе, если вы ищете функциональность, похожую на strace, но я подумал, что упомяну об этом на всякий случай.
Братчли
@JoelDavis, спасибо. И, похоже, это может последовать и после exec, ( follow-exec-mode), я экспериментирую с этим. Строго не отвечает на вопрос, но может быть достаточно для того, что мне нужно.
Стефан Шазелас
Если я понимаю ваш вопрос, вы ищете способ отследить, пока не появится определенный сигнал, а затем прекратить трассировку, а не останавливать или уничтожать приложение, которое вы отслеживаете каким-либо образом, верно?
SLM
@slm, нет, я хочу, чтобы процесс, запущенный отслеживаемым приложением, был остановлен (как если бы он был уничтожен SIGSTOP), как только он выполнит заданный системный вызов. Я добавил ссылку на страницу руководства Solaris truss.
Стефан Шазелас
Позвольте мне убедиться, что я правильно понимаю. Вам нужен способ остановить процесс, когда он делает определенный системный вызов. Это верно?
sparticvs

Ответы:

3

Насколько мне известно, это не может быть сделано с straceпомощью ptraceфункции, которая используется для внутренних целей SIGSTOPили SIGINTпо вызовам.

РЕДАКТИРОВАТЬ:

Я вставил это простое решение в Ministrace , поэтому кодирование не требуется.

Мое предлагаемое решение, если требуется не вся функциональность strace, было бы изменить ministrace - что я нашел здесь. Напишите себе strace из 70 строк кода .

В одной программе вы можете добавить две строки перед следующим кодом:

if (wait_for_syscall(child) != 0) break;

Псевдокод:

if(syscall == SYS_write)
    do {
        char str[4];
        gets(str);  // waits until enter to continue    
    } while(0);

Я не говорил ничего из этого, эти последние шаги оставлены вам.

Даниэль В. Кромптон
источник
Благодарю. Это работает, и эта ссылка очень полезна. Однако (по понятным причинам в нескольких строках кода) он не выполняет декодирование arg, как это делает gdb / strace, поэтому не пригодился бы для моей цели. Это показывает, что это легко сделать. В конце концов я выбрал GDB, но похоже, что исправление strace для этой функции будет относительно простым. Оставляя вопрос открытым, я подозреваю, что для этого существует существующая команда. Я посмотрю на python-ptrace, когда у меня будет время.
Стефан Шазелас
Пожалуйста! Я немного увлекся расширением реализации, поэтому можно было ссылаться на системный вызов по id и по имени. Было весело снова играть с ptrace.
Даниэль В. Кромптон