Files
BUT2FI_2026_R3.05/tp/tp1/src/scripts/pmap_full.py
T

54 lines
1.5 KiB
Python
Raw Normal View History

2026-09-03 07:32:05 +02:00
#!/usr/bin/env python3
import sys
import re
if len(sys.argv) < 2:
print(f"Usage: {sys.argv[0]} <PID>")
sys.exit(1)
pid = sys.argv[1]
try:
with open(f"/proc/{pid}/smaps", "r") as f:
lines = f.readlines()
except FileNotFoundError:
print(f"Erreur : le processus {pid} n'existe pas.")
sys.exit(1)
except PermissionError:
print("Erreur : permissions insuffisantes (utilise sudo).")
sys.exit(1)
# Entête identique à pmap -x
print(f"{pid}: [analyse smaps complète]")
print(f"{'Address':<16} {'Kbytes':>8} {'RSS':>8} {'Dirty':>8} {'Mode':<5} {'Mapping'}")
print("-" * 65)
total_size = 0
total_rss = 0
total_dirty = 0
addr, mode, mapping = "", "", ""
size, rss, dirty = 0, 0, 0
for line in lines:
# Ligne d'entête de segment mémoire (ex: 7ffe12340000-7ffe12361000 rw-p ...)
if re.match(r"^[0-9a-f]", line):
parts = line.split(maxsplit=5)
addr = parts[0].split("-")[0].zfill(16)
mode = parts[1]
mapping = parts[5].strip() if len(parts) > 5 else "[ anon ]"
elif line.startswith("Size:"):
size = int(line.split()[1])
elif line.startswith("Rss:"):
rss = int(line.split()[1])
elif line.startswith("Private_Dirty:"):
dirty = int(line.split()[1])
# Fin de la lecture des métriques clés du segment -> Affichage
print(f"{addr:<16} {size:>8} {rss:>8} {dirty:>8} {mode:<5} {mapping}")
total_size += size
total_rss += rss
total_dirty += dirty
print("-" * 65)
print(f"{'total kB':<16} {total_size:>8} {total_rss:>8} {total_dirty:>8}")