#!/usr/bin/env python3 """Debug TUI flow update process to find frame 2002/298 issue""" import sys sys.path.append('.') from analyzer.analysis import EthernetAnalyzer from analyzer.analysis.background_analyzer import BackgroundAnalyzer import time def debug_tui_flow_updates(pcap_file="1 PTPGM.pcapng", src_ip="192.168.4.89"): """Debug TUI flow update process""" print("=== Debugging TUI Flow Update Process ===") # Create analyzer exactly like TUI does analyzer = EthernetAnalyzer(enable_realtime=False, outlier_threshold_sigma=3.0) # Track flow updates like TUI does update_count = 0 outlier_snapshots = [] def flow_update_callback(): nonlocal update_count, outlier_snapshots update_count += 1 # Capture outlier state at each update (like TUI does) try: flows = bg_analyzer.get_current_flows() for flow in flows.values(): if flow.src_ip == src_ip: # Check for problematic outliers at each update for frame_type, ft_stats in flow.frame_types.items(): if hasattr(ft_stats, 'enhanced_outlier_details') and ft_stats.enhanced_outlier_details: for frame_num, prev_frame_num, delta_t in ft_stats.enhanced_outlier_details: # Look for the problematic case if frame_num == 2002 or prev_frame_num == 298: outlier_snapshots.append({ 'update': update_count, 'frame_type': frame_type, 'frame_num': frame_num, 'prev_frame_num': prev_frame_num, 'delta_t': delta_t, 'timestamp': time.time() }) print(f"Update {update_count}: Found {frame_type} Frame {frame_num} (from {prev_frame_num})") break except Exception as e: print(f"Error in flow update callback: {e}") # Create background analyzer with flow updates like TUI bg_analyzer = BackgroundAnalyzer( analyzer, num_threads=4, # TUI uses multiple threads flow_update_callback=flow_update_callback ) print(f"Starting background parsing with flow updates...") bg_analyzer.start_parsing(pcap_file) # Monitor progress while bg_analyzer.is_parsing: time.sleep(0.1) print(f"Parsing complete. Total flow updates: {update_count}") if outlier_snapshots: print(f"\nšŸ” FOUND PROBLEMATIC OUTLIERS: {len(outlier_snapshots)}") for snapshot in outlier_snapshots: print(f" Update {snapshot['update']}: {snapshot['frame_type']} Frame {snapshot['frame_num']} (from {snapshot['prev_frame_num']}): {snapshot['delta_t']*1000:.3f} ms") else: print(f"\nāŒ No problematic outliers found during flow updates") # Final check of all outliers print(f"\n=== Final State ===") flows = bg_analyzer.get_current_flows() for flow in flows.values(): if flow.src_ip == src_ip: total_outliers = 0 for frame_type, ft_stats in flow.frame_types.items(): outlier_count = len(ft_stats.outlier_frames) total_outliers += outlier_count if outlier_count > 0: print(f"{frame_type}: {outlier_count} outliers") # Show enhanced details if available if hasattr(ft_stats, 'enhanced_outlier_details') and ft_stats.enhanced_outlier_details: for frame_num, prev_frame_num, delta_t in ft_stats.enhanced_outlier_details[:3]: deviation = (delta_t - ft_stats.avg_inter_arrival) / ft_stats.std_inter_arrival if ft_stats.std_inter_arrival > 0 else 0 print(f" Frame {frame_num} (from {prev_frame_num}): {delta_t * 1000:.3f} ms ({deviation:.1f}σ)") if len(ft_stats.enhanced_outlier_details) > 3: print(f" ... and {len(ft_stats.enhanced_outlier_details) - 3} more") print(f"Total outliers: {total_outliers}") break # Test if there might be a threading issue by running single-threaded print(f"\n=== Testing Single-threaded Background Analyzer ===") analyzer_single = EthernetAnalyzer(enable_realtime=False, outlier_threshold_sigma=3.0) bg_analyzer_single = BackgroundAnalyzer(analyzer_single, num_threads=1) bg_analyzer_single.start_parsing(pcap_file) while bg_analyzer_single.is_parsing: time.sleep(0.1) flows_single = bg_analyzer_single.get_current_flows() for flow in flows_single.values(): if flow.src_ip == src_ip: # Check for the problematic outlier for frame_type, ft_stats in flow.frame_types.items(): if hasattr(ft_stats, 'enhanced_outlier_details') and ft_stats.enhanced_outlier_details: for frame_num, prev_frame_num, delta_t in ft_stats.enhanced_outlier_details: if frame_num == 2002 or prev_frame_num == 298: print(f"Single-threaded: {frame_type} Frame {frame_num} (from {prev_frame_num})") break bg_analyzer.cleanup() bg_analyzer_single.cleanup() if __name__ == "__main__": if len(sys.argv) > 1: debug_tui_flow_updates(sys.argv[1]) else: debug_tui_flow_updates()