Όταν τα προγράμματα που εκτελούνται σε Linux θέλουν να χρησιμοποιήσουν τους πόρους που διαχειρίζεται το λειτουργικό σύστημα (ανάγνωση αρχείων, δημιουργία διεργασιών κ.λπ.), πραγματοποιούν κλήσεις συστήματος στο λειτουργικό σύστημα. Οι κλήσεις συστήματος λειτουργούν σε επίπεδο πυρήνα και εκτελούν τις απαραίτητες λειτουργίες, αφήνοντας τον έλεγχο πίσω στο πρόγραμμα κλήσης. Το εργαλείο strace παρέχει τη δυνατότητα εντοπισμού αυτών των κλήσεων συστήματος στο Linux.
Τυπική χρήση της εντολής strace
Για να παρακολουθήσετε τις κλήσεις συστήματος για μια εφαρμογή, απλώς επικαλέστε την εντολή με στρας στην παρακάτω μορφή:
strace ls /tmp
Ωστόσο, συχνά υπάρχουν διαδικασίες που ξεκινούν πολύ νωρίτερα και συνεχίζουν να λειτουργούν στο παρασκήνιο. Λόγω τυχόν προβλημάτων, μπορεί να θέλετε να συλλέξετε πρόσθετες πληροφορίες που σχετίζονται με τέτοιες διαδικασίες. Μπορείτε να επισυνάψετε στρας σε οποιαδήποτε εφαρμογή που εκτελείται δίνοντας το αναγνωριστικό διεργασίας της διαδικασίας στο -Π παράμετρος:
strace -p 2759
Παραγωγή:
Παρακολουθήστε τα νήματα και τα πιρούνια μιας εφαρμογής
Με το strace, μπορείτε να ελέγξετε όλα τα νήματα και άλλες θυγατρικές διεργασίες που αποτελούν διχάλα της εφαρμογής χρησιμοποιώντας το -φά σημαία.
strace -f -p 2759
Παραγωγή:
Ελέγξτε ορισμένες κλήσεις συστήματος με strace
Η προεπιλεγμένη έξοδος γραμμών μπορεί να είναι αρκετά γεμάτη για να την ακολουθήσετε κατά καιρούς. Εάν θέλετε να παρακολουθείτε μόνο συγκεκριμένες κλήσεις συστήματος, μπορείτε να το κάνετε με το -μι παράμετρος:
strace -f -e trace=άνοιγμα, εγγραφή, κλείσιμο, σύνδεση,επιλέγω -Π 19770
Για να εντοπίσετε μόνο κλήσεις συστήματος που σχετίζονται με λειτουργίες αρχείων, χρησιμοποιήστε το -e trace=αρχείο:
strace -e trace=file -p 19770
Για να φιλτράρετε μόνο κλήσεις συστήματος που σχετίζονται με το δίκτυο, καθορίστε -e trace=δίκτυο στην εντολή:
strace -e trace=δίκτυο -p 19770
Λάβετε πληροφορίες ώρας σε δευτερόλεπτα
Κατά την έξοδο κλήσεων συστήματος, μπορείτε να χρησιμοποιήσετε το -τ παράμετρος για να λαμβάνετε πληροφορίες χρόνου με ακρίβεια σε δευτερόλεπτα. Τις περισσότερες φορές η ακρίβεια δεν θα είναι αρκετή για τις ανάγκες σας. Σε τέτοιες περιπτώσεις, μπορείτε να χρησιμοποιήσετε το -tt παράμετρος για να λάβετε πληροφορίες χρόνου με ακρίβεια μικροδευτερόλεπτου:
strace -tt ls /tmp
Συλλέξτε στατιστικά στοιχεία σχετικά με τις κλήσεις συστήματος
Με το -ντο παράμετρο, μπορείτε να συλλέξετε στατιστικά στοιχεία για κλήσεις συστήματος για όσο διάστημα θέλετε:
strace -f -c -p 19770
Αποθήκευση αρχείων καταγραφής σε ένα αρχείο
Εάν εκτελείτε το strace για μεγάλο χρονικό διάστημα και θέλετε να εξετάσετε τα αρχεία καταγραφής που προκύπτουν με περισσότερες λεπτομέρειες αργότερα, θα πρέπει να αποθηκεύσετε τα αρχεία καταγραφής. Με το -ο παράμετρος μπορείτε να καθορίσετε το αρχείο στο οποίο η γραμμή πρέπει να αποθηκεύει τα αρχεία καταγραφής:
strace -f -o /tmp/strace.log -e trace=file 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 | Περιορισμένο ίχνος: Μόνο ο άμεσος γονέας της εφαρμογής ή οι εφαρμογές εντοπισμού σφαλμάτων επιτρέπεται από την εφαρμογή με το PR_SET_PTRACER η επιλογή έχει τον έλεγχο. Έτσι, οι χρήσεις του όνομα_προγράμματος gdb και strace program_name θα συνεχίσει να λειτουργεί, αλλά δεν θα μπορείτε να επισυνάψετε μια εφαρμογή που εκτελείται στη συνέχεια. |
2 | Ptrace στον διαχειριστή του συστήματος: Μόνο εφαρμογές με καθορισμένα CAP_SYS_PTRACE ιδιοκτησία ή θυγατρικές διεργασίες που ορίζουν το PTRACE_TRACEME επιλογή με prctl μπορεί να ελεγχθεί. |
3 | Εντελώς απενεργοποιημένο: Οχι ptrace επιτρέπεται υπό οποιεσδήποτε συνθήκες. Εάν αυτή η ιδιότητα οριστεί μία φορά, δεν μπορείτε να την αλλάξετε ξανά κατά το χρόνο εκτέλεσης. |
Πολλοί προγραμματιστές δεν γνωρίζουν ότι οι εφαρμογές μπορούν να απενεργοποιήσουν μόνες τους το ptrace μέσω prctl, εκτός από τον χρήστη root. Παρόλο που το λογισμικό που σχετίζεται με την ασφάλεια, όπως ο πράκτορας OpenSSH, εκτελεί αυτές τις λειτουργίες, δεν θα ήταν σωστό να περιμένουμε την ίδια συμπεριφορά από όλο το λογισμικό που εκτελείται στο σύστημα.
Πρόσφατα, μερικές διανομές Linux έχουν αρχίσει να ορίζουν την προεπιλεγμένη τιμή του ptrace_scope αρχείο, που περιγράφεται παραπάνω, σε 1. Έτσι, με περιορισμένες λειτουργίες ptrace, παρέχεται ένα ασφαλέστερο περιβάλλον εργασίας σε όλο το σύστημα.
Χρήση παραδείγματος χάραξης
Καταχωρίστε το δείγμα αίτησης παρακάτω με το όνομα ministrace.γ. Στη συνέχεια, μπορείτε να το μεταγλωττίσετε με την ακόλουθη εντολή:
gcc-ουπουργείουπουργείο.ντο
Κώδικας:
#περιλαμβάνω <sys/ptrace.h>
#περιλαμβάνω <sys/reg.h>
#περιλαμβάνω <sys/wait.h>
#περιλαμβάνω <sys/types.h>
#περιλαμβάνω <unistd.χ>
#περιλαμβάνω <stdlib.h>
#περιλαμβάνω <stdio.h>
#περιλαμβάνω <λάθος.η>
#περιλαμβάνω <χορδή.χ>
ενθwait_for_sycall(pid_t παιδί)
{
ενθ κατάσταση;
ενώ (1) {
ptrace (PTRACE_SYSCALL, παιδί, 0, 0);
αναμονή (παιδί, &κατάσταση, 0);
εάν (WIFSTOPPED(κατάσταση) && WSTOPSIG(κατάσταση) & 0x80)
ΕΠΙΣΤΡΟΦΗ0;
εάν (WIFEXITED(κατάσταση))
ΕΠΙΣΤΡΟΦΗ1;
}
}ενθdo_child(ενθ argc, απανθρακώνω **argv)
{
απανθρακώνω *args [argc+1];
memcpy (args, argv, argc * sizeof(απανθρακώνω*));
args[argc] = ΜΗΔΕΝΙΚΟ;
ptrace (PTRACE_TRACEME);
σκοτώνω(getpid(), SIGSTOP);
ΕΠΙΣΤΡΟΦΗ execvp (args[0], args);
}ενθdo_trace(pid_t παιδί)
{
ενθ status, syscall, retval;
αναμονή (παιδί, &κατάσταση, 0);
ptrace (PTRACE_SETOPTIONS, παιδί, 0, PTRACE_O_TRACESYSGOOD);
ενώ(1) {
αν (wait_for_sycall (παιδί) != 0) Διακοπή;syscall = ptrace (PTRACE_PEEKUSER, παιδί, sizeof(μακρύς)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", syscall);αν (wait_for_sycall (παιδί) != 0) Διακοπή;
retval = ptrace (PTRACE_PEEKUSER, παιδί, sizeof(μακρύς)*RAX);
fprintf (stderr, "%ρε
", retval);
}
ΕΠΙΣΤΡΟΦΗ0;
}
ενθκύριος(ενθ argc, απανθρακώνω **argv)
{
εάν (argc < 2) {
fprintf (stderr, "Χρήση: %s prog args
", argv[0]);
έξοδος(1);
}
pid_t παιδί = fork();
αν (παιδί == 0) {
ΕΠΙΣΤΡΟΦΗ do_child (argc-1, argv+1);
} αλλού {
ΕΠΙΣΤΡΟΦΗ do_trace (παιδί);
}
}
Μετά τη μεταγλώττιση της εφαρμογής, μπορείτε να εκτελέσετε οποιαδήποτε εντολή με υπουργείο και εξετάστε την έξοδο:
Μπορείτε να χρησιμοποιήσετε το strace για πολλούς σκοπούς
Το strace μπορεί να βοηθήσει στην εύρεση σφαλμάτων σε προγράμματα που χρησιμοποιούν άσκοπα πόρους του συστήματος. Ομοίως, το χαρακτηριστικό που παρουσιάζει ένα πρόγραμμα κατά τη χρήση πόρων του λειτουργικού συστήματος μπορεί επίσης να αποκαλυφθεί με strace.
Εφόσον το strace ακούει απευθείας τις κλήσεις συστήματος, μπορεί να αποκαλύψει τη δυναμική του χρόνου εκτέλεσης ανεξάρτητα από το αν ο κώδικας του προγράμματος που εκτελείται είναι ανοιχτός/κλειστός. Είναι δυνατό να πάρετε μια ιδέα για το γιατί τα προγράμματα παρουσιάζουν ένα σφάλμα όταν άρχισαν να χρησιμοποιούν το strace.
Ομοίως, το strace σάς βοηθά να κατανοήσετε γιατί ένα πρόγραμμα τερματίζεται απροσδόκητα. Επομένως, η εξοικείωση με το strace είναι πολύ σημαντική για την ανάπτυξη πυρήνα Linux και τη διαχείριση συστήματος.
Δημιουργήστε το δικό σας λειτουργικό σύστημα με Linux από την αρχή [Linux]
Διαβάστε Επόμενο
Σχετικά θέματα
- Linux
- Εντολές Linux
- Πυρήνας Linux
Σχετικά με τον Συγγραφέα

Ένας μηχανικός και προγραμματιστής λογισμικού που είναι λάτρης των μαθηματικών και της τεχνολογίας. Πάντα του άρεσαν οι υπολογιστές, τα μαθηματικά και η φυσική. Έχει αναπτύξει έργα μηχανών παιχνιδιών καθώς και μηχανική μάθηση, τεχνητά νευρωνικά δίκτυα και βιβλιοθήκες γραμμικής άλγεβρας. Επιπλέον, συνεχίζει να εργάζεται σε μηχανική μάθηση και γραμμικούς πίνακες.
Εγγραφείτε στο ενημερωτικό μας δελτίο
Εγγραφείτε στο ενημερωτικό μας δελτίο για συμβουλές τεχνολογίας, κριτικές, δωρεάν ebook και αποκλειστικές προσφορές!
Κάντε κλικ εδώ για να εγγραφείτε