มีวิธีดักจับการสื่อสารระหว่างกระบวนการใน Unix / Linux หรือไม่?


15

สำหรับ intercepting / การวิเคราะห์เครือข่ายการจราจรเรามียูทิลิตี้ที่เรียกว่าWireshark

เรามียูทิลิตีที่คล้ายกันเพื่อสกัดกั้นการสื่อสารระหว่างกระบวนการทั้งหมดระหว่างสองกระบวนการใน Unix / Linux หรือไม่?

ฉันได้สร้างกระบวนการบางอย่างในหน่วยความจำและฉันต้องการโปรไฟล์ว่าพวกเขาสื่อสารกันอย่างไร


1
กลไก IPC ใดที่คุณใช้เพื่อการสื่อสาร
axel_c

@axel_c: แหล่งที่มาของกระบวนการไม่ได้อยู่กับฉัน แต่ฉันคิดว่าฉันอ่าน "หน่วยความจำที่ใช้ร่วมกัน" ที่ไหนสักแห่งในเอกสาร
Lazer

คำตอบ:


19

ขึ้นอยู่กับกลไกการสื่อสารเป็นอย่างมาก

  • ในตอนท้ายของสเปกตรัมโปร่งใสกระบวนการสามารถสื่อสารโดยใช้ซ็อกเก็ตอินเทอร์เน็ต (เช่นIP ) จากนั้น wireshark หรือ tcpdump สามารถแสดงทราฟฟิกทั้งหมดโดยชี้ไปที่อินเตอร์เฟสลูปแบ็ค

  • ในระดับกลางการจราจรบนท่อและซ็อกเก็ตยูนิกซ์สามารถสังเกตได้ด้วยtruss/ strace/ trace/ ... , คลั่งกองทัพสวิสของการติดตามระบบ สิ่งนี้สามารถทำให้กระบวนการช้าลงอย่างมากอย่างไรก็ตามอาจไม่เหมาะสำหรับการทำโปรไฟล์

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

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


6

นี่จะแสดงสิ่งที่กระบวนการอ่านและเขียน:

strace -ewrite -p $PID

มันไม่ได้ล้างผลลัพธ์ (แสดงบรรทัดที่ชอบ: เขียน (#,)) แต่ใช้งานได้! (และเป็นบรรทัดเดียว: D) คุณอาจไม่ชอบความจริงที่ว่าอาร์กิวเมนต์นั้นเป็นตัวย่อ เพื่อควบคุมว่าใช้พารามิเตอร์ -s ที่ตั้งค่าความยาวสูงสุดของสตริงที่แสดง

มันจับกระแสทั้งหมดดังนั้นคุณอาจต้องการที่จะกรองอย่างใด

คุณสามารถกรอง:

strace -ewrite -p $PID 2>&1 | grep "write(1"

แสดงการโทร descriptor 1 รายการเท่านั้น 2> & 1 คือการเปลี่ยนเส้นทาง stderr ไปยัง stdout เนื่องจาก strace เขียนไปยัง stderr โดยค่าเริ่มต้น

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