ควรใช้ strace อย่างไร?


273

เพื่อนร่วมงานเคยบอกฉันว่าตัวเลือกสุดท้ายเมื่อทุกอย่างล้มเหลวในการแก้ปัญหาในลินุกซ์คือการใช้strace

ฉันพยายามเรียนรู้วิทยาศาสตร์เบื้องหลังเครื่องมือแปลก ๆ นี้ แต่ฉันไม่ใช่กูรูผู้ดูแลระบบและฉันก็ไม่ได้ผลลัพธ์

ดังนั้น,

  • มันคืออะไรกันแน่และมันทำอะไร?
  • ควรใช้อย่างไรและในกรณีใด?
  • เอาต์พุตควรถูกเข้าใจและประมวลผลอย่างไร?

กล่าวโดยย่อในคำง่ายๆสิ่งนี้ทำงานอย่างไร


2
strace -p <pid> จะบอกคุณสิ่งที่เกิดขึ้นในขณะนี้กับโปรแกรมของคุณ ..... ที่ง่ายและรวดเร็วกว่า GDB
เออร์เนส

1
โดยส่วนตัวแล้วฉันman straceอ่านง่ายและมีประโยชน์ (PS ไม่เคยรู้เรื่อง strace มาก่อนเมื่อวานนี้และไม่ใช่ผู้เชี่ยวชาญ Linux)
Alexander Malakhov

1
"strace เป็นตัวเรียกการติดตามระบบ" - เพียงแสดงให้คุณเห็นว่าฟังก์ชันเคอร์เนลใดบ้างที่ถูกเรียก (ด้วยอาร์กิวเมนต์) ซึ่งเป็นผลมาจากโปรแกรมของคุณ
Pithikos

คำตอบ:


184

Strace ภาพรวมของ Strace
สามารถมองเห็นได้ในฐานะดีบักน้ำหนักเบา จะช่วยให้โปรแกรมเมอร์ / ผู้ใช้สามารถค้นหาวิธีที่โปรแกรมโต้ตอบกับระบบปฏิบัติการได้อย่างรวดเร็ว มันทำได้โดยการตรวจสอบการโทรและสัญญาณของระบบ

ใช้
ดีสำหรับเมื่อคุณไม่มีซอร์สโค้ดหรือไม่ต้องการที่จะใส่ใจกับมันจริงๆ
นอกจากนี้ยังมีประโยชน์สำหรับรหัสของคุณเองถ้าคุณไม่รู้สึกอยากเปิด GDB แต่สนใจที่จะเข้าใจการมีปฏิสัมพันธ์ภายนอก

การแนะนำเล็ก ๆ น้อย ๆ ที่ดี
ฉันวิ่งเข้าไปในบทนำเพื่อ strace ใช้เพียงวันอื่น: strace สวัสดีชาวโลก


แล้วถ้าคุณใช้บางอย่างที่อยู่ใต้เลเยอร์ที่ strace มอนิเตอร์ล่ะ?
Pacerier

ในกรณีที่การตรวจสอบ @Pacerier ltrace stackoverflow.com/a/52012215/5884955
prosti

เป็นการดีสำหรับการดีบักโปรแกรมระดับต่ำที่มีอยู่เท่านั้น / ส่วนใหญ่เพื่อทำการโทรของระบบที่น่าสนใจหรือทดลองกับตัวเลือกใหม่สำหรับ syscalls เพื่อดูว่าระบบปฏิบัติการของคุณทำอะไร โดยทั่วไปจะช่วยลดปัญหาในการเขียนรหัสการบันทึก / ตรวจสอบข้อผิดพลาดสำหรับการทดสอบแบบครั้งเดียว (หรือถ้าคุณเขียนด้วย asm หรือสิ่งที่มีโอกาสดีที่คุณบังเอิญผ่าน args ผิดหรือแม้แต่หมายเลขโทร) strace นั้นเร็วกว่า GDB มากเพราะมันจะดูโค้ด errno ให้คุณเช่น-EFAULT(oops, read-only บัฟเฟอร์) หรือ-ENOENT(อุ๊ปส์วิ่งจากไดเรกทอรีผิดที่เส้นทางสัมพัทธ์ไม่ทำงาน).
Peter Cordes

