自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用 strace 命令了解 Linux 系統(tǒng)調(diào)用

系統(tǒng)
桌面上運(yùn)行的每個(gè)進(jìn)程都使用系統(tǒng)調(diào)用與操作系統(tǒng)通信。 使用 strace,您可以輕松跟蹤此類系統(tǒng)調(diào)用。

桌面上運(yùn)行的每個(gè)進(jìn)程都使用系統(tǒng)調(diào)用與操作系統(tǒng)通信。 使用 strace,您可以輕松跟蹤此類系統(tǒng)調(diào)用。

當(dāng)在 Linux 上運(yùn)行的程序想要使用操作系統(tǒng)管理的資源(讀取文件、創(chuàng)建進(jìn)程等)時(shí),它們會(huì)對操作系統(tǒng)進(jìn)行系統(tǒng)調(diào)用。 系統(tǒng)調(diào)用在內(nèi)核級別工作并執(zhí)行必要的操作,將控制權(quán)留回調(diào)用程序。strace 工具提供了在 Linux 上跟蹤這些系統(tǒng)調(diào)用的功能。

strace 命令的典型用法

要監(jiān)視應(yīng)用程序的系統(tǒng)調(diào)用,只需使用以下格式使用 strace 調(diào)用命令:

┌──(linuxmi?linuxmi)-[~/www.linuxmi.com]
└─$ strace ls /tmp

但是,通常有些進(jìn)程開始得更早,并繼續(xù)在后臺工作。由于任何問題,您可能希望收集與此類進(jìn)程關(guān)聯(lián)的其他信息。通過將進(jìn)程的進(jìn)程 ID 提供給 -p 參數(shù),可以將 strace 附加到任何正在運(yùn)行的應(yīng)用程序:

┌──(linuxmi?linuxmi)-[~/www.linuxmi.com]
└─$ strace -p 5007

輸出:

跟蹤應(yīng)用程序的線程和分支

使用 strace,您可以使用 -f 標(biāo)志檢查作為應(yīng)用程序分支的所有線程和其他子進(jìn)程。

┌──(linuxmi?linuxmi)-[~/www.linuxmi.com]
└─$ strace -f -p 5007

輸出:

使用 strace 檢查某些系統(tǒng)調(diào)用

默認(rèn)的 strace 輸出有時(shí)可能非常擁擠。如果只想跟蹤某些系統(tǒng)調(diào)用,可以使用 -e 參數(shù)執(zhí)行此操作:

strace -f -e trace=open,write,close,connect,select -p 26757

要僅跟蹤與文件操作相關(guān)的系統(tǒng)調(diào)用,請使用 -e trace=file:

strace -e trace=file -p 26757

要僅過濾與網(wǎng)絡(luò)相關(guān)的系統(tǒng)調(diào)用,請?jiān)诿钪兄付?nbsp;-e trace=network:

strace -e trace=network -p 26757

以微秒為單位獲取精確時(shí)間信息

輸出系統(tǒng)調(diào)用時(shí),可以使用 -t 參數(shù)獲取以秒為單位的精確時(shí)間信息。大多數(shù)情況下,精度不足以滿足您的需求。在這種情況下,可以使用 -tt 參數(shù)以微秒精度獲取時(shí)間信息:

┌──(linuxmi?linuxmi)-[~/www.linuxmi.com]
└─$ strace -tt ls /tmp

收集有關(guān)系統(tǒng)調(diào)用的統(tǒng)計(jì)信息

使用 -c 參數(shù),您可以根據(jù)需要收集有關(guān)系統(tǒng)調(diào)用的統(tǒng)計(jì)信息:

┌──(linuxmi?linuxmi)-[~/www.linuxmi.com]
└─$ strace -f -c -p 26757

將日志保存到文件

如果長時(shí)間運(yùn)行 strace,并希望稍后更詳細(xì)地檢查生成的日志,則需要保存日志。使用 -o 參數(shù),您可以指定 strace 應(yīng)在其中保存日志的文件:

┌──(linuxmi?linuxmi)-[~/www.linuxmi.com]
└─$ strace -f -o /tmp/strace.log -e trace=file ls /tmp

跟蹤阻塞過程

使用 prctl 系統(tǒng)調(diào)用,Linux下的任何應(yīng)用程序都可以防止自己被使用 ptrace 的非 root 用戶控制。如果應(yīng)用程序通過 prctl 為自己清除 PR_SET_DUMPABLE 標(biāo)志,則 root 以外的用戶將無法使用 ptrace 控制此應(yīng)用程序,即使他們有權(quán)向應(yīng)用程序發(fā)出信號。

此功能最典型的用途之一是在 OpenSSH 身份驗(yàn)證代理軟件中看到的。因此,在用戶身份驗(yàn)證時(shí),可以防止另一個(gè)應(yīng)用程序使用 ptrace 控制應(yīng)用程序。

跟蹤和安全

由于在傳統(tǒng)的 Linux 進(jìn)程模型中設(shè)置了 ptrace 工具,因此您與用戶一起在系統(tǒng)上運(yùn)行的任何軟件都有權(quán)在其中插入惡意代碼。從最簡單的 xterm 工具到高級 Web 瀏覽器應(yīng)用程序,此類惡意軟件可以控制所有其他正在運(yùn)行的應(yīng)用程序(這要?dú)w功于 ptrace 系統(tǒng)調(diào)用),并在您不知不覺中復(fù)制重要信息。

為了應(yīng)對許多用戶不知道的這種情況,已經(jīng)使用Linux內(nèi)核中名為Yama的安全模塊開發(fā)了一種保護(hù)機(jī)制。

您可以通過 /proc/sys/kernel/yama/ptrace_scope 文件控制對 ptrace 系統(tǒng)調(diào)用的響應(yīng)。默認(rèn)情況下,此文件寫入的值為 0。

