Еквівалент "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систему, він буде негайно зупинений (і я можу відновити його пізніше за моїм зручністю)

У деяких випадках я міг би скористатися gdbфункцією 's catch syscall, але я шукав рішення, яке зручно слідкувати за вилами та продовжувати робити це для всіх роздрібнених процесів і продовжувати робити це навіть після execves.

Здається, я згадую якусь утиліту, яка дає однакові функціональні можливості, навіть одну (або параметри тієї самої утиліти) одношаговим програмам між деякими появами деякого syscall віддалено, як це, але пам'ять мені не вдається, я навіть не можу бути впевнений що було в Linux.


1
Насправді не відповідь на ваше запитання, але gdb має деякі варіанти для наступних вилок, він просто не відключає execve. Це все ще робить лише один процес за один раз, який, мабуть, є авторитетом укладення угод, якщо ви шукаєте функціональність, схожу на страйк, але я подумала, що це згадаю про всяк випадок.
Братчлі

@JoelDavis, спасибі І, схоже, це може також слідувати після exec, ( follow-exec-mode), я експериментую з цим. Це не відповідає строго на питання, але може бути досить гарним для того, що мені потрібно.
Стефан Шазелас

Якщо я розумію ваше запитання, ви шукаєте спосіб простежити, поки не буде показаний конкретний сигнал, а потім припиніть відстежувати, а не зупиняти і не вбивати додаток, який ви шукаєте, будь-яким чином, правда?
slm

@slm, ні, я хочу, щоб процес, розпочатий відстежуваною програмою, був зупинений (як би вбитий SIGSTOP), як тільки він робить заданий системний виклик. Я додав посилання на сторінку Solaris truss.
Стефан Шазелас

Дозвольте переконатися, що я правильно розумію. Ви хочете, щоб зупинити процес, коли він робить певний системний виклик. Це правильно?
sparticvs

Відповіді:


3

Наскільки мені відомо, це неможливо зробити strace, ptraceфункція, яка використовується внутрішньо, SIGSTOPабо SIGINTпід час дзвінків.

Редагувати:

Я вставив це просте рішення в ministrece , тому кодування не потрібно.

Моє запропоноване рішення, якщо потрібна не вся функціональність страйсу, було б змінити міністерство - яке я знайшов тут Напишіть собі штрих у 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);

Я нічого з цього не дражнив, ці завершальні кроки залишаються вам.


Дякую. Це працює, і це посилання дуже корисне. Однак (зрозуміло в кількох рядках коду), він не робить аргументацію аргументації, яку роблять gdb / strace, тому не був би корисним для моєї мети. Це показує, що це легко зробити. Зрештою, я пішов на gdb, але, схоже, виправлення страз для цієї функції було б відносно просто. Залишаючи питання відкритим, тому що я підозрюю, що існує така команда зробити це. Я подивлюсь на python-ptrace, коли знайду час.
Стефан Шазелас

Ласкаво просимо! Я трохи розчулився в розширенні реалізації, тому можна було б посилати syscall за id та ім’ям. Знову було весело грати з ptrace.
Daniël W. Crompton

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.