Debugging tips#

When debugging problems with Matter on Linux there are multiple system services involved. Many of those services provide detailed logs and tracing information which is not enabled by default but can be useful for troubleshooting. Most notably these include:

The HCI Interface#

The interface between the Bluetooth Host and the Bluetooth Controller is based on a standardized serial protocol. The information exchanged via this protocol can be captured into a file by the hcidump command. The data can be recorded by running the command with the --save-dump commandline switch:

hcidump --save-dump=dump.pcap

The resulting capture file dump.pcap can be viewed with tools like wireshark.

Package required on Debian/Ubuntu systems: bluez-hcidump.

D-Bus#

D-Bus connects Matter to other system services. The communication happening over D-Bus can be logged to a pcap file using the following command:

dbus-monitor --system --pcap > dbus.pcap

As with the HCI interface the resulting pcap file can be viewed with tools like wireshark.

Package required on Debian/Ubuntu systems: dbus-bin.

The Bluez Bluetooth stack#

Linux systems use the Bluez stack to manage Bluetooth devices. The stack is implemented in the bluetoothd system daemon. When the daemon is started with the --debug commandline switch it produces detailed a log of operations. In systems where systemd is used to manage daemons the following command opens an editor where the --debug switch can be added:

systemctl edit bluetooth.service

In the editor window the following lines need to be typed:

[Service]
ExecStart=
ExecStart=/usr/libexec/bluetooth/bluetoothd --experimental --debug

After saving the file and closing the editor the service needs to be restarted with the systemd restart bluetooth.service. The systemctl status bluetooth.service command can then be used to verify if the daemon is running with the expected commandline options:

 bluetooth.service - Bluetooth service
     Loaded: loaded (/usr/lib/systemd/system/bluetooth.service; enabled; preset: enabled)
    Drop-In: /etc/systemd/system/bluetooth.service.d
             └─override.conf
     Active: active (running) since Fri 2025-05-16 12:01:40 UTC; 2 days ago
       Docs: man:bluetoothd(8)
   Main PID: 44013 (bluetoothd)
     Status: "Running"
      Tasks: 1 (limit: 3853)
     Memory: 1004.0K (peak: 1.7M)
        CPU: 878ms
     CGroup: /system.slice/bluetooth.service
             └─44013 /usr/libexec/bluetooth/bluetoothd --experimental --debug

May 19 08:09:55 bones bluetoothd[44013]: src/adapter.c:dev_disconnected() Device 00:1A:7D:DA:71:13 disconnected, reason 2
May 19 08:09:55 bones bluetoothd[44013]: src/adapter.c:adapter_remove_connection()
May 19 08:09:55 bones bluetoothd[44013]: plugins/policy.c:disconnect_cb() reason 2
May 19 08:09:55 bones bluetoothd[44013]: src/adapter.c:bonding_attempt_complete() hci0 bdaddr 00:1A:7D:DA:71:13 type 1 status 0xe
May 19 08:09:55 bones bluetoothd[44013]: src/device.c:device_bonding_complete() bonding (nil) status 0x0e
May 19 08:09:55 bones bluetoothd[44013]: src/device.c:device_bonding_failed() status 14
May 19 08:09:55 bones bluetoothd[44013]: src/adapter.c:resume_discovery()
May 19 08:10:25 bones bluetoothd[44013]: src/device.c:device_remove() Removing device /org/bluez/hci0/dev_00_1A_7D_DA_71_13
May 19 08:10:25 bones bluetoothd[44013]: src/device.c:btd_device_unref() Freeing device /org/bluez/hci0/dev_00_1A_7D_DA_71_13
May 19 08:10:25 bones bluetoothd[44013]: src/device.c:device_free() 0xaaaaff1b68a0

wpa-supplicant#

The wpa_supplicant daemon manages WiFi interfaces and networks. The amount of logging can be changed at runtime by sending D-Bus calls to the daemon. In order to enable detailed debug logging run:

gdbus call --system --dest fi.w1.wpa_supplicant1 --object-path /fi/w1/wpa_supplicant1 --method org.freedesktop.DBus.Properties.Set fi.w1.wpa_supplicant1 DebugLevel '<string "debug">'

and to reset the logging level back to normal run:

gdbus call --system --dest fi.w1.wpa_supplicant1 --object-path /fi/w1/wpa_supplicant1 --method org.freedesktop.DBus.Properties.Set fi.w1.wpa_supplicant1 DebugLevel '<string "info">'

System Journal#

In modern Linux systems all of the logs from the kernel and system services are handled by the systemd-journald service. In order to read those log messages the journalctl command needs to be used. A typical case would be to extract all journal entries for a specific time period based on the timestamps of test runs. This can be done by a command like below:

journalctl --since=2025-05-16T09:14:00Z --until=2025-05-16T09:16:30Z -o short-iso-precise