Когато програми, работещи на Linux, искат да използват ресурсите, управлявани от операционната система (четене на файлове, създаване на процеси и т.н.), те извършват системни извиквания към операционната система. Системните извиквания работят на ниво ядро ​​и изпълняват необходимите операции, оставяйки контрола обратно на извикващата програма. Инструментът strace предоставя възможност за проследяване на тези системни повиквания в Linux.

Типично използване на командата strace

За да наблюдавате системните повиквания за приложение, просто извикайте командата с strace в следния формат:

strace ls /tmp

Въпреки това, често има процеси, които започват много по-рано и продължават да работят във фонов режим. Поради някакви проблеми може да искате да съберете допълнителна информация, свързана с такива процеси. Можете да прикачите strace към всяко работещо приложение, като дадете идентификатора на процеса на -стр параметър:

strace -p 2759

Изход:

Следете нишките и разклоненията на приложение

С strace можете да проверите всички нишки и други дъщерни процеси, които са разклонение на приложението, като използвате

instagram viewer
-f флаг.

strace -f -p 2759

Изход:

Проверете определени системни повиквания със strace

Изходът на strace по подразбиране може да бъде доста претъпкан, за да се следва на моменти. Ако искате да проследявате само определени системни повиквания, можете да го направите с параметър:

strace -f -e trace = отваряне, писане, затваряне, свързване,изберете -стр 19770

За да проследите само системни повиквания, свързани с файлови операции, използвайте -e трасиране=файл:

strace -e следа=файл -p 19770

За да филтрирате само свързани с мрежата системни повиквания, укажете -e трасиране=мрежа в командата:

strace -e трасиране=мрежа -p 19770

Получете информация за времето за секунди

Когато извеждате системни повиквания, можете да използвате параметър за получаване на информация за времето с точност в секунди. През повечето време прецизността няма да е достатъчна за вашите нужди. В такива ситуации можете да използвате -tt параметър за получаване на информация за времето с точност до микросекунди:

strace -tt ls /tmp

Събирайте статистически данни за системните повиквания

С -° С параметър, можете да събирате статистически данни за системни повиквания толкова дълго, колкото искате:

strace -f -c -p 19770

Запазване на регистрационните файлове във файл

Ако изпълнявате strace за дълго време и искате да разгледате получените регистрационни файлове по-подробно по-късно, ще трябва да запазите регистрационните файлове. С параметър можете да посочите файла, в който strace трябва да записва логовете:

strace -f -o /tmp/strace.log -e trace=файл ls /tmp

ptrace процес на блокиране

Използвайки системното извикване prctl, всяко приложение под Linux може да попречи да бъде контролирано от не-root потребители, използвайки ptrace. Ако приложението изчисти PR_SET_DUMPABLE флаг за себе си чрез prctl, потребителите, различни от root, няма да могат да контролират това приложение с ptrace, дори ако имат право да сигнализират приложението.

Едно от най-типичните употреби на тази функция се вижда в софтуера на агента за удостоверяване на OpenSSH. По този начин контролът на приложението от друго приложение с ptrace се предотвратява при удостоверяване на потребителя.

ptrace и сигурност

Благодарение на възможността ptrace, зададена в традиционния процесен модел на Linux, всеки софтуер, който стартирате на вашата система с вашия потребител, има право да вмъква злонамерен код в него. От най-простия инструмент xterm до усъвършенствани приложения за уеб браузър, такъв зловреден софтуер може да поеме контрола над всичките ви други работещи приложения — благодарение на системното извикване ptrace — и да копира важна информация, без да забележите.

В отговор на тази ситуация, за която много потребители не са наясно, е разработен защитен механизъм с наречен модул за сигурност Yama в ядрото на Linux.

Можете да контролирате отговора на системното повикване ptrace чрез /proc/sys/kernel/yama/ptrace_scope файл. По подразбиране този файл записва стойност 0.

Следните стойности са приемливи:

Стойност смисъл
0 Конвенционално поведение: Всички приложения, които имат право на ptrace може да се провери.
1 Ограничена ptrace: Само прекият родител на приложението или приложенията за отстраняване на грешки, разрешени от приложението с PR_SET_PTRACER опцията има контрол. По този начин, употребите на gdb име на програма и strace име на програмата ще продължи да работи, но няма да можете да прикачите работещо приложение след това.
2 Ptrace до системния администратор: Само приложения с дефин CAP_SYS_PTRACE свойство или дъщерни процеси, които дефинират PTRACE_TRACEME опция с prctl може да се контролира.
3 Напълно деактивиран: Не ptrace е разрешено при всякакви обстоятелства. Ако това свойство е дефинирано веднъж, не можете да го промените отново по време на изпълнение.