62

ในคำง่ายๆ strace ติดตามการเรียกใช้ระบบทั้งหมดที่ออกโดยโปรแกรมพร้อมกับรหัสส่งคืน นึกถึงสิ่งต่าง ๆ เช่นการทำงานของไฟล์ / ซ็อกเก็ตและสิ่งที่คลุมเครือมากขึ้น

มันจะมีประโยชน์มากที่สุดถ้าคุณมีความรู้เกี่ยวกับการทำงานของ C เนื่องจากที่นี่การเรียกใช้ระบบจะแม่นยำกว่าสำหรับการเรียกไลบรารี C มาตรฐาน

สมมติว่าโปรแกรมของคุณคือ / usr / local / bin / อาการไอ เพียงใช้:

strace /usr/local/bin/cough <any required argument for cough here>

หรือ

strace -o <out_file> /usr/local/bin/cough <any required argument for cough here>

เพื่อเขียนลงใน 'out_file'

เอาต์พุต strace ทั้งหมดจะไปที่ stderr (ระวังปริมาณที่แท้จริงของมันมักจะถามถึงการเปลี่ยนเส้นทางไปยังไฟล์) ในกรณีที่ง่ายที่สุดโปรแกรมของคุณจะยกเลิกด้วยข้อผิดพลาดและคุณจะสามารถดูได้ว่าสิ่งใดที่การโต้ตอบครั้งสุดท้ายกับระบบปฏิบัติการในเอาต์พุตแบบ strace

ควรมีข้อมูลเพิ่มเติมกับ:

man strace

36

strace แสดงการเรียกระบบทั้งหมดที่ดำเนินการโดยกระบวนการที่ใช้ หากคุณไม่รู้ว่าการโทรของระบบหมายถึงอะไรคุณจะไม่สามารถได้รับไมล์สะสมมากนัก

แต่ถ้าปัญหาของคุณเกี่ยวข้องกับไฟล์หรือเส้นทางหรือค่าสภาพแวดล้อมการทำงาน strace เกี่ยวกับโปรแกรมปัญหาและเปลี่ยนเส้นทางออกไปยังแฟ้มแล้ว grepping แฟ้มที่สำหรับเส้นทาง / แฟ้ม / สตริง env ของคุณอาจช่วยให้คุณเห็นสิ่งที่โปรแกรมของคุณเป็นจริงความพยายามที่จะ ทำแตกต่างจากสิ่งที่คุณคาดหวัง


7
และสำหรับโปรแกรมที่ไม่สำคัญนี่เป็นเหมือนการดื่มน้ำจากท่อดับเพลิงดังนั้นคุณจึงตัดงานของคุณออกเพื่อให้ได้ผลลัพธ์ ...
dmckee --- อดีตผู้ดูแลลูกแมว

17
strace <prog_name>เพื่อติดตามโปรแกรม strace -o <out_file> <prog_name>เพื่อนำไปใส่ในไฟล์
Jestin Joy