以下值是可以接受的:


含義

0

常規(guī)行為:可以檢查所有有權(quán)跟蹤的應(yīng)用程序。

1

受限跟蹤:只有應(yīng)用程序的直接父級或具有 PR_SET_PTRACER 選項(xiàng)的應(yīng)用程序允許的調(diào)試應(yīng)用程序才具有控制權(quán)。因此,gdb program_name 和 strace program_name 的使用將繼續(xù)有效,但之后您將無法附加正在運(yùn)行的應(yīng)用程序。

2

跟蹤到系統(tǒng)管理員:只能控制具有已定義CAP_SYS_PTRACE屬性的應(yīng)用程序或使用 prctl 定義PTRACE_TRACEME選項(xiàng)的子進(jìn)程。

3

完全禁用:在任何情況下都不允許跟蹤。如果此屬性定義一次,則無法在運(yùn)行時(shí)再次更改它。

許多開發(fā)人員不知道應(yīng)用程序可以通過 prctl 禁用 ptrace,除了 root 用戶。盡管與安全相關(guān)的軟件(如 OpenSSH 代理)執(zhí)行這些操作,但期望系統(tǒng)上運(yùn)行的所有軟件都具有相同的行為是不對的。

最近,一些 Linux 發(fā)行版開始將上述 ptrace_scope 文件的默認(rèn)值設(shè)置為 1。因此,在限制 ptrace 操作的情況下,整個(gè)系統(tǒng)提供了更安全的工作環(huán)境。

使用示例跟蹤

使用名稱 ministrace.c 注冊下面的示例應(yīng)用程序。然后你可以用以下命令編譯它:

┌──(linuxmi?linuxmi)-[~/www.linuxmi.com]
└─$ gcc -o ministrace ministrace.c

┌──(linuxmi?linuxmi)-[~/www.linuxmi.com]
└─$ ./ministrace date

代碼:

#include <sys/ptrace.h>
#include <sys/reg.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

int wait_for_syscall (pid_t child)
{
int status;
while (1) {
ptrace(PTRACE_SYSCALL, child, 0, 0);
waitpid(child, &status, 0);
if (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80)
return 0;
if (WIFEXITED(status))
return 1;
}
}

int do_child (int argc, char **argv)
{
char *args [argc+1];
memcpy(args, argv, argc * sizeof(char*));
args[argc] = NULL;
ptrace(PTRACE_TRACEME);
kill(getpid(), SIGSTOP);
return execvp(args[0], args);
}

int do_trace (pid_t child)
{
int status, syscall, retval;
waitpid(child, &status, 0);
ptrace(PTRACE_SETOPTIONS, child, 0, PTRACE_O_TRACESYSGOOD);
while(1) {
if (wait_for_syscall(child) != 0) break;

syscall = ptrace(PTRACE_PEEKUSER, child, sizeof(long)*ORIG_RAX);
fprintf(stderr, "syscall(%d) = ", syscall);

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

retval = ptrace(PTRACE_PEEKUSER, child, sizeof(long)*RAX);
fprintf(stderr, "%d\n", retval);
}
return 0;
}

int main (int argc, char **argv)
{
if (argc < 2) {
fprintf(stderr, "Usage: %s prog args\n", argv[0]);
exit(1);
}
pid_t child = fork();
if (child == 0) {
return do_child(argc-1, argv+1);
} else {
return do_trace(child);
}
}

編譯應(yīng)用程序后,您可以使用 ministrace 運(yùn)行任何命令并檢查輸出:

您可以將 strace 用于多種目的

Strace 可以幫助查找不必要地使用系統(tǒng)資源的程序中的錯(cuò)誤。同樣,程序在使用操作系統(tǒng)資源時(shí)表現(xiàn)出的特征也可以通過 strace 顯示出來。

由于 strace 直接偵聽系統(tǒng)調(diào)用,因此無論正在運(yùn)行的程序的代碼是打開還是關(guān)閉,它都可以揭示運(yùn)行時(shí)動(dòng)態(tài)??梢粤私鉃槭裁闯绦蛟谑褂?strace 啟動(dòng)時(shí)會(huì)拋出錯(cuò)誤。

同樣,strace 可幫助您了解程序意外終止的原因。因此,熟悉 strace 在 Linux 內(nèi)核開發(fā)和系統(tǒng)管理中非常重要。

責(zé)任編輯:趙寧寧 來源: Linux迷
相關(guān)推薦

2024-12-12 09:40:27

Strace命令監(jiān)控

2019-11-07 15:02:00

Linuxstrace系統(tǒng)調(diào)用

2009-12-25 10:52:50

Linux監(jiān)管命令

2023-12-27 14:08:00

LinuxTop命令工具

2010-01-07 13:53:43

Linux入門

2010-01-07 13:59:11

Linux入門命令

2015-09-21 11:28:57

使用Linux系統(tǒng)

2009-12-23 17:50:07

Linux網(wǎng)絡(luò)命令

2010-03-03 09:43:34

Linux軟件包

2020-01-03 14:16:20

Windows軟件編程語言

2018-08-23 10:18:02

PtraceLinux系統(tǒng)調(diào)用

2010-12-22 10:26:41

straceLinux服務(wù)器

2009-03-10 19:19:16

Linux日志文件系統(tǒng)安裝使用

2017-12-19 11:00:54

Linux系統(tǒng)日志

2010-06-24 11:05:41

Linux cal

2011-03-04 10:04:31

Linux文件操作命令

2019-10-23 11:24:44

LinuxLinux目錄Linux系統(tǒng)

2009-12-24 17:12:30

2019-09-29 16:42:35

straceEmacsLinux

2009-08-03 12:02:13

linux at命令linux at命令詳使用案例
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號