Много разработчици не знаят, че приложенията могат да деактивират ptrace чрез prctl, с изключение на root потребителя. Въпреки че софтуерът, свързан със сигурността, като OpenSSH агента, извършва тези операции, не би било правилно да се очаква същото поведение от целия софтуер, работещ в системата.

Наскоро, някои дистрибуции на Linux са започнали да задават стойността по подразбиране на ptrace_scope файл, описан по-горе, за 1. По този начин, с ограничени операции ptrace, в цялата система се осигурява по-безопасна работна среда.

Използване на примерна линия

Регистрирайте примерното приложение по-долу с името ministrace.c. След това можете да го компилирате със следната команда:

gccминистерствоминистерство.° С

код:

#включи <sys/ptrace.h>
#включи <sys/reg.h>
#включи <sys/wait.h>
#включи <sys/types.h>
#включи <unistd.h>
#включи <stdlib.h>
#включи <stdio.h>
#включи <errno.h>
#включи <низ.ч>
международенчакай_за_системно извикване(pid_t дете)
{
международен статус;
докато (1) {
ptrace (PTRACE_SYSCALL, дете, 0, 0);
waitpid (дете, &състояние, 0);
ако (WIFSTOPPED(статус) && WSTOPSIG(статус) & 0x80)
връщане0;
ако (WIFEXITED(статус))
връщане1;
}
}

международенdo_child(международен argc, char **argv)
{
char *args [argc+1];
memcpy (args, argv, argc * sizeof(char*));
args[argc] = НУЛА;
ptrace (PTRACE_TRACEME);
убиват(getpid(), SIGSTOP);
връщане execvp (args[0], аргументи);
}

международенdo_trace(pid_t дете)
{
международен статус, системно извикване, retval;
waitpid (дете, &състояние, 0);
ptrace (PTRACE_SETOPTIONS, дете, 0, PTRACE_O_TRACESYSGOOD);
докато(1) {
ако (wait_for_syscall (дете) != 0) прекъсване;

syscall = ptrace (PTRACE_PEEKUSER, дете, sizeof(дълго)*ORIG_RAX);
fprintf (stderr, "системно извикване (%d) = ", системно извикване);

ако (wait_for_syscall (дете) != 0) прекъсване;

retval = ptrace (PTRACE_PEEKUSER, дете, sizeof(дълго)*RAX);
fprintf (stderr, "
", retval);
}
връщане0;
}
международенглавен(международен argc, char **argv)
{
ако (argc < 2) {
fprintf (stderr, "Използване: %s prog args
", argv[0]);
изход(1);
}
pid_t дете = вилица ();
ако (дете == 0) {
връщане do_child (argc-1, argv+1);
} друго {
връщане do_trace (дете);
}
}

След компилиране на приложението, можете да стартирате всяка команда с министерство и проверете изхода:

Можете да използвате strace за много цели

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

Тъй като strace директно слуша системни повиквания, той може да разкрие динамиката по време на изпълнение, независимо дали кодът на програмата, която се изпълнява, е отворен/затворен. Възможно е да получите представа защо програмите хвърлят грешка, когато започнат да използват strace.

По подобен начин strace ви помага да разберете защо дадена програма прекратява неочаквано. Следователно познаването на strace е много важно при разработката на ядрото на Linux и системното администриране.

Създайте своя собствена операционна система с Linux от нулата [Linux]

Прочетете Следващото

ДялтуитДялелектронна поща

Свързани теми

  • Linux
  • Linux команди
  • Linux ядро

За автора

Фатих Кючуккаракурт (публикувани 6 статии)

Инженер и разработчик на софтуер, който е фен на математиката и технологиите. Винаги е харесвал компютрите, математиката и физиката. Той е разработил проекти на двигатели за игри, както и машинно обучение, изкуствени невронни мрежи и библиотеки с линейна алгебра. Освен това продължава да работи върху машинно обучение и линейни матрици.

Още от Fatih Küçükkarakurt

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, ревюта, безплатни електронни книги и ексклузивни оферти!

Щракнете тук, за да се абонирате