Sulabh Biswas / Blog

Deep dives into Linux networking and Go

Debugging eBPF Maps in Production

eBPF maps are a critical component for storing state and sharing data between kernel and user space. However, debugging them in production can be challenging. In this post, we’ll explore common issues and debugging techniques.

Common Map Issues

1. Map Key/Value Mismatches

One of the most frequent issues is mismatched key-value types between your eBPF program and userspace application.

// Kernel space
struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __type(key, __u32);
    __type(value, struct packet_info);
    __uint(max_entries, 1024);
} packet_map SEC(".maps");
// Userspace must match exactly
type PacketInfo struct {
    Timestamp uint64
    SrcIP     uint32
    DstIP     uint32
}

2. Map Size Limitations

eBPF maps have size limitations that can cause issues in high-traffic scenarios.

Debugging Tools

Using bpftool

# List all maps
bpftool map list

# Dump map contents
bpftool map dump id 123

# Get map info
bpftool map show id 123

Userspace Debugging

func debugMap(fd int) {
    var (
        key     uint32
        value   PacketInfo
        nextKey uint32
    )
    
    // Iterate through all entries
    for bpf.MapGetNextKey(fd, nil, unsafe.Pointer(&nextKey)) == nil {
        if err := bpf.MapLookupElem(fd, unsafe.Pointer(&nextKey), unsafe.Pointer(&value)); err == nil {
            log.Printf("Key: %d, Value: %+v", nextKey, value)
        }
        key = nextKey
    }
}

XDP Packet Dropping Issues

If your XDP program isn’t dropping packets as expected, check:

  1. Return Values: Ensure you’re returning XDP_DROP not XDP_PASS
  2. Map Lookups: Verify map lookups are succeeding
  3. Program Attachment: Confirm the program is attached to the correct interface
# Verify XDP program attachment
ip link show dev eth0

Production Tips

  • Always validate map operations in your eBPF code
  • Use logging and tracing to monitor map operations
  • Implement proper error handling in userspace
  • Consider map performance under load

Conclusion

Debugging eBPF maps requires understanding both kernel and userspace components. With the right tools and techniques, you can effectively troubleshoot production issues.

Remember to always test thoroughly in development before deploying to production!