8
strace prog 2> & 1 | grep ^ เปิด \ (
eisbaw

10
หรือเพียงแค่: strace -e open myprogหรือสำหรับการเรียก sys ที่เกี่ยวข้องกับไฟล์ทั้งหมด:strace -e file myprog
Amit Naidu

17

Strace เป็นเครื่องมือสำหรับตรวจสอบระบบการผลิตที่คุณไม่สามารถเรียกใช้โปรแกรมเหล่านี้ได้ภายใต้ตัวดีบัก โดยเฉพาะอย่างยิ่งเราใช้ strace ในสองสถานการณ์ต่อไปนี้:

  • โปรแกรม foo ดูเหมือนจะหยุดชะงักและไม่ตอบสนอง นี่อาจเป็นเป้าหมายสำหรับ gdb; อย่างไรก็ตามเราไม่ได้มีซอร์สโค้ดเสมอหรือบางครั้งมีการใช้ภาษาสคริปต์ที่ไม่ได้ส่งต่อโดยตรงเพื่อทำงานภายใต้ดีบักเกอร์ ในกรณีนี้คุณรัน strace บนโปรแกรมที่รันอยู่แล้วและคุณจะได้รับรายการของการเรียกของระบบ สิ่งนี้มีประโยชน์อย่างยิ่งหากคุณกำลังตรวจสอบแอปพลิเคชันไคลเอนต์ / เซิร์ฟเวอร์หรือแอปพลิเคชันที่โต้ตอบกับฐานข้อมูล
  • ตรวจสอบสาเหตุที่โปรแกรมช้า โดยเฉพาะอย่างยิ่งเราเพิ่งย้ายไปยังระบบไฟล์แบบกระจายใหม่และปริมาณงานใหม่ของระบบช้ามาก คุณสามารถระบุ strace ด้วยตัวเลือก '-T' ซึ่งจะบอกคุณว่าใช้เวลาเท่าไรในการเรียกระบบแต่ละครั้ง สิ่งนี้ช่วยในการระบุสาเหตุที่ระบบไฟล์ทำให้สิ่งต่าง ๆ ช้าลง

สำหรับตัวอย่างของการวิเคราะห์โดยใช้ strace ดูคำตอบของฉันคำถามนี้


15

ฉันใช้ strace ตลอดเวลาเพื่อตรวจแก้ปัญหาการอนุญาต เทคนิคมีดังนี้:

$ strace -e trace=open,stat,read,write gnome-calculator

ในกรณีที่gnome-calculatorเป็นคำสั่งที่คุณต้องการที่จะทำงาน


8

strace -tfp PID จะตรวจสอบการเรียกระบบของกระบวนการ PID ดังนั้นเราจึงสามารถดีบัก / ตรวจสอบสถานะกระบวนการ / โปรแกรมของเรา


6

Strace สามารถใช้เป็นเครื่องมือดีบั๊กหรือเป็น profiler ดั้งเดิม

ในฐานะที่เป็นดีบักเกอร์คุณสามารถดูว่าการเรียกของระบบได้รับการเรียกใช้ดำเนินการและสิ่งที่พวกเขากลับมา สิ่งนี้สำคัญมากเพราะช่วยให้คุณเห็นไม่เพียง แต่โปรแกรมล้มเหลว แต่ทำไมโปรแกรมล้มเหลว โดยปกติแล้วมันเป็นเพียงผลมาจากการเขียนโปรแกรมหมัดไม่จับผลลัพธ์ที่เป็นไปได้ทั้งหมดของโปรแกรม บางครั้งมันก็เป็นเส้นทางที่ฮาร์ดโค้ดไปยังไฟล์ คุณจะเดาได้เลยว่าเกิดอะไรขึ้นที่ไหนและอย่างไร ด้วยสเตรปคุณจะเห็นตึกระฟ้าที่แตกหักโดยปกติแล้วการดูค่าส่งคืนจะบอกอะไรคุณมากมาย

การทำโปรไฟล์เป็นการใช้งานอื่น คุณสามารถใช้เพื่อดำเนินการตามเวลาของแต่ละ syscalls ทีละรายการหรือเป็นผลรวม ขณะนี้อาจไม่เพียงพอที่จะแก้ไขปัญหาของคุณอย่างน้อยก็จะแคบลงอย่างมากในรายการผู้ต้องสงสัยที่อาจเกิดขึ้น หากคุณเห็นคู่ fopen / close จำนวนมากในไฟล์เดียวคุณอาจเปิดและปิดไฟล์ทุกครั้งที่มีการประมวลผลของลูปโดยไม่จำเป็นแทนการเปิดและปิดนอกลูป

Ltrace เป็นลูกพี่ลูกน้องของ strace ที่มีประโยชน์มาก คุณต้องเรียนรู้ที่จะแยกความแตกต่างที่คอขวดของคุณอยู่ หากการประมวลผลรวมเป็น 8 วินาทีและคุณใช้เวลาเพียง 0.05 วินาทีในการเรียกใช้ระบบการบีบอัดโปรแกรมจะไม่ทำให้คุณดีมากปัญหาอยู่ในรหัสของคุณซึ่งโดยปกติจะเป็นปัญหาเชิงตรรกะหรือโปรแกรมต้องการจริงๆ เพื่อให้ใช้เวลานานในการทำงาน

ปัญหาที่ใหญ่ที่สุดกับ strace / ltrace กำลังอ่านผลลัพธ์ หากคุณไม่ทราบวิธีการโทรหรืออย่างน้อยชื่อของ syscalls / ฟังก์ชั่นมันจะยากที่จะถอดรหัสความหมาย การรู้ว่าฟังก์ชันใดที่ส่งคืนอาจมีประโยชน์มากโดยเฉพาะอย่างยิ่งสำหรับรหัสข้อผิดพลาดที่แตกต่างกัน แม้ว่ามันจะเป็นความเจ็บปวดในการถอดรหัส แต่บางครั้งพวกเขาก็กลับมาเป็นไข่มุกแห่งความรู้ เมื่อฉันเห็นสถานการณ์ที่ฉันหมด inodes แต่ไม่ว่างดังนั้นสาธารณูปโภคปกติไม่ได้เตือนฉันเลยฉันไม่สามารถสร้างไฟล์ใหม่ได้ การอ่านรหัสข้อผิดพลาดจากผลลัพธ์ของ strace นั้นชี้ให้ฉันไปในทิศทางที่ถูกต้อง


4

Strace เป็นเครื่องมือที่บอกคุณว่าแอปพลิเคชันของคุณโต้ตอบกับระบบปฏิบัติการของคุณอย่างไร

ทำได้โดยบอกระบบปฏิบัติการที่เรียกแอปพลิเคชันของคุณและพารามิเตอร์ที่เรียกว่าแอพพลิเคชั่น

ตัวอย่างเช่นคุณเห็นไฟล์ที่โปรแกรมของคุณพยายามเปิดและพยากรณ์การโทรสำเร็จ

คุณสามารถดีบักปัญหาได้ทุกประเภทด้วยเครื่องมือนี้ ตัวอย่างเช่นหากแอปพลิเคชันแจ้งว่าไม่พบไลบรารีที่คุณรู้ว่าคุณติดตั้งแล้วคุณ strace จะบอกคุณว่าแอปพลิเคชันค้นหาไฟล์นั้นอยู่ที่ไหน

และนั่นเป็นเพียงส่วนเล็ก ๆ ของภูเขาน้ำแข็ง


นี่แม่นยำมาก
prosti

4

strace เป็นเครื่องมือที่ดีสำหรับการเรียนรู้วิธีที่โปรแกรมของคุณทำการเรียกระบบต่าง ๆ (การร้องขอไปยังเคอร์เนล) และยังรายงานสิ่งที่ล้มเหลวพร้อมกับค่าความผิดพลาดที่เกี่ยวข้องกับความล้มเหลวนั้น ไม่ใช่ความล้มเหลวทั้งหมดเป็นข้อบกพร่อง ตัวอย่างเช่นรหัสที่พยายามค้นหาไฟล์อาจได้รับข้อผิดพลาด ENOENT (ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว) แต่อาจเป็นสถานการณ์ที่ยอมรับได้ในตรรกะของรหัส

กรณีการใช้งานที่ดีอย่างหนึ่งของการใช้ strace คือการดีบักสภาวะการแข่งขันระหว่างการสร้างไฟล์ชั่วคราว ตัวอย่างเช่นโปรแกรมที่อาจสร้างไฟล์โดยผนวก ID กระบวนการ (PID) ต่อท้ายสตริงที่คาดการณ์ไว้บางอย่างอาจประสบปัญหาในสถานการณ์แบบมัลติเธรด [A PID + TID (รหัสกระบวนการ + รหัสเธรด) หรือการเรียกระบบที่ดีขึ้นเช่น mkstemp จะแก้ไขปัญหานี้]

นอกจากนี้ยังเป็นสิ่งที่ดีสำหรับการแก้จุดบกพร่องล้มเหลว คุณอาจพบบทความ (ของฉัน) นี้เกี่ยวกับ strace และการดีบักล่มมีประโยชน์


4

ตัวอย่างที่เรียกใช้น้อยที่สุด

หากแนวคิดไม่ชัดเจนมีตัวอย่างที่ง่ายกว่าที่คุณไม่เคยเห็นที่อธิบาย

ในกรณีนี้ตัวอย่างนั้นเป็นชุดประกอบอิสระของ x86_64 (ไม่มี libc) สวัสดีชาวโลก:

hello.S

.text
.global _start
_start:
    /* write */
    mov $1, %rax    /* syscall number */
    mov $1, %rdi    /* stdout */
    mov $msg, %rsi  /* buffer */
    mov $len, %rdx  /* buffer len */
    syscall

    /* exit */
    mov $60, %rax   /* exit status */
    mov $0, %rdi    /* syscall number */
    syscall
msg:
    .ascii "hello\n"
len = . - msg

GitHub ต้นน้ำ

รวบรวมและเรียกใช้:

as -o hello.o hello.S
ld -o hello.out hello.o
./hello.out

ผลลัพธ์ที่คาดหวัง:

hello

ทีนี้ลองใช้ strace กับตัวอย่างนี้:

env -i ASDF=qwer strace -o strace.log -s999 -v ./hello.out arg0 arg1
cat strace.log

เราใช้:

strace.log ตอนนี้มี:

execve("./hello.out", ["./hello.out", "arg0", "arg1"], ["ASDF=qwer"]) = 0
write(1, "hello\n", 6)                  = 6
exit(0)                                 = ?
+++ exited with 0 +++

ด้วยตัวอย่างเล็ก ๆ น้อย ๆ นี้ตัวละครทุกตัวของเอาต์พุตจะปรากฏชัดในตัวเอง:

  • execveบรรทัด: แสดงวิธีstraceการดำเนินการhello.outรวมถึงข้อโต้แย้ง CLI และสภาพแวดล้อมตามที่บันทึกไว้ที่man execve

  • writeบรรทัด: แสดงการเรียกของระบบการเขียนที่เราทำ คือความยาวของสตริง6"hello\n"

    = 6คือค่าส่งคืนของการเรียกของระบบซึ่งตามที่ระบุไว้ในman 2 writeนั้นคือจำนวนไบต์ที่เขียน

  • exitบรรทัด: แสดงการเรียกของระบบทางออกที่เราได้ทำ ไม่มีค่าส่งคืนเนื่องจากโปรแกรมออก!

ตัวอย่างที่ซับซ้อนมากขึ้น

แอปพลิเคชันของ strace นั้นแน่นอนว่าจะเห็นว่าระบบที่เรียกว่าโปรแกรมที่ซับซ้อนกำลังทำอะไรอยู่เพื่อช่วยแก้ไขข้อบกพร่อง / เพิ่มประสิทธิภาพโปรแกรมของคุณ

โดยเฉพาะอย่างยิ่งระบบมากที่สุดเรียกว่าคุณมีแนวโน้มที่จะพบได้ในลินุกซ์ห่อ glibc, มากของพวกเขาจาก POSIX

ภายในเครื่องห่อหุ้ม glibc ใช้ชุดประกอบแบบอินไลน์มากหรือน้อยเช่นนี้: วิธีการเรียกใช้ระบบผ่าน sysenter ในชุดประกอบแบบอินไลน์ได้อย่างไร

ตัวอย่างถัดไปที่คุณควรศึกษาคือ POSIX writeสวัสดีชาวโลก:

main.c

#define _XOPEN_SOURCE 700
#include <unistd.h>

int main(void) {
    char *msg = "hello\n";
    write(1, msg, 6);
    return 0;
}

รวบรวมและเรียกใช้:

gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out

เวลานี้คุณจะเห็นว่ามีการเรียกใช้ระบบจำนวนมากโดย glibc ก่อนที่mainจะตั้งค่าสภาพแวดล้อมที่ดีสำหรับหลัก

นี่เป็นเพราะตอนนี้เราไม่ได้ใช้โปรแกรมอิสระ แต่เป็นโปรแกรม glibc ทั่วไปซึ่งช่วยให้สามารถใช้งาน libc ได้

จากนั้นที่ปลายทุกด้านstrace.logประกอบด้วย:

write(1, "hello\n", 6)                  = 6
exit_group(0)                           = ?
+++ exited with 0 +++

ดังนั้นเราจึงสรุปได้ว่าwriteฟังก์ชั่น POSIX ใช้, ประหลาดใจ!, การwriteเรียกระบบLinux

นอกจากนี้เรายังสังเกตได้ว่าreturn 0จะนำไปสู่การเรียกร้องแทนexit_group exitฮาฉันไม่รู้เกี่ยวกับอันนี้! นี่คือเหตุผลที่straceเจ๋งมาก man exit_groupจากนั้นอธิบาย:

การเรียกระบบนี้เทียบเท่ากับ exit (2) ยกเว้นว่ามันจะยุติไม่เพียง แต่การเรียกเธรดเท่านั้น แต่ยังรวมถึงเธรดทั้งหมดในกลุ่มเธรดของกระบวนการที่กำลังเรียกใช้

และนี่คืออีกตัวอย่างหนึ่งที่ฉันศึกษาว่าการเรียกdlopenใช้ระบบใด: /unix/226524/what-system-call-is-used-to-load-library-in-linux/466524/what-system-call-is-used-to-load-library-in-linux/462710#462710

ทดสอบใน Ubuntu 16.04, GCC 6.4.0, Linux kernel 4.4.0


2

นี่คือตัวอย่างของวิธีที่ฉันใช้ strace เพื่อขุดเข้าไปในเว็บไซต์ หวังว่านี่จะเป็นประโยชน์

ตรวจสอบเวลาเป็นไบต์แรกเช่น:

time php index.php > timeTrace.txt

ดูว่าการกระทำของคุณกำลังทำอะไรอยู่ มีจำนวนมากlstatและfstatอาจเป็นตัวบ่งชี้ว่าถึงเวลาที่จะล้างแคช:

strace -s 200 -c php index.php > traceLstat.txt

ส่งออก a trace.txtเพื่อให้คุณสามารถเห็นสิ่งที่โทรทำ

strace -Tt -o Fulltrace.txt php index.php

ใช้นี้เพื่อตรวจสอบว่าอะไรเอาระหว่าง.1การ.9วินาทีในการโหลด:

cat Fulltrace.txt | grep "[<]0.[1-9]" > traceSlowest.txt

straceดูว่ามีอะไรขาดหายไปไฟล์หรือไดเรกทอรีถูกจับได้ใน สิ่งนี้จะเอาท์พุทจำนวนมากที่เกี่ยวข้องกับระบบของเรา - บิตที่เกี่ยวข้องเท่านั้นที่เกี่ยวข้องกับไฟล์ของลูกค้า:

strace -vv php index.php 2>&1 | sed -n '/= -1/p' > traceFailures.txt

1

ฉันชอบคำตอบบางส่วนที่straceตรวจสอบว่าคุณโต้ตอบกับระบบปฏิบัติการของคุณอย่างไร

นี่คือสิ่งที่เราเห็น ระบบเรียก ถ้าคุณเปรียบเทียบstraceและltraceความแตกต่างที่ชัดเจนมากขึ้น

$>strace -c cd
Desktop  Documents  Downloads  examples.desktop  Music  Pictures  Public  Templates  Videos
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0         7           read
  0.00    0.000000           0         1           write
  0.00    0.000000           0        11           close
  0.00    0.000000           0        10           fstat
  0.00    0.000000           0        17           mmap
  0.00    0.000000           0        12           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         2           ioctl
  0.00    0.000000           0         8         8 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         2           getdents
  0.00    0.000000           0         2         2 statfs
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         9           openat
  0.00    0.000000           0         1           set_robust_list
  0.00    0.000000           0         1           prlimit64
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                    93        10 total

ในทางกลับกันก็มีltraceฟังก์ชั่นการติดตาม

$>ltrace -c cd
Desktop  Documents  Downloads  examples.desktop  Music  Pictures  Public  Templates  Videos
% time     seconds  usecs/call     calls      function
------ ----------- ----------- --------- --------------------
 15.52    0.004946         329        15 memcpy
 13.34    0.004249          94        45 __ctype_get_mb_cur_max
 12.87    0.004099        2049         2 fclose
 12.12    0.003861          83        46 strlen
 10.96    0.003491         109        32 __errno_location
 10.37    0.003303         117        28 readdir
  8.41    0.002679         133        20 strcoll
  5.62    0.001791         111        16 __overflow
  3.24    0.001032         114         9 fwrite_unlocked
  1.26    0.000400         100         4 __freading
  1.17    0.000372          41         9 getenv
  0.70    0.000222         111         2 fflush
  0.67    0.000214         107         2 __fpending
  0.64    0.000203         101         2 fileno
  0.62    0.000196         196         1 closedir
  0.43    0.000138         138         1 setlocale
  0.36    0.000114         114         1 _setjmp
  0.31    0.000098          98         1 realloc
  0.25    0.000080          80         1 bindtextdomain
  0.21    0.000068          68         1 opendir
  0.19    0.000062          62         1 strrchr
  0.18    0.000056          56         1 isatty
  0.16    0.000051          51         1 ioctl
  0.15    0.000047          47         1 getopt_long
  0.14    0.000045          45         1 textdomain
  0.13    0.000042          42         1 __cxa_atexit
------ ----------- ----------- --------- --------------------
100.00    0.031859                   244 total

แม้ว่าฉันจะตรวจสอบคู่มือหลายครั้ง แต่ฉันไม่พบที่มาของชื่อstraceแต่เป็นไปได้ว่าการติดตามการโทรของระบบเนื่องจากมีความชัดเจน

straceมีโน้ตสามที่ใหญ่กว่าที่จะพูดเกี่ยวกับการเป็น

หมายเหตุ 1: ทั้งสองฟังก์ชั่นเหล่านี้straceและมีการใช้ระบบการโทรltrace ptraceดังนั้นptraceการเรียกระบบมีประสิทธิภาพวิธีstraceการทำงาน

การเรียกใช้ระบบ ptrace () จัดให้มีวิธีการหนึ่งกระบวนการ ("ผู้ติดตาม") อาจสังเกตและควบคุมการดำเนินการของกระบวนการอื่น ("การติดตาม") และตรวจสอบและเปลี่ยนหน่วยความจำและการลงทะเบียนของร่องรอย ส่วนใหญ่จะใช้ในการใช้การดีบักเบรกพอยต์และการติดตามการโทรของระบบ

หมายเหตุ 2: มีพารามิเตอร์ที่แตกต่างกันคุณสามารถใช้กับstraceเนื่องจากstraceสามารถ verbose มาก ฉันชอบที่จะทดสอบ-cซึ่งเป็นเหมือนบทสรุปของสิ่งต่าง ๆ ขึ้นอยู่กับ-cว่าคุณสามารถเลือกหนึ่งการโทรของระบบเหมือน-e trace=openที่คุณจะเห็นเฉพาะการโทรนั้น สิ่งนี้น่าสนใจหากคุณตรวจสอบว่าจะเปิดไฟล์ใดในระหว่างคำสั่งที่คุณกำลังติดตาม และแน่นอนคุณสามารถใช้grepเพื่อจุดประสงค์เดียวกันได้ แต่โปรดทราบว่าคุณต้องเปลี่ยนเส้นทางเช่นนี้2>&1 | grep etcเพื่อทำความเข้าใจว่าไฟล์อ้างอิงนั้นถูกอ้างอิงเมื่อคำสั่งถูกใช้

หมายเหตุ 3: ฉันพบบันทึกย่อที่สำคัญมากนี้ คุณไม่ได้ จำกัด อยู่ที่สถาปัตยกรรมเฉพาะ straceจะทำให้คุณรังเกียจเพราะมันสามารถติดตามไบนารีของสถาปัตยกรรมที่แตกต่างกัน ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.