เทียบเท่ากับ "truss -T" และ "truss -U" บน Linux หรือไม่


12

มีเทียบเท่าของสิ่งที่-Tและ-Uตัวเลือกของtrussยูทิลิตี้ Solaris ไม่เกี่ยวกับลินุกซ์

สิ่งเหล่านี้คือการระบุการเรียกของระบบ ( -T) หรือฟังก์ชั่นห้องสมุด ( -U) ซึ่งเมื่อเรียกใช้โดยแอปพลิเคชันที่ติดตามจะทำให้เกิดการหยุด

หรือกล่าวเป็นอย่างอื่นฉันต้องการให้กระบวนการใด ๆ ที่เริ่มต้นโดยแอปพลิเคชันที่ติดตามแล้วหยุดทำงาน (ราวกับถูกฆ่าโดย SIGSTOP) ทันทีที่ทำการเรียกระบบหรือการเรียกฟังก์ชั่นไลบรารีที่แชร์

straceและltraceบน Linux นั้นมีชุดฟีเจอร์มากมายของ Solaris trussแต่พวกเขาดูเหมือนจะไม่ทำเช่นนั้น

ตัวอย่างเช่น

truss -f -T open cmd

จะเป็นเช่นstrace -f cmdนั้นยกเว้นว่าหากกระบวนการที่ดำเนินการcmdหรือลูกหลานของมันopenเรียกระบบใด ๆมันจะหยุดทันที (และฉันสามารถดำเนินการต่อในภายหลังได้ตามความสะดวกของฉัน)

ในบางกรณีฉันสามารถใช้งานgdbได้catch syscallแต่ฉันกำลังมองหาวิธีแก้ปัญหาที่สามารถติดตามส้อมได้อย่างสะดวกและดำเนินการต่อสำหรับกระบวนการทางแยกทั้งหมดและทำexecveต่อไปเรื่อย ๆ

ดูเหมือนว่าฉันจะเรียกคืนยูทิลิตี้บางอย่างที่ให้ฟังก์ชั่นเดียวกันแม้แต่หนึ่ง (หรือตัวเลือกสำหรับยูทิลิตี้เดียวกันนั้น) ไปยังแอปพลิเคชันขั้นตอนเดียวระหว่างบางเหตุการณ์ของ syscall บางระยะไกลเช่นนั้น แต่หน่วยความจำของฉัน ที่อยู่บน Linux


1
ไม่ใช่คำตอบสำหรับคำถามของคุณ แต่ gdb มีตัวเลือกบางอย่างสำหรับการติดตามส้อมมันไม่ได้ปิดการใช้งาน execve มันยังคงทำเพียงกระบวนการเดียวในแต่ละครั้งซึ่งอาจเป็นตัวแบ่งข้อตกลงหากคุณกำลังมองหาฟังก์ชั่นที่เหมือน strace แต่ฉันคิดว่าฉันจะพูดถึงมันในกรณี
Bratchley

@ JoelDavis ขอบคุณ และดูเหมือนว่ายังสามารถติดตามได้หลังจาก exec, ( follow-exec-mode) ฉันกำลังทดลองกับมัน ไม่ตอบคำถามอย่างเคร่งครัด แต่อาจดีพอสำหรับสิ่งที่ฉันต้องการ
Stéphane Chazelas

หากฉันเข้าใจคำถามของคุณว่าคุณกำลังมองหาวิธีในการติดตามจนกว่าจะเห็นสัญญาณเฉพาะแล้วหยุดติดตามไม่หยุดหรือฆ่าแอปพลิเคชันที่คุณติดตามไม่ว่าด้วยวิธีใดใช่ไหม
slm

@slm ไม่ฉันต้องการให้กระบวนการเริ่มต้นโดยแอปพลิเคชันที่ติดตามแล้วหยุดทำงาน (ราวกับถูกฆ่าโดย SIGSTOP) ทันทีที่ทำการเรียกระบบ ฉันได้เพิ่มลิงค์ไปยังหน้าโซลาริtruss
Stéphane Chazelas

ให้ฉันแน่ใจว่าฉันเข้าใจถูกต้อง คุณต้องการวิธีหยุดกระบวนการเมื่อสร้าง systemcall เฉพาะ ถูกต้องหรือไม่
sparticvs

คำตอบ:


3

ที่ดีที่สุดของความรู้ของฉันนี้จะไม่สามารถทำได้ด้วยstraceการptraceฟังก์ชั่นที่ใช้ภายในไม่SIGSTOPหรือSIGINTโทร

แก้ไข:

ฉันใส่โซลูชันง่าย ๆ นี้ลงในministraceดังนั้นจึงไม่จำเป็นต้องมีการเข้ารหัส

โซลูชั่นที่นำเสนอของฉันถ้าไม่ทั้งหมดการทำงานของ strace เป็นสิ่งจำเป็นที่จะปรับเปลี่ยน ministrace - ซึ่งผมพบว่าที่นี่เขียนตัวเอง strace ใน 70 สายรหัส

ในโปรแกรม shot หนึ่งคุณสามารถเพิ่มสองบรรทัดก่อนรหัสต่อไปนี้:

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

รหัสหลอก:

if(syscall == SYS_write)
    do {
        char str[4];
        gets(str);  // waits until enter to continue    
    } while(0);

ฉันไม่ได้ทดสอบสิ่งใดเลยขั้นตอนสุดท้ายเหล่านี้เหลือไว้ให้คุณ


ขอบคุณ มันใช้งานได้และลิงค์นั้นมีประโยชน์มาก อย่างไรก็ตาม (เข้าใจได้ในโค้ดไม่กี่บรรทัด) มันไม่ได้ทำการถอดรหัส arg ที่ gdb / strace ทำดังนั้นจะไม่มีประโยชน์สำหรับจุดประสงค์ของฉัน มันแสดงให้เห็นว่ามันทำได้ง่าย ฉันไปเพื่อ gdb ในที่สุด แต่ดูเหมือนว่าการแก้ไข strace สำหรับคุณลักษณะนั้นจะค่อนข้างง่าย เปิดคำถามทิ้งไว้เนื่องจากฉันสงสัยว่ามีคำสั่งที่มีอยู่ให้ทำเช่นนั้น ฉันจะดู python-ptrace เมื่อฉันมีเวลา
Stéphane Chazelas

ยินดีต้อนรับคุณ! ฉันใช้ความรู้ไปเล็กน้อยในการขยายการใช้งานดังนั้นจึงเป็นไปได้ที่จะอ้างอิง syscall ด้วย id และชื่อ มันสนุกที่ได้เล่นกับ ptrace อีกครั้ง
Daniël W. Crompton

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