#!/usr/bin/env python3 import sys import re if len(sys.argv) < 2: print(f"Usage: {sys.argv[0]} ") 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}")