| STRACE(1) | General Commands Manual | STRACE(1) |
نام (NAME)
strace - ردیابی فراخوانهای سیستمی و سیگنالها
خلاصه دستور (SYNOPSIS)
strace |
[-ACdffhikqqrtttTvVwxxyyYzZ] [-a column] [-b execve] [-e expr]... [-I n] [-o file] [-O overhead] [-p pid]... [-P path]... [-s strsize] [-S sortby] [-U columns] [-X format] [--seccomp-bpf] [--stack-trace-frame-limit=limit] [--syscall-limit=limit] [--tips[=format]] { -p pid | [-DDD] [-E var[=val]]... [-u username] command [args] } |
strace |
-c [-dfwzZ] [-b execve] [-e expr]... [-I n] [-O overhead] [-p pid]... [-P path]... [-S sortby] [-U columns] [--seccomp-bpf] [--syscall-limit=limit] [--tips[=format]] { -p pid | [-DDD] [-E var[=val]]... [-u username] command [args] } |
strace |
--tips[=format] |
در سادهترین حالت استفاده، strace دستور command مشخصشده را تا زمان پایان یافتن آن اجرا میکند. این ابزار فراخوانیهای سیستمی انجامشده توسط یک فرایند و سیگنالهای دریافتشده توسط آن را رهگیری و ثبت مینماید. نام هر فراخوانی سیستم، آرگومانهای آن، و مقدار بازگشتی آن در خروجی خطای استاندارد یا در فایلی که با گزینهٔ -o مشخص شده است، چاپ میشوند.
strace یک ابزار تشخیصی، آموزشی، و اشکالزدایی سودمند است. مدیران سیستم، کارشناسان عیبیابی و بررسی مشکلات، آن را برای حل مسائل برنامههایی که کد منبع آنها بهراحتی در دسترس نیست، بسیار ارزشمند خواهند یافت؛ زیرا برای ردگیری نیازی به کامپایل مجدد نیست. دانشجویان، هکرها، و افراد کنجکاو متوجه خواهند شد که با ردگیری حتی برنامههای معمولی نیز میتوان نکات بسیار زیادی دربارهٔ یک سیستم و فراخوانیهای سیستمی آن آموخت. برنامهنویسان درخواهند یافت از آنجا که فراخوانیهای سیستمی و سیگنالها در مرز رابط کاربر/هسته رخ میدهند، بررسی دقیق این مرز برای جداسازی باگها، بررسی سلامت (sanity checking)، و تلاش برای به دام انداختن شرایط رقابتی (race conditions) بسیار مفید است.
هر خط در گزارش ردگیری شامل نام فراخوانی سیستم است که با آرگومانهای آن درون پرانتز و مقدار بازگشتی آن دنبال میشود. نمونهای از ردگیری دستور «cat /dev/null»:
open("/dev/null", O_RDONLY) = 3
خطاها، که معمولاً با مقدار بازگشتی -1 مشخص میشوند، نماد errno و رشتهٔ خطای مربوطه را در انتهای خود دارند.
open("/foo/bar", O_RDONLY) = -1 ENOENT (No such file or directory)
سیگنالها بهصورت نماد سیگنال و یک ساختار siginfo رمزگشاییشده چاپ میشوند. بریدهای از ردگیری و متوقف کردن دستور «sleep 666»:
sigsuspend([] <unfinished ...> --- SIGINT {si_signo=SIGINT, si_code=SI_USER, si_pid=...} --- +++ killed by SIGINT +++
اگر یک فراخوانی سیستم در حال اجرا باشد در حالی که فراخوانی دیگری از یک نخ یا فرایند متفاوت فراخوانده شود، strace تلاش خواهد کرد تا ترتیب این رویدادها را حفظ کرده و فراخوانی جاری را با عنوان unfinished مشخص کند. هنگامی که فراخوانی بازمیگردد، با عنوان resumed علامتگذاری خواهد شد.
[pid 28772] select(4, [3], NULL, NULL, NULL <unfinished ...> [pid 28779] clock_gettime(CLOCK_REALTIME, {tv_sec=1130322148, tv_nsec=3977000}) = 0 [pid 28772] <... select resumed> ) = 1 (in [3])
قطع شدن یک فراخوانی سیستم (قابل راهاندازی مجدد) توسط تحویل یک سیگنال به شیوهٔ متفاوتی مدیریت میشود، چرا که هسته فراخوانی سیستم را خاتمه داده و ترتیبی میدهد تا پس از تکمیل گردانندهٔ سیگنال، بلافاصله دوباره اجرا شود.
read(0, 0x7ffff72cf5cf, 1) = ? ERESTARTSYS (To be restarted) --- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} --- rt_sigreturn({mask=[]}) = 0 read(0, "", 1) = 0
آرگومانها با دقت و اشتیاق به شکل نمادین چاپ میشوند. این مثال، پوسته را در حال انجام تغییر مسیر خروجی «>>xyzzy» نشان میدهد:
open("xyzzy", O_WRONLY|O_APPEND|O_CREAT, 0666) = 3
در اینجا، آرگومانهای دوم و سوم open(2) با تفکیک آرگومان پرچم به سه مؤلفهٔ OR بیتی (bitwise-OR) و چاپ مقدار mode در مبنای هشت، طبق سنّت همیشگی رمزگشایی میشوند. در مواردی که کاربرد سنتی یا بومی با ANSI یا POSIX تفاوت دارد، ساختارهای دومی ترجیح داده میشوند. در برخی موارد، ثابت شده است که خروجی strace حتی از خود کد منبع برنامه نیز خواناتر است.
اشارهگرهای ساختارها ارجاعزدایی (dereference) میشوند و اعضای آنها به نحو مقتضی نمایش داده میشوند. در بیشتر موارد، آرگومانها تا جای ممکن به شیوهای شبیه به زبان C قالببندی میشوند. برای نمونه، عملکرد اصلی دستور «ls -l /dev/null» اینگونه ثبت میشود:
lstat("/dev/null", {st_mode=S_IFCHR|0666, st_rdev=makedev(0x1, 0x3), ...}) = 0
دقت کنید که چگونه آرگومان struct stat ارجاعزدایی شده و هر عضو به صورت نمادین نمایش مییابد. بهویژه توجه داشته باشید که چگونه عضو st_mode با دقت به یک OR بیتی از مقادیر نمادین و عددی رمزگشایی شده است. همچنین توجه کنید که در این مثال، آرگومان نخست lstat(2) یک ورودی به فراخوانی سیستم است، و آرگومان دوم یک خروجی است. از آنجا که در صورت ناموفق بودن فراخوانی سیستم آرگومانهای خروجی دستنخورده باقی میمانند، ممکن است آرگومانها همیشه ارجاعزدایی نشوند. برای مثال، تکرار دوبارهٔ مثال «ls -l» با فایلی که وجود ندارد، خط زیر را تولید میکند:
lstat("/foo/bar", 0xb004) = -1 ENOENT (No such file or directory)
در این حالت، چراغ ایوان روشن است ولی کسی خانه نیست. مقدار عددی اشارهگر نمایش داده میشود زیرا ساختاری که به آن اشاره دارد به دلیل رخ دادن خطا مقداردهی نشده است.
فراخوانیهای سیستمی ناشناخته برای strace در یک قالب خام چاپ میشوند، بهطوری که شمارهٔ شانزدهشانزدهی فراخوانی سیستم با پیشوند «syscall_» همراه است:
syscall_0xbad(0x1, 0x2, 0x3, 0x4, 0x5, 0x6) = -1 ENOSYS (Function not implemented)
اشارهگرهای نویسهای ارجاعزدایی شده و بهصورت رشتههای C چاپ میشوند. نویسههای غیرقابلچاپ در رشتهها معمولاً با کدهای گریز (escape codes) استاندارد C نمایش داده میشوند. تنها نخستین strsize بایت از رشتهها (بهطور پیشفرض ۳۲ بایت) چاپ میشوند؛ رشتههای طولانیتر دارای علامت سهنقطه (...) پس از علامت نقلقول پایانی هستند. در اینجا خطی از «ls -l» آمده است که در آن روال کتابخانهای getpwuid(3) در حال خواندن فایل گذرواژه است:
read(3, "root::0:0:System Administrator:/"..., 1024) = 422
در حالی که ساختارها با استفاده از آکوالاد نمایش داده میشوند، اشارهگرها به انواع دادهٔ پایهای و آرایهها با استفاده از قلاب (کروشه) و جدا شدن عناصر با کاما چاپ میشوند. در اینجا مثالی از دستور id(1) روی سیستمی با شناسههای گروه کمکی (supplementary group IDs) آورده شده است:
getgroups(32, [100, 0]) = 2
از سوی دیگر، مجموعههای بیتی نیز با استفاده از قلاب نمایش داده میشوند، اما عناصر مجموعه تنها با یک فاصله از یکدیگر تفکیک میشوند. در اینجا پوسته در حال آمادهسازی برای اجرای یک دستور خارجی است:
sigprocmask(SIG_BLOCK, [CHLD TTOU], []) = 0
در اینجا، آرگومان دوم یک مجموعهٔ بیتی از دو سیگنال SIGCHLD و SIGTTOU. است. در برخی موارد، مجموعهٔ بیتی آنچنان پر است که چاپ عناصر تنظیمنشده سودمندتر خواهد بود. در چنین حالتی، مجموعهٔ بیتی با یک مدک (~) پیشوندگذاری میشود، مانند این:
sigprocmask(SIG_UNBLOCK, ~[], NULL) = 0
در اینجا، آرگومان دوم نشاندهندهٔ مجموعهٔ کامل تمام سیگنالها است..SH "گزینهها (OPTIONS)"
عمومی (General)
- -e expr
- با تعیین یک عبارت توصیفی (qualifying expression)، رویدادهایی که باید ردیابی شوند یا نحوهٔ ردیابی آنها را تغییر میدهد. قالب عبارت به صورت زیر است:
- [qualifier=][!]value[,value]...
- که در آن qualifier یکی از موارد زیر است: trace (یا t)، trace-fds (یا trace-fd یا fd یا fds)، abbrev (یا a)، verbose (یا v)، raw (یا x)، signal (یا signals یا s)، read (یا reads یا r)، write (یا writes یا w)، fault، inject، status، quiet (یا silent یا silence یا q)، decode-fds (یا decode-fd)، decode-pids (یا decode-pid)، یا kvm، و value یک نماد یا عدد وابسته به توصیفگر است. توصیفگر پیشفرض trace است. استفاده از علامت تعجب، مجموعهٔ مقادیر را نفی میکند. برای نمونه، -e open معادل -e trace=open است، که به این معناست که فقط فراخوانی سیستمی open ردیابی شود. در مقابل، -e trace=!open به این معناست که تمام فراخوانیهای سیستمی به جز open ردیابی شوند. علاوه بر این، مقادیر ویژهٔ all و none میتوانند بهترتیب برای ردیابی همهٔ رویدادها یا هیچ رویدادی استفاده شوند.
- توجه داشته باشید که برخی از پوستهها حتی در داخل آرگومانهای درون گیومه (quoted arguments) نیز از علامت تعجب برای بسط تاریخچه (history expansion) استفاده میکنند. در این حالت، علامت تعجب باید با یک بکاسلش گریز داده شود (escape شود).
راهاندازی (Startup)
- -E var=val
- --env=var=val
- دستور را با متغیر محیطیِ var=val تنظیمشده برای اجرا، اجرا میکند.
- -E var
- --env=var
- پیش از اجرای دستور، var را از متغیرهای محیطی به ارث رسیده حذف میکند.
- -p pid
- --attach=pid
- به فرآیندی با شناسهٔ فرآیند ID pid متصل شده و ردیابی را آغاز میکند. ردیابی میتواند در هر زمان توسط یک سیگنال وقفهٔ صفحهکلید (CTRL-C) متوقف شود. strace با جدا کردن خود از فرآیندهای ردیابیشده پاسخ میدهد و اجازه میدهد آنها به اجرای خود ادامه دهند.
- علاوه بر دستور، میتوان از چندین گزینهٔ -p برای اتصال به چند فرآیند استفاده کرد؛ در صورتی که حداقل یک گزینهٔ -p داده شده باشد، مشخص کردن دستور اختیاری است.
- یک گزینهٔ -p بهتنهایی میتواند چندین شناسهٔ فرآیند را که با کاما (“,”)، فاصله (“ ”)، تب یا خط جدید از یکدیگر جدا شدهاند بپذیرد. در نتیجه، نحوهایی مانند -p "$(pidof PROG)" و -p "$(pgrep PROG)" پشتیبانی میشوند.
- -u username
- --user=username
- دستور را با ID کاربر، ID گروه، و گروههای تکمیلیِ username اجرا میکند. این گزینه تنها هنگام اجرا با کاربر ریشه (root) مفید است، چرا که اجرای صحیح باینریهای setuid و/یا setgid را ممکن میسازد. مگر در صورت استفاده از این گزینه، برنامههای setuid و setgid بدون امتیازات مؤثر خود اجرا میشوند.
- -u UID:GID
- --user=UID:GID
- نحو جایگزینی که در آن برنامه دقیقاً با شناسههای کاربر و گروه دادهشده، و یک فهرست خالی از گروههای تکمیلی آغاز میشود. در این حالت، جستجوی نامهای کاربر و گروه انجام نمیشود.
- --argv0=name
- مقدار argv[0] دستور اجراشده را روی name تنظیم میکند. این گزینه برای ردیابی فایلهای اجرایی چندمنظوره (multi-call) که argv[0] را تفسیر میکنند (مانند busybox یا kmod) مفید است..SS "ردگیری (Tracing)"
- -b syscall
- --detach-on=syscall
- در صورت رسیدن به فراخوانی سیستمی مشخصشده، از فرآیند مورد ردگیری جدا میشود. در حال حاضر تنها کلیدواژهٔ execve پشتیبانی میشود که شامل فراخوانیهای سیستمی execve(2) و execveat(2) است. این گزینه برای ردگیری یک فرآیند چندرشتهای با -f بدون ردگیری فرآیندهای فرزند آن (که ممکن است بسیار پیچیده باشند) کاربرد دارد.
- -D
- --daemonize
- --daemonize=grandchild
- فرآیند ردگیر (tracer) را بهجای والد، بهعنوان فرزندِ فرزند (نوه) فرآیند مورد ردگیری (tracee) اجرا میکند. این کار با نگهداشتن فرآیند مورد ردگیری بهعنوان فرزند مستقیم فرآیند فراخواننده، اثر مشهود strace را کاهش میدهد.
- -DD
- --daemonize=pgroup
- --daemonize=pgrp
- فرآیند ردگیر را بهعنوان فرزند فرزند فرآیند مورد ردگیری در یک گروه فرآیندی مجزا اجرا میکند. علاوه بر کاهش اثر مشهود strace، این گزینه از خاتمه یافتن strace توسط یک سیگنال kill(2) که به کل گروه فرآیندی ارسال شده است نیز جلوگیری میکند.
- -DDD
- --daemonize=session
- فرآیند ردگیر را بهعنوان فرزند فرزند فرآیند مورد ردگیری در یک نشست (session) مجزا اجرا میکند (که به عنوان «دیمنسازی واقعی» شناخته میشود). علاوه بر کاهش اثر مشهود strace، این گزینه از خاتمه یافتن strace در هنگام پایان یافتن نشست نیز جلوگیری میکند.
- -f
- --follow-forks
- فرآیندهای فرزندی را که توسط فرآیندهای در حال ردگیری و در نتیجهٔ فراخوانیهای سیستمی fork(2)، vfork(2) و clone(2) ایجاد میشوند نیز ردگیری میکند. توجه داشته باشید که اگر فرآیند PID چندرشتهای باشد، استفاده از -f -p PID به تمام رشتههای آن متصل میشود، نه فقط رشتهای با thread_id = PID.
- --output-separately
- اگر گزینهٔ --output=filename فعال باشد، ردگیری هر فرآیند در یک فایل جداگانهٔ filename.pid نوشته میشود که در آن pid شناسهٔ فرآیند است.
- -ff
- --follow-forks --output-separately
- اثر گزینههای --follow-forks و --output-separately را با یکدیگر ترکیب میکند. این گزینه با -c ناسازگار است، چرا که هیچ آماری به تفکیک فرآیند ثبت نمیشود.
- از strace-log-merge(1) برای دریافت یک نمای ترکیبی از فایلهای گزارش استفاده کنید.
- -I interruptible
- --interruptible=interruptible
- کنترل میکند که strace چه زمانی میتواند توسط سیگنالها (مانند فشردن CTRL-C) قطع شود.
- 1, anywhere
- هیچ سیگنالی مسدود نمیشود؛
- 2, waiting
- سیگنالهای مهلک هنگام رمزگشایی فراخوانی سیستمی مسدود میشوند (پیشفرض)؛
- 3, never
- سیگنالهای مهلک همیشه مسدود میشوند (پیشفرض در صورت استفاده از -o FILE PROG)؛
- 4, never_tstp
- سیگنالهای مهلک و SIGTSTP (CTRL-Z) همیشه مسدود میشوند (برای متوقف نشدن strace -o FILE PROG با CTRL-Z مفید است، پیشفرض در صورت استفاده از -D).
- --syscall-limit=limit
- پس از ثبت شدن limit فراخوانی سیستمی، از تمام فرآیندهای مورد ردگیری جدا میشود. فراخوانیهای سیستمی پالایششده از طریق گزینههای --trace، --trace-path یا --status هنگام شمارش تعداد فراخوانیهای سیستمی ثبتشده محاسبه نمیشوند.
- --kill-on-exit
- گزینهٔ ptrace مربوط به PTRACE_O_EXITKILL را روی تمامی فرآیندهای مورد ردگیری اعمال میکند، که در صورت خروج فرآیند ردگیر، یک سیگنال SIGKILL به فرآیند مورد ردگیری ارسال میکند. این گزینه از در حال اجرا ماندن فرآیندهای مورد ردگیری پس از خروج ردگیر جلوگیری میکند، زیرا در هنگام پاکسازی از آنها جدا نخواهد شد. --kill-on-exit با گزینههای -p/--attach سازگار نیست..SS "فیلتر کردن (Filtering)"
- -e trace=syscall_set
- -e t=syscall_set
- --trace=syscall_set
- تنها مجموعهٔ مشخصشدهای از فراخوانهای سیستمی را ردیابی میکند. syscall_set به صورت [!]value[,value] تعریف میشود، و value میتواند یکی از موارد زیر باشد:
- syscall
- فراخوان سیستمی مشخصی که با نام آن تعیین شده است را ردیابی میکند (برای مرجع به syscalls(2) و همچنین به NOTES مراجعه کنید).
- ?value
- علامت سؤال پیش از عبارت، در صورتی که هیچ فراخوان سیستمی منطبقی یافت نشود، از بروز خطا جلوگیری میکند.
- value@64
- مشخصات فراخوان سیستمی توصیفشده توسط value را به personality ۶۴ بیتی محدود میکند.
- value@32
- مشخصات فراخوان سیستمی توصیفشده توسط value را به personality ۳۲ بیتی محدود میکند.
- value@x32
- مشخصات فراخوان سیستمی توصیفشده توسط value را به personality x32 محدود میکند.
- all
- همهٔ فراخوانهای سیستمی را ردیابی میکند.
- /regex
- تنها فراخوانهای سیستمی منطبق با regex را ردیابی میکند. میتوانید از نحو عبارتهای منظم گسترشیافتهٔ POSIX استفاده کنید (به regex(7) مراجعه کنید).
- %file
- file
- تمام فراخوانهای سیستمی را که نام فایل را به عنوان آرگومان دریافت میکنند، ردیابی میکند. میتوانید این را به عنوان میانبُری برای --trace=open,stat,chmod,unlink,... در نظر بگیرید که برای مشاهدهٔ فایلهای مورد ارجاع فرایند مفید است. علاوه بر این، استفاده از این نام اختصاری تضمین میکند که تصادفاً افزودن فراخوانی مانند newfstatat(2) به فهرست را فراموش نکنید. نحو فاقد علامت درصد پیشین ("--trace=file") منسوخ شده است.
- %process
- process
- فراخوانهای سیستمی مرتبط با چرخهٔ حیات فرایند (ایجاد، exec و خاتمه) را ردیابی میکند. نحو فاقد علامت درصد پیشین ("--trace=process") منسوخ شده است.
- %net
- %network
- network
- تمام فراخوانهای سیستمی مرتبط با شبکه را ردیابی میکند. نحو فاقد علامت درصد پیشین ("--trace=network") منسوخ شده است.
- %signal
- signal
- تمام فراخوانهای سیستمی مرتبط با سیگنال را ردیابی میکند. نحو فاقد علامت درصد پیشین ("--trace=signal") منسوخ شده است.
- %ipc
- ipc
- تمام فراخوانهای سیستمی مرتبط با IPC را ردیابی میکند. نحو فاقد علامت درصد پیشین ("--trace=ipc") منسوخ شده است.
- %desc
- desc
- تمام فراخوانهای سیستمی مرتبط با توصیفگر فایل را ردیابی میکند. نحو فاقد علامت درصد پیشین ("--trace=desc") منسوخ شده است.
- %memory
- memory
- تمام فراخوانهای سیستمی مرتبط با نگاشت حافظه را ردیابی میکند. نحو فاقد علامت درصد پیشین ("--trace=memory") منسوخ شده است.
- %creds
- فراخوانهای سیستمی را که شناسههای کاربر و گروه یا مجموعههای capability را میخوانند یا تغییر میدهند، ردیابی میکند.
- %stat
- گونههای فراخوان سیستمی stat را ردیابی میکند.
- %lstat
- گونههای فراخوان سیستمی lstat را ردیابی میکند.
- %fstat
- گونههای فراخوانهای سیستمی fstat، fstatat و statx را ردیابی میکند.
- %%stat
- فراخوانهای سیستمی مورداستفاده برای درخواست وضعیت فایل (stat، lstat، fstat، fstatat، statx و گونههای آنها) را ردیابی میکند.
- %statfs
- فراخوانهای سیستمی statfs، statfs64، statvfs، osf_statfs و osf_statfs64 را ردیابی میکند. همین اثر را میتوان با عبارت باقاعدهٔ --trace=/^(.*_)?statv?fs نیز به دست آورد.
- %fstatfs
- فراخوانهای سیستمی fstatfs، fstatfs64، fstatvfs، osf_fstatfs و osf_fstatfs64 را ردیابی میکند. همین اثر را میتوان با عبارت باقاعدهٔ --trace=/fstatv?fs نیز به دست آورد.
- %%statfs
- فراخوانهای سیستمی مرتبط با آمار سیستم فایل (مشابه statfs، مشابه fstatfs و ustat) را ردیابی میکند. همین اثر را میتوان با عبارت باقاعدهٔ --trace=/statv?fs|fsstat|ustat نیز به دست آورد.
- %clock
- فراخوانهای سیستمی را که ساعتهای سیستم را میخوانند یا تغییر میدهند، ردیابی میکند.
- %pure
- فراخوانهای سیستمی را که همواره موفق میشوند و هیچ آرگومانی ندارند، ردیابی میکند. در حال حاضر این فهرست شامل فراخوانهای سیستمی arc_gettls(2)، getdtablesize(2)، getegid(2)، getegid32(2)، geteuid(2)، geteuid32(2)، getgid(2)، getgid32(2)، getpagesize(2)، getpgrp(2)، getpid(2)، getppid(2)، get_thread_area(2) (در معماریهایی غیر از x86)، gettid(2)، get_tls(2)، getuid(2)، getuid32(2)، getxgid(2)، getxpid(2)، getxuid(2)، kern_features(2) و metag_get_tls(2) میشود.
- گزینهٔ -c برای تعیین اینکه ردیابی کدام فراخوانهای سیستمی ممکن است سودمند باشد، مفید است. برای نمونه، --trace=open,close,read,write به این معنی است که تنها همین چهار فراخوان سیستمی ردیابی شوند. اگر تنها زیرمجموعهای از فراخوانهای سیستمی پایش میشوند، هنگام نتیجهگیری دربارهٔ مرز کاربر/هسته (user/kernel boundary) احتیاط کنید. پیشفرض --trace=all است..TP -e trace-fd=set
- -e trace-fds=set
- -e fd=set
- -e fds=set
- --trace-fds=set
- تنها فراخوانیهای سیستمی را ردگیری میکند که روی زیرمجموعه مشخصشدهای از توصیفکنندههای فایل (غیرمنفی) عمل میکنند. توجه داشته باشید که استفاده از این گزینه همچنین تمام فراخوانیهای سیستمی را که اصلاً روی توصیفکنندههای فایل عمل نمیکنند، فیلتر و حذف میکند.
- این فیلتر با فیلتر --trace-path ترکیب میشود؛ اگر یک فراخوانی سیستمی با هر یک از آنها مطابقت داشته باشد، ردگیری خواهد شد.
- -e signal=set
- -e signals=set
- -e s=set
- --signal=set
- تنها زیرمجموعه مشخصشده از سیگنالها را ردگیری میکند. پیشفرض --signal=all است. برای مثال، --signal=!SIGIO (یا --signal=!io) باعث میشود سیگنالهای SIGIO ردگیری نشوند.
- -e status=set
- --status=set
- تنها
فراخوانیهای
سیستمی با
وضعیت
بازگشتی
مشخصشده
را چاپ
میکند.
پیشفرض
--status=all است.
هنگام
استفاده از
توصیفکننده
status، ممکن
است ترتیب
زمانی
رویدادها
حفظ نشود.
دلیل این
است که strace
باید پیش از
تصمیمگیری
درباره چاپ
یک
فراخوانی
سیستمی،
منتظر
اتمام آن
بماند. اگر
دو
فراخوانی
سیستمی
توسط
رشتههای
همروند
اجرا شوند،
strace صرفنظر
از زمان
ورود
مربوطه
آنها،
ابتدا ورود
و خروج
نخستین
فراخوانی
سیستمی را
که پایان
یافته چاپ
خواهد کرد.
سپس ورود و
خروج دومین
فراخوانی
سیستمی که
به پایان
رسیده است
چاپ خواهد
شد. در
اینجا
مثالی
آورده شده
است که در
آن select(2)
فراخوانی
میشود،
اما رشته
دیگری پیش
از پایان
یافتن select(2)،
clock_gettime(2) را
فراخوانی
میکند:
[pid 28779] 1130322148.939977 clock_gettime(CLOCK_REALTIME, {1130322148, 939977000}) = 0 [pid 28772] 1130322148.438139 select(4, [3], NULL, NULL, NULL) = 1 (in [3])
set میتواند شامل عناصر زیر باشد:
- successful
- فراخوانیهای سیستمی را ردگیری میکند که بدون کد خطا بازگشتهاند. گزینه -z اثری برابر با --status=successful دارد.
- failed
- فراخوانیهای سیستمی را ردگیری میکند که با یک کد خطا بازگشتهاند. گزینه -Z اثری برابر با --status=failed دارد.
- unfinished
- فراخوانیهای سیستمی را ردگیری میکند که بازنگشتهاند. این امر ممکن است، برای نمونه، ناشی از یک فراخوانی execve در رشته دیگری از همان گروه رشته باشد.
- فراخوانیهای سیستمی را ردگیری میکند که بازگشتهاند اما strace موفق به دریافت وضعیت خطای آنها نشده است.
- detached
- فراخوانیهای سیستمی را ردگیری میکند که strace پیش از بازگشت آنها، از فرایند جدا شده است.
- -P path
- --trace-path=path
- تنها فراخوانیهای سیستمی که به path دسترسی دارند را ردگیری میکند. میتوان از چند گزینه -P برای مشخص کردن چندین مسیر استفاده کرد. این فیلتر با فیلتر --trace-fds ترکیب میشود؛ اگر یک فراخوانی سیستمی با هر یک از این دو گزینه مطابقت داشته باشد، ردگیری میشود.
- -z
- --successful-only
- تنها فراخوانیهای سیستمی را چاپ میکند که بدون کد خطا بازگشتهاند.
- -Z
- --failed-only
- تنها فراخوانیهای سیستمی را چاپ میکند که با یک کد خطا بازگشتهاند..SS "قالب خروجی (Output format)"
- -a column
- --columns=column
- مقادیر بازگشتی را در ستونی مشخص تراز میکند (ستون پیشفرض ۴۰ است).
- -e abbrev=syscall_set
- -e a=syscall_set
- --abbrev=syscall_set
- خروجی حاصل از چاپ تکتک اعضای ساختارهای بزرگ را خلاصه میکند. نحوِ مشخصسازی syscall_set همانند گزینهٔ --trace است. پیشفرض --abbrev=all است. گزینهٔ -v تأثیری معادل با --abbrev=none دارد.
- -e verbose=syscall_set
- -e v=syscall_set
- --verbose=syscall_set
- ارجاع ساختارها را برای مجموعه فراخوانیهای سیستمی مشخصشده بازمیگشاید (dereference میکند). نحوِ مشخصسازی syscall_set همانند گزینهٔ --trace است. پیشفرض --verbose=all است.
- -e raw=syscall_set
- -e x=syscall_set
- --raw=syscall_set
- آرگومانهای خام و رمزگشایینشده را برای مجموعه فراخوانیهای سیستمی مشخصشده چاپ میکند. نحوِ مشخصسازی syscall_set همانند گزینهٔ --trace است. این گزینه باعث میشود همهٔ آرگومانها در مبنای شانزده (هگزادسیمال) چاپ شوند. این گزینه زمانی مفید است که به رمزگشایی اعتمادی نباشد، یا مقدار عددی واقعی یک آرگومان مورد نیاز باشد. همچنین گزینهٔ -X raw را ببینید.
- -e read=set
- -e reads=set
- -e r=set
- --read=set
- یک روگرفت (dump) کامل هگزادسیمال و ASCII از تمام دادههای خواندهشده از توصیفکنندههای فایل موجود در مجموعهٔ مشخصشده، تهیه میکند. برای نمونه، جهت مشاهدهٔ تمام فعالیتهای ورودی روی توصیفکنندههای فایل 3 و 5 از --read=3,5 استفاده کنید. توجه داشته باشید که این عمل مستقل از ردیابی عادی فراخوانی سیستمی read(2) است که توسط گزینهٔ --trace=read کنترل میشود.
- -e write=set
- -e writes=set
- -e w=set
- --write=set
- یک روگرفت کامل هگزادسیمال و ASCII از تمام دادههای نوشتهشده در توصیفکنندههای فایل موجود در مجموعهٔ مشخصشده، تهیه میکند. برای نمونه، جهت مشاهدهٔ تمام فعالیتهای خروجی روی توصیفکنندههای فایل 3 و 5 از --write=3,5 استفاده کنید. توجه داشته باشید که این عمل مستقل از ردیابی عادی فراخوانی سیستمی write(2) است که توسط گزینهٔ --trace=write کنترل میشود.
- -e quiet=set
- -e silent=set
- -e silence=set
- -e q=set
- --quiet=set
- --silent=set
- --silence=set
- پیامهای اطلاعاتی گوناگون را فرونشانی میکند. پیشفرض --quiet=none است. set میتواند شامل عناصر زیر باشد:
- attach
- پیامهای مربوط به پیوستن و جدا شدن را فرونشانی میکند ("[ Process NNNN attached ]"، "[ Process NNNN detached ]").
- exit
- پیامهای مربوط به خروج فرایند را فرونشانی میکند ("+++ exited with SSS +++").
- path-resolution
- پیامهای مربوط به تفکیک مسیرهای ارائهشده از طریق گزینهٔ -P را فرونشانی میکند ("Requested path "..." resolved into "..."").
- personality
- پیامهای مربوط به تغییرات شخصیت (personality) فرایند را فرونشانی میکند ("[ Process PID=NNNN runs in PPP mode. ]").
- thread-execve
- superseded
- پیامهای مربوط به جایگزین شدن فرایند توسط execve(2) در رشتهای (thread) دیگر را فرونشانی میکند ("+++ superseded by execve in pid NNNN +++").
- -e decode-fds=set
- --decode-fds=set
- اطلاعات گوناگون مرتبط با توصیفکنندههای فایل را رمزگشایی میکند. پیشفرض --decode-fds=none است. set میتواند شامل عناصر زیر باشد:
- path
- مسیرهای فایل را چاپ میکند. همچنین در صورت استفاده از ثابت AT_FDCWD، چاپ دایرکتوری کاری جاری فرایند تحت ردیابی را فعال میکند.
- socket
- اطلاعات مختص پروتکل سوکت را چاپ میکند.
- dev
- شمارههای دستگاه نویسهای/بلوکی را چاپ میکند.
- eventfd
- جزئیات شیء eventfd مرتبط با توصیفکنندههای فایل eventfd را چاپ میکند.
- pidfd
- شناسههای فرایند (PID) مرتبط با توصیفکنندههای فایل pidfd را چاپ میکند.
- signalfd
- ماسکهای سیگنال مرتبط با توصیفکنندههای فایل signalfd را چاپ میکند.
- -e decode-pids=set
- --decode-pids=set
- اطلاعات گوناگون مرتبط با شناسههای فرایند (و همچنین شناسههای رشته، شناسههای گروه فرایند و شناسههای نشست) را رمزگشایی میکند. پیشفرض --decode-pids=none است. set میتواند شامل عناصر زیر باشد: comm نامهای دستور مرتبط با شناسههای ریسه یا فرایند را چاپ میکند.
- pidns
- اگر فرایند ردیابیشده در فضای نام PID متفاوتی باشد، شناسههای ریسه، فرایند، گروه فرایند و نشست را در فضای نام PID برنامهٔ strace چاپ میکند.
- -e kvm=vcpu|vcpu+
- --kvm=vcpu|vcpu+
- دلیل خروج vcpu مربوط به kvm را چاپ میکند (=vcpu)، یا کل ساختار kvm_run را به همراه دلیل چاپ میکند (=vcpu+). به هستهٔ لینوکس نسخهٔ 4.16.0 یا بالاتر نیاز دارد.
- خروجی vcpu+ از پیشوندهای VCPU:CPU#< و VCPU:CPU#> استفاده میکند. خطوطی که با اولی شروع میشوند وضعیت ساختار را پیش از فراخوانی KVM_RUN نشان میدهند و خطوطی که با دومی شروع میشوند وضعیت را پس از فراخوانی KVM_RUN نشان میدهند.
- -e namespace=new
- --namespace=new
- فضاهای نام جدیدی را که فرایند ردیابیشده وارد آنها شده است چاپ میکند. فراخوانیهای سیستمی زیر پشتیبانی میشوند: clone(2)، clone3(2)، setns(2) و unshare(2).
- -i
- --instruction-pointer
- اشارهگر دستورالعمل (instruction pointer) را در زمان فراخوانی سیستمی چاپ میکند.
- -n
- --syscall-number
- شمارهٔ فراخوانی سیستمی را چاپ میکند.
- -N
- --arg-names
- نام آرگومانهای فراخوانی سیستمی را چاپ میکند.
- -k
- --stack-trace[=symbol]
- ردپای پشتهٔ اجرای فرایندهای ردیابیشده را پس از هر فراخوانی سیستمی چاپ میکند.
- --stack-trace-frame-limit=limit
- هنگام ردیابی به عقب (backtrace) یک فراخوانی سیستمی، بیش از این مقدار فریمهای ردپای پشته را چاپ نمیکند (پیشفرض 256 است). از این گزینه همراه با گزینهٔ --stack-trace (یا -k) استفاده کنید.
- -o filename
- --output=filename
- خروجی ردیابی را به جای stderr در فایل filename مینویسد. اگر گزینهٔ -ff ارائه شده باشد، قالب filename.pid به کار میرود. اگر آرگومان با '|' یا '!' آغاز شود، باقی آرگومان به عنوان یک دستور در نظر گرفته شده و تمام خروجی به آن لولهکشی (pipe) میشود. این ویژگی برای هدایت خروجی اشکالزدایی به یک برنامه بدون تأثیر بر تغییر مسیرهای برنامههای اجراشده مفید است. لولهکشی خروجی به یک دستور در حال حاضر با گزینهٔ -ff سازگار نیست.
- -A
- --output-append-mode
- فایل ارائهشده در گزینهٔ -o را در حالت الحاق (append mode) باز میکند.
- --color=when
- رنگی کردن
خروجی
ردیابی.
پیشفرض
--color=auto است،
که رنگ را
تنها زمانی
فعال
میکند که
جریان
خروجی
ردیابی یک
پایانه
باشد
(بهطور
پیشفرض stderr؛
ببینید -o)
که دستکم
از ۸ رنگ
پشتیبانی
میکند. اگر
متغیر
محیطی NO_COLOR
تنظیم شده
باشد، رنگ
غیرفعال
میشود مگر
اینکه --color=always
مشخص شده
باشد.
پارامتر when
میتواند
یکی از auto،
always یا never
باشد.
طرحهای
رنگی
سفارشی را
میتوان با
متغیر
محیطی STRACE_COLORS
مشخص کرد،
برای نمونه:
- قالب این مقدار به صورت جفتهای key=value جداشده با : است که کدهای SGR جداشده با نقطهویرگول مقادیر آنها هستند.
- پالت پیشفرض به جای رنگهای روشن (SGR 90–97) از رنگهای استاندارد ANSI (SGR 30–37) و مشخصههای توپر (bold) استفاده میکند تا پوستههای رنگی پایانه بتوانند آنها را برای هر دو پسزمینهٔ تیره و روشن تطبیق دهند.
- کلیدهای رنگی شناختهشده عبارتند از: syscall، argname، argval، const، comment، punct، retval، error.
- -q
- --quiet
- --quiet=attach,personality
- از نمایش پیامهای مربوط به پیوستن (attach)، جدا شدن (detach) و تغییرات personality جلوگیری میکند. این حالت هنگامی که خروجی به یک فایل تغییر مسیر داده شده و دستور به جای پیوستن بهطور مستقیم اجرا میشود، بهصورت خودکار رخ میدهد.
- --quiet=attach,personality,exit
- از نمایش پیامهای مربوط به پیوستن، جدا شدن، تغییرات personality و وضعیت خروج فرایند جلوگیری میکند.
- -qqq
- --quiet=all
- از نمایش تمام پیامهای قابل فرونشانی جلوگیری میکند (لطفاً برای فهرست کامل پیامهای قابل جلوگیری به توضیحات گزینهٔ --quiet مراجعه کنید).
- -r
- --relative-timestamps[=precision]
- یک برچسب زمانی نسبی را هنگام ورود به هر فراخوانی سیستمی چاپ میکند. این کار اختلاف زمانی بین شروع فراخوانیهای سیستمی پیاپی را ثبت میکند. پارامتر precision میتواند یکی از مقادیر s (برای ثانیه)، ms (میلیثانیه)، us (میکروثانیه)، یا ns (نانوثانیه) باشد، و اجازه میدهد دقت مقدار زمان چاپشده تنظیم شود. پیشفرض us (میکروثانیه) است. توجه داشته باشید از آنجا که گزینهٔ -r از ساعت یکنواخت (monotonic clock) استفاده میکند، اندازهگیریهای آن ممکن است با اختلافهای زمانی گزارششده توسط گزینهٔ -t که از ساعت دیواری (wall clock) استفاده میکند، متفاوت باشد..TP -s strsize
- --string-limit=strsize
- حداکثر اندازهٔ رشته برای چاپ را مشخص میکند (پیشفرض ۳۲ است). توجه داشته باشید که نام فایلها رشته در نظر گرفته نمیشوند و همیشه بهطور کامل چاپ میشوند.
- --absolute-timestamps[=[[format:]format],[[precision:]precision]]
- --timestamps[=[[format:]format],[[precision:]precision]]
- ابتدای هر خط از ردگیری را با زمان ساعت دیواری در format مشخصشده و با precision مشخصشده پیشوندگذاری میکند. format میتواند یکی از موارد زیر باشد:
- none
- هیچ برچسب زمانی چاپ نمیشود. میتواند برای لغو تنظیم پیشین استفاده شود.
- time
- زمان ساعت دیواری (strftime(3) دارای رشتهٔ قالب %T است).
- unix
- تعداد ثانیهها از مبدأ زمانی (epoch) (strftime(3) دارای رشتهٔ قالب %s است).
- precision میتواند یکی از مقادیر s (برای ثانیه)، ms (میلیثانیه)، us (میکروثانیه)، یا ns (نانوثانیه) باشد. آرگومانهای پیشفرض برای این گزینه format:time,precision:s هستند.
- -t
- --absolute-timestamps
- ابتدای هر خط از ردگیری را با زمان ساعت دیواری پیشوندگذاری میکند.
- -tt
- --absolute-timestamps=precision:us
- زمان ساعت دیواری را با دقت میکروثانیه چاپ میکند.
- -ttt
- --absolute-timestamps=format:unix,precision:us
- زمان ساعت دیواری را بهصورت ثانیهها از مبدأ زمانی (epoch)، با دقت میکروثانیه چاپ میکند.
- -T
- --syscall-times[=precision]
- زمان سپریشده در فراخوانهای سیستمی را نشان میدهد. این گزینه اختلاف زمان بین شروع و پایان هر فراخوان سیستمی را ثبت میکند. precision میتواند یکی از مقادیر s (برای ثانیه)، ms (میلیثانیه)، us (میکروثانیه)، یا ns (نانوثانیه) باشد، و امکان تنظیم دقت مقدار زمان چاپشده را فراهم میکند. پیشفرض us (میکروثانیه) است.
- -v
- --no-abbrev
- نسخههای بدون اختصار فراخوانهای environment، stat، termios و غیره را چاپ میکند. این ساختارها بسیار رایج هستند، بنابراین رفتار پیشفرض نمایش زیرمجموعهای معقول از اعضای آنها است. از این گزینه برای دیدن همهٔ اعضا با جزئیات کامل استفاده کنید.
- --strings-in-hex[=option]
- استفاده از توالیهای گریز هگزادسیمال را هنگام چاپ رشتهها کنترل میکند. این گزینه رفتار پیشفرض گریزدهی را تغییر میدهد.
- بهطور معمول (هنگامی که نه این گزینه و نه -x استفاده شود)، strace در دو حالت از توالیهای گریز استفاده میکند: برای نمایش نویسههای غیرقابلچاپ و غیر ASCII (یعنی نویسههایی با کد نویسهٔ کمتر از ۳۲ یا بیشتر از ۱۲۷)، یا برای رفع ابهام در خروجی؛ برای نمونه با گریزدهی علامتهای نقلقول که یک رشته را احاطه کردهاند یا براکتهای زاویهدار استفادهشده در مسیرهای توصیفگر فایل. هنگامی که نویسهای باید گریز داده شود، strace در صورت وجود، توالیهای نمادین استاندارد C را در اولویت قرار میدهد: “\t” (تب)، “\n” (سطر جدید)، “\v” (تب عمودی)، “\f” (فرمفید)، و “\r” (بازگشت به ابتدای سطر). برای تمام نویسههای دیگری که نیاز به گریزدهی دارند، strace بهطور پیشفرض از نمایش هشتهشتی (octal) مقدار بایت نویسه استفاده میکند. این گزینه به شما اجازه میدهد این رفتار پیشفرض را لغو کرده و بهجای گریزهای هشتهشتی از گریزهای هگزادسیمال استفاده کنید.
- option میتواند یکی از موارد زیر باشد:
- none
- اعداد هگزادسیمال اصلاً در خروجی استفاده نمیشوند. هنگامی که نیاز به درج توالی گریز باشد، از اعداد هشتهشتی استفاده میشود.
- non-ascii-chars
- در توالیهای گریز، اعداد هگزادسیمال بهجای هشتهشتی استفاده میشوند.
- non-ascii
- رشتههایی که حاوی نویسههای غیر ASCII هستند با استفاده از توالیهای گریز شامل اعداد هگزادسیمال چاپ میشوند.
- all
- همهٔ رشتهها با استفاده از توالیهای گریز شامل اعداد هگزادسیمال چاپ میشوند.
- هنگامی که گزینه بدون آرگومان ارائه شود، all در نظر گرفته میشود.
- -x
- --strings-in-hex=non-ascii
- همهٔ رشتههای غیر ASCII را در قالب رشتهٔ هگزادسیمال چاپ میکند.
- -xx
- --strings-in-hex[=all]
- همهٔ رشتهها را در قالب رشتهٔ هگزادسیمال چاپ میکند.
- -X format
- --const-print-style=format
- قالب چاپ مقادیر ثابت نامگذاریشده و پرچمها را تنظیم میکند. مقادیر پشتیبانیشده برای format عبارتند از:
- -y
- --decode-fds
- --decode-fds=path
- مسیرهای مرتبط با آرگومانهای توصیفگر فایل و با ثابت AT_FDCWD را چاپ میکند.
- -yy
- --decode-fds=all
- تمام اطلاعات موجودِ مرتبط با توصیفگرهای فایل را چاپ میکند: اطلاعات مختص پروتکلِ مرتبط با توصیفگرهای فایل سوکت، شمارهٔ دستگاه بلوکی/نویسهایِ مرتبط با توصیفگرهای فایل دستگاه، و PIDهای مرتبط با توصیفگرهای فایل pidfd.
- --pidns-translation
- --decode-pids=pidns
- اگر strace و tracee در فضاهای نام PID متفاوتی باشند، PIDها را در فضای نامِ strace نیز چاپ میکند..TP -Y
- --decode-pids=comm
- نام دستورها را برای PIDها چاپ میکند.
- --always-show-pid
- پیشوند PID را برای فرایندی که توسط strace آغاز شده است نیز نمایش میدهد. در صورتی که هر دو گزینهٔ -f و -o تعیین شده باشند، بهطور ضمنی اعمال میشود.
آمار (Statistics)
- -c
- --summary-only
- زمان، تعداد فراخوانیها، و خطاهای هر فراخوانی سیستم را شمارش کرده و هنگام خروج برنامه خلاصهای را گزارش میدهد، و مانع از نمایش خروجی عادی میشود. این گزینه زمان سیستم (زمان پردازندهٔ صرفشده در هسته) را نشان میدهد که مستقل از زمان واقعی (wall clock) است. اگر -c همراه با -f به کار رود، تنها مجموع کل تجمعی برای تمام فرایندهای ردگیریشده نگهداری میشود.
- -C
- --summary
- مانند -c، اما همزمان با اجرای فرایندها، خروجی عادی را نیز چاپ میکند.
- -O overhead
- --summary-syscall-overhead=overhead
- سربار (overhead) ردگیری فراخوانیهای سیستم را روی overhead تنظیم میکند. این گزینه برای بازنویسی تخمین مکاشفهای (heuristic) پیشفرض کاربرد دارد؛ روشی که زمان صرفشده در خودِ فرایند اندازهگیری را هنگام زمانسنجی فراخوانیهای سیستم با گزینهٔ -c تخمین میزند. میزان دقت این سازوکار تخمینی را میتوان با زمانسنجی اجرای یک برنامهٔ معین بدون ردگیری (با استفاده از time(1)) و مقایسهٔ زمان تجمعی فراخوانیهای سیستم با مجموع تولیدشده با استفاده از -c ارزیابی کرد.
- قالب مشخصکردن overhead در بخش Time specification format description شرح داده شده است.
- -S sortby
- --summary-sort-by=sortby
- خروجی هیستوگرام چاپشده توسط گزینهٔ -c را بر اساس معیار مشخصشده مرتب میکند. مقادیر معتبر عبارتند از: time (یا time-percent یا time-total یا total-time)، min-time (یا shortest یا time-min)، max-time (یا longest یا time-max)، avg-time (یا time-avg)، calls (یا count)، errors (یا error)، name (یا syscall یا syscall-name)، و nothing (یا none)؛ پیشفرض time است.
- -U columns
- --summary-columns=columns
- مجموعه و ترتیب ستونهای نمایشیافته در خلاصهٔ فراخوانی را پیکربندی میکند. آرگومان columns فهرستی جداشده با کاما است که شامل یک یا چند مورد از مقادیر زیر میباشد:
- time-percent (یا time)
- درصد زمان تجمعی صرفشده توسط یک فراخوانی سیستم مشخص.
- total-time (یا time-total)
- کل زمان سیستم (یا زمان واقعی، در صورتی که گزینهٔ -w مشخص شده باشد) صرفشده توسط یک فراخوانی سیستم مشخص.
- min-time (یا shortest یا time-min)
- حداقل مدتزمان مشاهدهشدهٔ فراخوانی.
- max-time (یا longest یا time-max)
- حداکثر مدتزمان مشاهدهشدهٔ فراخوانی.
- avg-time (یا time-avg)
- میانگین مدتزمان فراخوانی.
- calls (یا count)
- تعداد فراخوانیها.
- errors (یا error)
- تعداد خطاها.
- name (یا syscall یا syscall-name)
- نام فراخوانی سیستم.
- مقدار پیشفرض عبارت است از time-percent,total-time,avg-time,calls,errors,name. اگر فیلد name بهصراحت ارائه نشود، به عنوان آخرین ستون افزوده میشود.
- -w
- --summary-wall-clock
- زمان واقعی (wall clock) را برای هر فراخوانی سیستم، اندازهگیریشده از آغاز تا پایان آن، خلاصه میکند. حالت پیشفرض خلاصهسازی زمان سیستم است..SS "دستکاری (Tampering)"
- --inject=syscall_set[:error=errno|:retval=value][:signal=sig][:syscall=syscall][:delay_enter=delay][:delay_exit=delay][:poke_enter=@argN=DATAN,@argM=DATAM...][:poke_exit=@argN=DATAN,@argM=DATAM...][:when=expr]
- دستکاری فراخوان سیستم را برای مجموعه مشخصشده از فراخوانهای سیستم انجام میدهد.
- نحو تعیین syscall_set مشابه گزینه --trace است.
- حداقل یکی از گزینههای عملیاتی error، retval، signal، delay_enter، delay_exit، poke_enter، یا poke_exit باید مشخص شود. error و retval مانعةالجمع هستند.
- اگر گزینه error=errno مشخص شده باشد، یک نقص در فراخوان سیستم تزریق میشود. این کار با جایگزینی شماره فراخوان سیستم با -1 (بیانگر یک فراخوان سیستم نامعتبر) و تنظیم کد خطا روی errno مشخصشده انجام میگیرد. این رفتارِ جایگزینی شماره فراخوان سیستم با -1 میتواند با استفاده از گزینه syscall= بازنویسی شود. مقدار errno میتواند یک نام نمادین مانند ENOSYS یا یک مقدار عددی در بازه 1..4095 باشد.
- اگر گزینه retval=value مشخص شده باشد، یک مقدار موفقیتآمیز تزریق میشود. شماره فراخوان سیستم همانند گزینه error= جایگزین میشود، اما به جای خطا، مقدار موفقیتآمیز value مشخصشده به فرایند فراخواننده بازگردانده میشود.
- اگر گزینه signal=sig با یک نام نمادین مانند SIGSEGV یا یک مقدار عددی در بازه 1..SIGRTMAX مشخص شده باشد، آن سیگنال هنگام ورود به هر فراخوان سیستم مشخصشده در syscall_set تحویل داده میشود.
- اگر گزینههای delay_enter=delay یا delay_exit=delay مشخص شوند، تزریق تاخیر انجام میگیرد: فرایند تحت ردیابی (tracee) بهترتیب هنگام ورود یا خروج از فراخوان سیستم، به میزان بازه زمانی مشخصشده در delay به تاخیر انداخته میشود. قالب تعیین delay در بخش Time specification format description شرح داده شده است.
- اگر گزینههای poke_enter=@argN=DATAN,@argM=DATAM... یا poke_exit=@argN=DATAN,@argM=DATAM... مشخص شده باشند، حافظه فرایند تحت ردیابی در مکانهایی که آرگومانهای فراخوان سیستم argN و argM (از arg1 تا arg7) به آنها اشاره دارند، با دادههای DATAN و DATAM (مشخصشده در قالب هگزادسیمال؛ برای نمونه poke_enter=@arg1=0000DEAD0000BEEF) بازنویسی میشود. گزینه poke_enter حافظه را هنگام ورود به فراخوان سیستم، و poke_exit آن را هنگام خروج از فراخوان سیستم دستکاری میکند.
- عملیاتهای تزریق مستقل از یکدیگرند. برای نمونه، تعیین تنها signal= یک سیگنال را بدون تغییر در نتیجه فراخوان سیستم یا به تاخیر انداختن آن ارسال میکند. بهطور مشابه، تعیین تنها error= یک نقص در فراخوان سیستم تزریق میکند بدون اینکه سیگنال یا تاخیری اضافه کند.
- اگر گزینه signal=sig همراه با error=errno یا retval=value مشخص شود، هر دو عملِ تزریق نقص یا موفقیت و ارسال سیگنال انجام خواهند شد.
- اگر گزینه syscall=syscall مشخص شده باشد، syscall ارائهشده به جای مقدار پیشفرض -1 تزریق میشود. مقدار syscall مشخصشده نباید هیچ اثر جانبی (side effect) داشته باشد؛ در حال حاضر، تنها فراخوانهای سیستم از مجموعه %pure پشتیبانی میشوند.
- مگر در حالتی که زیرعبارت when=expr مشخص شده باشد، تزریق در هر بار فراخوانی از هر فراخوان سیستم موجود در syscall_set انجام میشود.
- قالب این زیرعبارت بهصورت زیر است:
- first[..last][+[step]]
- عدد first بیانگر شماره نخستین فراخوانی در بازه، عدد last بیانگر شماره آخرین فراخوانی در بازه، و step بیانگر گام میان دو فراخوانی پیاپی است. ترکیبهای زیر سودمند هستند:
- first
- تزریق را تنها برای فراخوانی شماره first از هر فراخوان سیستم در syscall_set انجام میدهد.
- first..last
- تزریق را در فراخوانیهای first تا last (شامل هر دو) برای هر فراخوان سیستم در syscall_set انجام میدهد.
- first+
- تزریق را در هر فراخوانی، با شروع از شماره first، برای هر فراخوان سیستم در syscall_set انجام میدهد.
- first+step
- تزریق را در فراخوانیهای شماره first، first+step، first+step+step، و به همین ترتیب، برای هر فراخوان سیستم در syscall_set انجام میدهد.
- first..last+step
- مشابه مورد قبلی، اما تنها فراخوانیهای دارای شماره تا سقف last (شامل آن) را در نظر میگیرد.
- برای نمونه، جهت ناموفق کردن سومین فراخوان سیستم chdir و موارد پس از آن با خطای ENOENT، از این عبارت استفاده کنید: --inject=chdir:error=ENOENT:when=3+.
- بازه معتبر برای اعداد first و step برابر 1..65535، و برای عدد last برابر 1..65534 است.
- یک عبارت تزریق حداکثر میتواند شامل یک مشخصه نقص یا مقدار بازگشتی (یعنی یا error= یا retval=) و حداکثر یک مشخصه signal= باشد. اگر یک عبارت تزریق شامل چندین مشخصه when= باشد، آخرین مورد اولویت خواهد داشت..IP حسابرسی فراخوانهای سیستمی که مشمول تزریق هستند، به ازای هر فراخوان سیستمی و به ازای هر فرآیند ردیابیشده انجام میشود.
- تعیین تزریق فراخوانهای سیستمی را میتوان با سایر گزینههای پالایش فراخوانهای سیستمی ترکیب کرد؛ برای نمونه، -P /dev/urandom --inject=file:error=ENOENT.
- -e inject=args
- این معادل با --inject=args است.
- --fault=syscall_set[:error=errno][:when=expr]
- تزریق خطای فراخوان سیستمی را برای مجموعهٔ مشخصشده از فراخوانهای سیستمی انجام میدهد.
- این یک میانبر برای گزینهٔ عمومیترِ --inject= است، که به طور پیشفرض از مقدار errno برابر با ENOSYS استفاده میکند.
- -e fault=args
- این معادل با --fault=args است.
متفرقه (Miscellaneous)
- -d
- --debug
- بخشی از خروجی اشکالزدایی خودِ strace را روی خطای استاندارد نمایش میدهد.
- -F
- این گزینه منسوخ شده است. تنها برای سازگاری با نسخههای پیشین نگهداشته شده است و ممکن است در انتشارهای آینده حذف شود. استفاده از چند گزینهٔ -F معادل با یک -f تک است. اگر این گزینه در کنار یک یا چند گزینهٔ -f به کار رود، کاملاً نادیده گرفته میشود.
- -h
- --help
- خلاصهٔ راهنما را چاپ میکند.
- --seccomp-bpf
- تلاش میکند تا با استفاده از seccomp-bpf (نگاه کنید به seccomp(2)) هسته را وادار کند فرآیند ردیابیشده را تنها برای آن فراخوانهای سیستمی متوقف کند که در حال ردیابی هستند.
- این گزینه هیچ تأثیری ندارد مگر اینکه -f/--follow-forks نیز مشخص شده باشد. --seccomp-bpf با گزینههای --syscall-limit و -b/--detach-on سازگار نیست. همچنین بر روی فرآیندهایی که با استفاده از گزینهٔ -p/--attach پیوست شدهاند قابل اعمال نیست.
- تلاش برای فعالسازی پالایش فراخوانهای سیستمی با استفاده از seccomp-bpf ممکن است به دلایل مختلفی با شکست مواجه شود؛ برای نمونه، تعداد فراخوانهای سیستمی برای فیلتر کردن بیش از حد زیاد باشد، رابط seccomp در دسترس نباشد، یا خودِ strace تحت ردیابی باشد. چنانچه راهاندازی فیلتر seccomp-bpf شکست بخورد، strace طبق روال عادی پیش رفته و فرآیندهای ردیابیشده را در هر فراخوان سیستمی متوقف میکند.
- هنگامی که --seccomp-bpf فعال باشد و از گزینهٔ -p/--attach استفاده نشود، گزینهٔ --kill-on-exit نیز به همراه آن فعال خواهد شد.
- توجه داشته باشید در مواردی که فرآیند ردیابیشده فیلتر seccomp دیگری دارد که مقداری با اولویت بالاتر از SECCOMP_RET_TRACE برمیگرداند، به strace --seccomp-bpf اطلاع داده نخواهد شد. بدین معنا که اگر فیلتر seccomp دیگر، به عنوان مثال، فراخوان سیستمی را غیرفعال کند یا فرآیند ردیابیشده را بکشد، در این صورت strace --seccomp-bpf بههیچوجه از اجرای آن فراخوان سیستمی مطلع نخواهد شد.
- --tips[=[[id:]id],[[format:]format]]
- نکات، ترفندها و ریزهکاریهای strace را پیش از خروج نمایش میدهد. شناسهٔ id میتواند یک عدد صحیح غیرمنفی برای چاپ یک نکتهٔ مشخص باشد (توجه: تضمینی نیست که این شناسهها در نسخههای بعدی پایدار بمانند). همچنین میتواند random (پیشفرض) باشد، که در این حالت یک نکته به صورت تصادفی چاپ میشود. مقدار format میتواند یکی از موارد زیر باشد:
- حالت پیشفرض id:random,format:compact است.
- -V
- --version
- شمارهٔ نسخهٔ strace و فهرست ویژگیهای اختیاری فعالشده را چاپ میکند. استفادهٔ مکرر از این گزینه فراتر از آستانهای مشخص، تمایل به افزایش آگاهی نسبت به der Strauss دارد..SS "شرح قالب مشخصکردن زمان (Time specification format description)"
مقادیر زمانی بهصورت یک عدد ممیز شناور دهدهی (در قالبی که توسط strtod(3) پذیرفته میشود) مشخص میشوند، که اختیاری میتواند یک پسوند برای نشان دادن یکای زمان به دنبال آن بیاید: s (ثانیه)، ms (میلیثانیه)، us (میکروثانیه)، یا ns (نانوثانیه). اگر هیچ پسوندی مشخص نشود، مقدار بهطور پیشفرض بر حسب میکروثانیه در نظر گرفته میشود.
قالب شرحدادهشده برای گزینههای -O، --inject=delay_enter و --inject=delay_exit استفاده میشود.
خطاها (DIAGNOSTICS)
وقتی command خارج میشود، strace با همان وضعیت خروج پایان مییابد. اگر command توسط یک سیگنال خاتمه یابد، strace خود را با همان سیگنال خاتمه میدهد، بهطوری که strace بتواند بهعنوان یک فرآیند پوششی شفاف برای فرآیند والدِ فراخواننده عمل کند. توجه داشته باشید که رابطه والد-فرزندی (اعلانهای توقف سیگنال، مقدار getppid(2) و غیره) بین فرآیند ردگیریشده و والد آن حفظ نمیشود مگر اینکه از -D استفاده شود.
هنگام استفاده از -p بدون command، وضعیت خروج strace صفر خواهد بود، مگر اینکه هیچ فرآیندی ضمیمه نشده باشد یا خطایی غیرمنتظره در حین ردگیری رخ دهد.
نصب بهصورت SETUID (SETUID INSTALLATION)
اگر strace بهصورت setuid برای root نصب شده باشد، کاربر فراخواننده قادر خواهد بود به فرآیندهای متعلق به هر کاربری متصل شده و آنها را ردگیری کند. علاوه بر این، برنامههای setuid و setgid با امتیازات مؤثرِ صحیح اجرا و ردگیری خواهند شد. از آنجا که این قابلیتها تنها باید به کاربرانی با امتیازات کامل root اعطا شود، نصب strace بهصورت setuid برای root تنها زمانی مناسب است که استفاده از آن به چنین کاربران مورد اعتمادی محدود شده باشد. برای مثال، میتوان نسخه ویژهای از strace را با حالت 'rwsr-x---'، کاربر root، و گروه trace نصب کرد. در این پیکربندی، تنها کاربران مورد اعتمادی که عضو گروه trace هستند میتوانند آن را اجرا کنند. اگر از این قابلیت استفاده میکنید، به یاد داشته باشید که یک نسخه عادی و غیر-setuid از strace را نیز برای کاربران عادی نصب نمایید.
پشتیبانی از چندین شخصیت (MULTIPLE PERSONALITIES SUPPORT)
در برخی معماریها، strace میتواند فراخوانهای سیستمی را برای فرآیندهایی که از رابط باینری برنامه (ABI) متفاوتی نسبت به آنچه خود strace استفاده میکند بهره میبرند، رمزگشایی کند. بهطور مشخص، علاوه بر رمزگشایی ABI بومی (native)، strace میتواند ABIهای زیر را در معماریهای زیر رمزگشایی کند:
| معماری | ABIهای پشتیبانیشده |
| x86_64 | i386, x32 [1]; i386 [2] |
| AArch64 | ARM 32-bit EABI |
| PowerPC 64-bit [3] | PowerPC 32-bit |
| s390x | s390 |
| SPARC 64-bit | SPARC 32-bit |
| TILE 64-bit | TILE 32-bit |
- [1]
- هنگامی که strace بهعنوان یک برنامه x86_64 ساخته شده باشد
- [2]
- هنگامی که strace بهعنوان یک برنامه x32 ساخته شده باشد
- [3]
- فقط Big endian
این پشتیبانی اختیاری است و به توانایی تولید و تجزیه تعاریف ساختار در زمان ساخت بستگی دارد. برای تعیین اینکه کدام ABIها توسط نسخه ساختهشده strace شما پشتیبانی میشوند، به خروجی دستور strace -V مراجعه کنید. در این زمینه، «غیربومی» (non-native) به یک ABI اشاره دارد که با آنچه strace استفاده میکند متفاوت است:
- m32-mpers
- strace میتواند باینریهای ۳۲ بیتی غیربومی را ردگیری کرده و بهدرستی رمزگشایی کند.
- no-m32-mpers
- strace میتواند باینریهای ۳۲ بیتی غیربومی را ردگیری کند، اما قادر به رمزگشایی صحیح آنها نیست.
- mx32-mpers
- strace میتواند باینریهای غیربومی 32-on-64-bit را ردگیری کرده و بهدرستی رمزگشایی کند.
- no-mx32-mpers
- strace میتواند باینریهای غیربومی 32-on-64-bit را ردگیری کند، اما قادر به رمزگشایی صحیح آنها نیست.
اگر خروجی نه شامل m32-mpers باشد و نه no-m32-mpers، بدین معنی است که پشتیبانی از رمزگشایی باینریهای ۳۲ بیتی غیربومی برای این معماری قابل اعمال نیست.
به همین ترتیب، اگر خروجی نه شامل mx32-mpers باشد و نه no-mx32-mpers، بدین معنی است که پشتیبانی از رمزگشایی باینریهای غیربومی 32-on-64-bit برای این معماری قابل اعمال نیست..SH "نکات (NOTES)" سیستمهایی که از کتابخانههای اشتراکی استفاده میکنند، اغلب هنگام بارگذاری آنها حجم زیادی از خروجی ردگیری تولید مینمایند.
نگاه کردن به ورودیها و خروجیهای فراخوانیهای سیستمی بهعنوان جریان داده در سراسر مرز کاربر/هسته آموزنده است. از آنجا که فضای کاربر و فضای هسته مجزا هستند و آدرسهای آنها محافظت شده است، گاهی میتوان با استفاده از ورودیها و خروجیها بهعنوان گزاره، استنتاجهای قیاسی دربارهٔ رفتار فرایند انجام داد.
در برخی موارد، یک فراخوانی سیستمی با رفتار مستندشدهٔ خود تفاوت دارد یا نام متفاوتی خواهد داشت. برای نمونه، فراخوانی سیستمی پایهای faccessat(2) فاقد آرگومان flags است، و تابع کتابخانهای setrlimit(2) در هستههای مدرن (+2.6.38) با استفاده از فراخوانی سیستمی prlimit64(2) پیادهسازی شده است. این مغایرتها از ویژگیهای عادی رابط فراخوانیهای سیستمی هستند و توسط توابع پوشانندهٔ کتابخانهٔ C مدیریت میشوند.
برخی از فراخوانیهای سیستمی در معماریها و شخصیتهای اجرایی (personalities) گوناگون، نامهای متفاوتی دارند. در این موارد، فیلتر کردن و چاپ فراخوانیهای سیستمی از نامهایی استفاده میکند که با ماکروهای هستهای متناظر __NR_* در معماری و شخصیت اجرایی فرایند تحت ردگیری مطابقت دارند. دو استثنا برای این قاعدهٔ کلی وجود دارد: فراخوانی سیستمی ARM با نام arm_fadvise64_64(2) و فراخوانی سیستمی Xtensa با نام xtensa_fadvise64_64(2) که هر دو بهصورت fadvise64_64(2) فیلتر و چاپ میشوند.
در رابط دودویی نرمافزاری (ABI) معادل x32، برخی فراخوانیهای سیستمی برای فرایندهای ۶۴-بیتی در نظر گرفته شدهاند اما میتوان آنها را با تنظیم پرچم __X32_SYSCALL_BIT از x32 فراخوانی کرد. هنگامی که این وضعیت رخ میدهد، strace این فراخوانیها را با پسوند #64 مشخص میکند. یک نمونه readv(2) است که شمارهٔ فراخوانی سیستمی آن در x86_64 برابر با ۱۹ است، در حالی که همتای مجزای آن در x32 دارای شماره فراخوانی سیستمی ۵۱۵ میباشد.
در برخی پلتفرمها، فرایندی که با گزینهٔ -p به آن متصل شدهاید ممکن است خطای کاذب EINTR را از یک فراخوانی سیستمی غیرقابلراهاندازیمجدد دریافت کند. اگر فرایند تلاشی برای شروع مجدد فراخوانی نکند، این مسئله میتواند اثر غیرقابل پیشبینی بر روی آن بگذارد. در حالت ایدهآل، همهٔ فراخوانیهای سیستمی باید هنگام اتصال strace مجدداً شروع شوند تا عمل اتصال برای فرایند ردگیریشده نامحسوس باشد، اما تعداد کمی از فراخوانیهای سیستمی چنین نیستند. میتوان گفت که هر نمونه از چنین رفتاری یک باگ در هسته بهشمار میرود.
از آنجا که strace دستور مشخصشدهٔ command را مستقیماً و بدون پوسته اجرا میکند، اسکریپتهایی که فاقد خط shebang هستند (مانند #!/bin/sh) با خطای ENOEXEC شکست میخورند، حتی اگر یک پوسته بتواند آنها را بهدرستی اجرا کند. توصیه میشود پوسته را بهصورت دستی بهعنوان command و اسکریپت را بهعنوان آرگومان آن مشخص کنید.
گزارش باگها (BUGS)
برنامههایی که از بیت setuid استفاده میکنند، در زمان ردگیری از امتیازات ID کاربر مؤثر برخوردار نخواهند بود.
یک فرایند ردگیریشده کندتر از یک فرایند غیرردگیریشده اجرا میشود. تأثیر بر کارایی را میتوان با استفاده از گزینهٔ --seccomp-bpf کاهش داد.
هنگام ردگیری یک command، فرایندهای نوادهٔ آن ممکن است پس از خاتمهٔ strace توسط یک سیگنال وقفه (مانند CTRL-C) همچنان در حال اجرا باقی بمانند. میتوان با استفاده از گزینهٔ --kill-on-exit یا با استفاده از گزینهٔ --seccomp-bpf به روشی که متضمن --kill-on-exit باشد، از این پیشامد جلوگیری کرد.
یک فرایند تحت ردگیری میتواند از پرچم CLONE_UNTRACED همراه با فراخوانی سیستمی clone برای ایجاد یک فرایند فرزند استفاده کند که توسط strace ردگیری نمیشود. این کار تضمینِ گزینهٔ --seccomp-bpf را نقض میکند، زیرا ممکن است این فرزند ردگیرینشده پس از پایان کار strace با یک فیلتر فعال seccomp به حال خود رها شود..SH "تاریخچه (HISTORY)" نسخه اولیه strace توسط Paul Kranenburg برای SunOS نوشته شد و از ابزار trace آن الهام گرفته شده بود. نسخه SunOS برنامه strace توسط Branko Lankester به لینوکس پورت شد و بهبود یافت؛ او همچنین پشتیبانی هسته لینوکس را برای آن نوشت. اگرچه Paul نسخه 2.5 برنامه strace را در سال ۱۹۹۲ منتشر کرد، اما کار Branko بر پایه نسخه 1.5 برنامه strace Paul در سال ۱۹۹۱ بود.
در سال ۱۹۹۳، Rick Sladkey پروژه را بر عهده گرفت. او strace 2.5 برای SunOS را با دومین انتشار strace برای لینوکس ادغام کرد، ویژگیهای زیادی را از truss(1) سیستمعامل SVR4 به آن افزود، و نسخهای از strace را تولید کرد که روی هر دو بستر کار میکرد. در سال ۱۹۹۴، Rick برنامه strace را به SVR4 و Solaris پورت کرد و پشتیبانی از پیکربندی خودکار را نوشت. در سال ۱۹۹۵ او strace را به Irix پورت کرد (و از نوشتن درباره خودش به صورت سوم شخص خسته شد).
از ابتدای سال ۱۹۹۶، نگهداری strace بر عهده Wichert Akkerman قرار گرفت. در طول دوران تصدی او، توسعه strace به CVS مهاجرت کرد؛ همچنین پورتها به FreeBSD و معماریهای متعددی در لینوکس (شامل ARM، IA-64، MIPS، PA-RISC، PowerPC، s390 و SPARC) ارائه شدند.
در سال ۲۰۰۲، مسئولیت نگهداری strace به Roland McGrath منتقل شد. از آن زمان، strace پشتیبانی از چندین معماری جدید لینوکس (AMD64، s390x، SuperH)، پشتیبانی از معماری دوگانه برای برخی از آنها، و افزودهها و بهبودهای بیشماری در رمزگشاهای فراخوانهای سیستمی در لینوکس به دست آورد؛ توسعه strace نیز در همان دوره به Git مهاجرت نمود.
از سال ۲۰۰۹، strace به صورت فعال توسط Dmitry Levin نگهداری میشود. در طول این مدت، strace پشتیبانی از معماریهای AArch64، ARC، AVR32، Blackfin، C-SKY، LoongArch، Meta، Nios II، OpenRISC 1000، RISC-V، Tile/TileGx و Xtensa را به دست آورده است. در سال ۲۰۱۲، پشتیبانی رهاشده و ظاهراً خراب از سیستمعاملهای غیرلینوکسی حذف شد. همچنین در سال ۲۰۱۲، strace پشتیبانی از ردگیری مسیر (path tracing) و رمزگشایی مسیر توصیفکننده فایل را به دست آورد. در سال ۲۰۱۴، پشتیبانی از چاپ ردپای پشته (stack trace) افزوده شد. در سال ۲۰۱۶، دستکاری فراخوانهای سیستمی (tampering) پیادهسازی شد.
برای اطلاعات بیشتر، لطفاً به فایل NEWS و گزارش ثبت تغییرات مخزن strace مراجعه کنید.
گزارش باگها (REPORTING BUGS)
مشکلات مربوط به strace باید به لیست پستی strace گزارش شوند..SH "همچنین ببینید (SEE ALSO)" strace-log-merge(1), ltrace(1), perf-trace(1), trace-cmd(1), time(1), ptrace(2), seccomp(2), syscall(2), proc(5), signal(7)
نویسندگان (AUTHORS)
فهرست کامل مشارکتکنندگان strace را میتوان در فایل CREDITS یافت.
| 2026-04-05 | strace 7.0 |