שיעור 24: strace ו-ltrace — מעקב אחרי System Calls
תוכנה שתקועה, איטית או מתנהגת בצורה מוזרה — איך מתחילים לחקור? strace הוא המיקרוסקופ של מהנדסי Linux: הוא יורט כל system call שתוכנה עושה ומציג אותו בזמן-אמת. ltrace עושה אותו דבר ל-library calls. ב-NVIDIA, כשתוכנת GPU נתקעת, strace מגלה על איזה ioctl() היא חסומה — ה-CUDA driver משתמש ב-ioctl לכל פע
דמיינו שאתם עוקבים אחרי ילד ומרשמים כל פעולה שהוא עושה: פתח דלת, לקח כוס, שתה מים, סגר דלת. זה strace — הוא כותב בדיוק כל 'פעולה' שהתוכנה מבקשת מה-kernel לעשות. אם הילד עומד דקה שלמה מול דלת סגורה ולא ממשיך — זה בדיוק מה ש-strace מראה: 'התוכנה חסומה על open() כבר דקה'.
- strace
- כלי Linux שמיירט ומציג את כל ה-system calls שתוכנה מבצעת בזמן-אמת. משתמש ב-ptrace() syscall של ה-kernel. חיוני לדיבוג תוכניות תקועות, קריסות ובעיות הרשאות.
- ltrace
- כלי דומה ל-strace אך מתמקד ב-library calls (libc, libm וכד') במקום ב-system calls ישירים. מאפשר לראות קריאות כמו malloc(), printf(), fopen() ברמת הספרייה.
- system call (syscall)
- ממשק בין תוכנת משתמש לבין ה-kernel. כל פעולה מוסדרת (קריאת קובץ, יצירת socket, הקצאת זיכרון מ-OS) עוברת syscall. strace מראה את כולם.
- ioctl
- syscall כללי ל-device control. ה-CUDA driver חושף את כל פעולות ה-GPU (הקצאת VRAM, הרצת kernel, sNVLink) דרך ioctl(). strace על תוכנת CUDA יציג עשרות ioctl calls.
- ptrace
- ה-syscall שעליו strace בנוי. מאפשר לתהליך אחד לפקח, לעצור ולבדוק תהליך אחר. debuggers כמו gdb גם הם משתמשים ב-ptrace.