utils: Introduce libcamera-bug-report
diff mbox series

Message ID 20260207-kbingham-bug-reporter-v1-1-42f81e4ce5dc@ideasonboard.com
State Superseded
Headers show
Series
  • utils: Introduce libcamera-bug-report
Related show

Commit Message

Kieran Bingham Feb. 7, 2026, 11:30 a.m. UTC
Introduce a script which can be installed into the system to aide reporting
potential camera and media related issues.

The script shall capture system information and store it in a temporary
file - but it remains the users responsibilty to choose to share this
data, and no automatic bug submissions are anticipated.

Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
There are many occasions where people would like to report issues with
their camera, and there are always a common set of commands that we
would like to run to identify potential issues.

Provide a helper that will ease reporting of camera related issues
especially for bringup of new cameras or when cameras do not show.

An example bug report from my system follows, which itself shows a
specific bug!

$ ./utils/libcamera-bug-report 

==================================================
Report metadata
==================================================
Date: 2026-02-07T11:18:58+00:00
Host: Monstersaurus
User: uid=1000(kbingham) gid=1000(kbingham) groups=1000(kbingham),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),30(dip),44(video),46(plugdev),108(kvm),121(lpadmin),132(lxd),133(sambashare),135(docker),998(nix-users)

==================================================
Kernel & OS
==================================================

$ uname -a
Linux Monstersaurus 6.8.0-90-generic #91-Ubuntu SMP PREEMPT_DYNAMIC Tue Nov 18 14:14:30 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.3 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo

$ lsb_release -a
Distributor ID:	Ubuntu
Description:	Ubuntu 24.04.3 LTS
Release:	24.04
Codename:	noble

==================================================
Media / V4L2 tools
==================================================

$ media-ctl --version
media-ctl 1.26.1

$ v4l2-ctl --version
v4l2-ctl 1.26.1

$ v4l2-ctl --list-devices
vim2m (platform:vim2m):
	/dev/video9
	/dev/media3

vimc (platform:vimc):
	/dev/video2
	/dev/video3
	/dev/video4
	/dev/media1

vivid (platform:vivid-000):
	/dev/video5
	/dev/video6
	/dev/video7
	/dev/video8
	/dev/radio0
	/dev/radio1
	/dev/vbi0
	/dev/vbi1
	/dev/swradio0
	/dev/v4l-touch0
	/dev/media2

Logitech BRIO (usb-0000:0d:00.3-3.4):
	/dev/video0
	/dev/video1
	/dev/media0

==================================================
Device nodes
==================================================

$ ls -l /dev/video0 /dev/video1 /dev/video2 /dev/video3 /dev/video4 /dev/video5 /dev/video6 /dev/video7 /dev/video8 /dev/video9 /dev/v4l-subdev0 /dev/v4l-subdev1 /dev/v4l-subdev2 /dev/v4l-subdev3 /dev/v4l-subdev4 /dev/v4l-subdev5 /dev/v4l-subdev6 /dev/v4l-subdev7 /dev/v4l-touch0 /dev/media0 /dev/media1 /dev/media2 /dev/media3
crw-rw----+ 1 root video 234,  0 Jan 14 23:56 /dev/media0
crw-rw----+ 1 root video 234,  1 Jan 14 23:56 /dev/media1
crw-rw----+ 1 root video 234,  2 Jan 14 23:56 /dev/media2
crw-rw----+ 1 root video 234,  3 Jan 14 23:56 /dev/media3
crw-rw----+ 1 root video  81,  5 Jan 14 23:56 /dev/v4l-subdev0
crw-rw----+ 1 root video  81,  6 Jan 14 23:56 /dev/v4l-subdev1
crw-rw----+ 1 root video  81,  7 Jan 14 23:56 /dev/v4l-subdev2
crw-rw----+ 1 root video  81,  8 Jan 14 23:56 /dev/v4l-subdev3
crw-rw----+ 1 root video  81,  9 Jan 14 23:56 /dev/v4l-subdev4
crw-rw----+ 1 root video  81, 10 Jan 14 23:56 /dev/v4l-subdev5
crw-rw----+ 1 root video  81, 11 Jan 14 23:56 /dev/v4l-subdev6
crw-rw----+ 1 root video  81, 12 Jan 14 23:56 /dev/v4l-subdev7
crw-rw----+ 1 root video  81, 22 Jan 14 23:56 /dev/v4l-touch0
crw-rw----+ 1 root video  81,  0 Jan 14 23:56 /dev/video0
crw-rw----+ 1 root video  81,  1 Jan 14 23:56 /dev/video1
crw-rw----+ 1 root video  81,  2 Jan 14 23:56 /dev/video2
crw-rw----+ 1 root video  81,  3 Jan 14 23:56 /dev/video3
crw-rw----+ 1 root video  81,  4 Jan 14 23:56 /dev/video4
crw-rw----+ 1 root video  81, 13 Jan 14 23:56 /dev/video5
crw-rw----+ 1 root video  81, 14 Jan 14 23:56 /dev/video6
crw-rw----+ 1 root video  81, 20 Jan 14 23:56 /dev/video7
crw-rw----+ 1 root video  81, 21 Jan 14 23:56 /dev/video8
crw-rw----+ 1 root video  81, 23 Jan 14 23:56 /dev/video9

$ grep . /sys/class/video4linux/radio0/name /sys/class/video4linux/radio1/name /sys/class/video4linux/swradio0/name /sys/class/video4linux/v4l-subdev0/name /sys/class/video4linux/v4l-subdev1/name /sys/class/video4linux/v4l-subdev2/name /sys/class/video4linux/v4l-subdev3/name /sys/class/video4linux/v4l-subdev4/name /sys/class/video4linux/v4l-subdev5/name /sys/class/video4linux/v4l-subdev6/name /sys/class/video4linux/v4l-subdev7/name /sys/class/video4linux/v4l-touch0/name /sys/class/video4linux/vbi0/name /sys/class/video4linux/vbi1/name /sys/class/video4linux/video0/name /sys/class/video4linux/video1/name /sys/class/video4linux/video2/name /sys/class/video4linux/video3/name /sys/class/video4linux/video4/name /sys/class/video4linux/video5/name /sys/class/video4linux/video6/name /sys/class/video4linux/video7/name /sys/class/video4linux/video8/name /sys/class/video4linux/video9/name
/sys/class/video4linux/radio0/name:vivid-000-rad-rx
/sys/class/video4linux/radio1/name:vivid-000-rad-tx
/sys/class/video4linux/swradio0/name:vivid-000-sdr-cap
/sys/class/video4linux/v4l-subdev0/name:Sensor A
/sys/class/video4linux/v4l-subdev1/name:Sensor B
/sys/class/video4linux/v4l-subdev2/name:Debayer A
/sys/class/video4linux/v4l-subdev3/name:Debayer B
/sys/class/video4linux/v4l-subdev4/name:RGB/YUV Input
/sys/class/video4linux/v4l-subdev5/name:Scaler
/sys/class/video4linux/v4l-subdev6/name:Lens A
/sys/class/video4linux/v4l-subdev7/name:Lens B
/sys/class/video4linux/v4l-touch0/name:vivid-000-touch-cap
/sys/class/video4linux/vbi0/name:vivid-000-vbi-cap
/sys/class/video4linux/vbi1/name:vivid-000-vbi-out
/sys/class/video4linux/video0/name:Logitech BRIO
/sys/class/video4linux/video1/name:Logitech BRIO
/sys/class/video4linux/video2/name:Raw Capture 0
/sys/class/video4linux/video3/name:Raw Capture 1
/sys/class/video4linux/video4/name:RGB/YUV Capture
/sys/class/video4linux/video5/name:vivid-000-vid-cap
/sys/class/video4linux/video6/name:vivid-000-vid-out
/sys/class/video4linux/video7/name:vivid-000-meta-cap
/sys/class/video4linux/video8/name:vivid-000-meta-out
/sys/class/video4linux/video9/name:vim2m

==================================================
Deferred devices
==================================================

$ cat /sys/kernel/debug/devices_deferred
cat: /sys/kernel/debug/devices_deferred: Permission denied
[WARN] Command failed: cat /sys/kernel/debug/devices_deferred

==================================================
V4L2 async pending subdevices
==================================================

$ cat /sys/kernel/debug/v4l2-async/pending_async_subdevices
cat: /sys/kernel/debug/v4l2-async/pending_async_subdevices: Permission denied
[WARN] Command failed: cat /sys/kernel/debug/v4l2-async/pending_async_subdevices

==================================================
Media graph topology
==================================================

Parsing /dev/media0

$ media-ctl -p /dev/media0
Media controller API version 6.8.12

Media device information
------------------------
driver          uvcvideo
model           Logitech BRIO
serial          61306147
bus info        usb-0000:0d:00.3-3.4
hw revision     0x17
driver version  6.8.12

Device topology
- entity 1: Logitech BRIO (1 pad, 1 link)
            type Node subtype V4L flags 1
            device node name /dev/video0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]

- entity 4: Logitech BRIO (0 pad, 0 link)
            type Node subtype V4L flags 0
            device node name /dev/video1

- entity 8: Processing 3 (2 pads, 8 links, 0 routes)
            type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Camera 1":0 [ENABLED,IMMUTABLE]
	pad1: Source
		-> "Logitech BRIO":0 [ENABLED,IMMUTABLE]
		-> "Extension 14":0 [ENABLED,IMMUTABLE]
		-> "Extension 6":0 [ENABLED,IMMUTABLE]
		-> "Extension 8":0 [ENABLED,IMMUTABLE]
		-> "Extension 9":0 [ENABLED,IMMUTABLE]
		-> "Extension 10":0 [ENABLED,IMMUTABLE]
		-> "Extension 11":0 [ENABLED,IMMUTABLE]

- entity 11: Extension 14 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 14: Extension 6 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 17: Extension 8 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 20: Extension 9 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 23: Extension 10 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 26: Extension 11 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 29: Camera 1 (1 pad, 1 link, 0 routes)
             type V4L2 subdev subtype Sensor flags 0
	pad0: Source
		-> "Processing 3":0 [ENABLED,IMMUTABLE]

Parsing /dev/media1

$ media-ctl -p /dev/media1
Media controller API version 6.8.12

Media device information
------------------------
driver          uvcvideo
model           Logitech BRIO
serial          61306147
bus info        usb-0000:0d:00.3-3.4
hw revision     0x17
driver version  6.8.12

Device topology
- entity 1: Logitech BRIO (1 pad, 1 link)
            type Node subtype V4L flags 1
            device node name /dev/video0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]

- entity 4: Logitech BRIO (0 pad, 0 link)
            type Node subtype V4L flags 0
            device node name /dev/video1

- entity 8: Processing 3 (2 pads, 8 links, 0 routes)
            type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Camera 1":0 [ENABLED,IMMUTABLE]
	pad1: Source
		-> "Logitech BRIO":0 [ENABLED,IMMUTABLE]
		-> "Extension 14":0 [ENABLED,IMMUTABLE]
		-> "Extension 6":0 [ENABLED,IMMUTABLE]
		-> "Extension 8":0 [ENABLED,IMMUTABLE]
		-> "Extension 9":0 [ENABLED,IMMUTABLE]
		-> "Extension 10":0 [ENABLED,IMMUTABLE]
		-> "Extension 11":0 [ENABLED,IMMUTABLE]

- entity 11: Extension 14 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 14: Extension 6 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 17: Extension 8 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 20: Extension 9 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 23: Extension 10 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 26: Extension 11 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 29: Camera 1 (1 pad, 1 link, 0 routes)
             type V4L2 subdev subtype Sensor flags 0
	pad0: Source
		-> "Processing 3":0 [ENABLED,IMMUTABLE]

Parsing /dev/media2

$ media-ctl -p /dev/media2
Media controller API version 6.8.12

Media device information
------------------------
driver          uvcvideo
model           Logitech BRIO
serial          61306147
bus info        usb-0000:0d:00.3-3.4
hw revision     0x17
driver version  6.8.12

Device topology
- entity 1: Logitech BRIO (1 pad, 1 link)
            type Node subtype V4L flags 1
            device node name /dev/video0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]

- entity 4: Logitech BRIO (0 pad, 0 link)
            type Node subtype V4L flags 0
            device node name /dev/video1

- entity 8: Processing 3 (2 pads, 8 links, 0 routes)
            type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Camera 1":0 [ENABLED,IMMUTABLE]
	pad1: Source
		-> "Logitech BRIO":0 [ENABLED,IMMUTABLE]
		-> "Extension 14":0 [ENABLED,IMMUTABLE]
		-> "Extension 6":0 [ENABLED,IMMUTABLE]
		-> "Extension 8":0 [ENABLED,IMMUTABLE]
		-> "Extension 9":0 [ENABLED,IMMUTABLE]
		-> "Extension 10":0 [ENABLED,IMMUTABLE]
		-> "Extension 11":0 [ENABLED,IMMUTABLE]

- entity 11: Extension 14 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 14: Extension 6 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 17: Extension 8 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 20: Extension 9 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 23: Extension 10 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 26: Extension 11 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 29: Camera 1 (1 pad, 1 link, 0 routes)
             type V4L2 subdev subtype Sensor flags 0
	pad0: Source
		-> "Processing 3":0 [ENABLED,IMMUTABLE]

Parsing /dev/media3

$ media-ctl -p /dev/media3
Media controller API version 6.8.12

Media device information
------------------------
driver          uvcvideo
model           Logitech BRIO
serial          61306147
bus info        usb-0000:0d:00.3-3.4
hw revision     0x17
driver version  6.8.12

Device topology
- entity 1: Logitech BRIO (1 pad, 1 link)
            type Node subtype V4L flags 1
            device node name /dev/video0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]

- entity 4: Logitech BRIO (0 pad, 0 link)
            type Node subtype V4L flags 0
            device node name /dev/video1

- entity 8: Processing 3 (2 pads, 8 links, 0 routes)
            type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Camera 1":0 [ENABLED,IMMUTABLE]
	pad1: Source
		-> "Logitech BRIO":0 [ENABLED,IMMUTABLE]
		-> "Extension 14":0 [ENABLED,IMMUTABLE]
		-> "Extension 6":0 [ENABLED,IMMUTABLE]
		-> "Extension 8":0 [ENABLED,IMMUTABLE]
		-> "Extension 9":0 [ENABLED,IMMUTABLE]
		-> "Extension 10":0 [ENABLED,IMMUTABLE]
		-> "Extension 11":0 [ENABLED,IMMUTABLE]

- entity 11: Extension 14 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 14: Extension 6 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 17: Extension 8 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 20: Extension 9 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 23: Extension 10 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 26: Extension 11 (2 pads, 1 link, 0 routes)
             type V4L2 subdev subtype Unknown flags 0
	pad0: Sink
		<- "Processing 3":1 [ENABLED,IMMUTABLE]
	pad1: Source

- entity 29: Camera 1 (1 pad, 1 link, 0 routes)
             type V4L2 subdev subtype Sensor flags 0
	pad0: Source
		-> "Processing 3":0 [ENABLED,IMMUTABLE]

==================================================
libcamera & userspace
==================================================

$ which cam
/usr/bin/cam

$ ldd /usr/bin/cam
	linux-vdso.so.1 (0x00007fffea592000)
	libcamera.so.0.6 => /lib/x86_64-linux-gnu/libcamera.so.0.6 (0x0000799515800000)
	libcamera-base.so.0.6 => /lib/x86_64-linux-gnu/libcamera-base.so.0.6 (0x0000799516122000)
	libdrm.so.2 => /lib/x86_64-linux-gnu/libdrm.so.2 (0x000079951610b000)
	libevent_pthreads-2.1.so.7 => /lib/x86_64-linux-gnu/libevent_pthreads-2.1.so.7 (0x0000799516106000)
	libevent-2.1.so.7 => /lib/x86_64-linux-gnu/libevent-2.1.so.7 (0x00007995160b4000)
	libjpeg.so.8 => /lib/x86_64-linux-gnu/libjpeg.so.8 (0x000079951602f000)
	libSDL2-2.0.so.0 => /lib/x86_64-linux-gnu/libSDL2-2.0.so.0 (0x0000799515624000)
	libtiff.so.5 => not found
	libyaml-0.so.2 => /lib/x86_64-linux-gnu/libyaml-0.so.2 (0x000079951600e000)
	libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x0000799515200000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007995155f6000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000799514e00000)
	libyuv.so.0 => /lib/x86_64-linux-gnu/libyuv.so.0 (0x000079951555e000)
	libgnutls.so.30 => /lib/x86_64-linux-gnu/libgnutls.so.30 (0x0000799514c06000)
	liblttng-ust.so.1 => /lib/x86_64-linux-gnu/liblttng-ust.so.1 (0x00007995154db000)
	libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007995154a8000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x0000799515117000)
	libdw.so.1 => /lib/x86_64-linux-gnu/libdw.so.1 (0x0000799515063000)
	libunwind.so.8 => /lib/x86_64-linux-gnu/libunwind.so.8 (0x0000799515fef000)
	/lib64/ld-linux-x86-64.so.2 (0x0000799516311000)
	libevent_core-2.1.so.7 => /lib/x86_64-linux-gnu/libevent_core-2.1.so.7 (0x000079951502e000)
	libasound.so.2 => /lib/x86_64-linux-gnu/libasound.so.2 (0x0000799514afc000)
	libpulse.so.0 => /lib/x86_64-linux-gnu/libpulse.so.0 (0x0000799514aab000)
	libsamplerate.so.0 => /lib/x86_64-linux-gnu/libsamplerate.so.0 (0x000079951493c000)
	libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007995147ff000)
	libXext.so.6 => /lib/x86_64-linux-gnu/libXext.so.6 (0x0000799515494000)
	libXcursor.so.1 => /lib/x86_64-linux-gnu/libXcursor.so.1 (0x0000799515fe1000)
	libXi.so.6 => /lib/x86_64-linux-gnu/libXi.so.6 (0x0000799515481000)
	libXfixes.so.3 => /lib/x86_64-linux-gnu/libXfixes.so.3 (0x0000799515026000)
	libXrandr.so.2 => /lib/x86_64-linux-gnu/libXrandr.so.2 (0x0000799515019000)
	libXss.so.1 => /lib/x86_64-linux-gnu/libXss.so.1 (0x0000799515014000)
	libgbm.so.1 => /lib/x86_64-linux-gnu/libgbm.so.1 (0x00007995147f8000)
	libwayland-egl.so.1 => /lib/x86_64-linux-gnu/libwayland-egl.so.1 (0x00007995147f3000)
	libwayland-client.so.0 => /lib/x86_64-linux-gnu/libwayland-client.so.0 (0x00007995147e3000)
	libwayland-cursor.so.0 => /lib/x86_64-linux-gnu/libwayland-cursor.so.0 (0x00007995147d9000)
	libxkbcommon.so.0 => /lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x0000799514790000)
	libdecor-0.so.0 => /lib/x86_64-linux-gnu/libdecor-0.so.0 (0x0000799514785000)
	libp11-kit.so.0 => /lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007995145e1000)
	libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x00007995145bf000)
	libunistring.so.5 => /lib/x86_64-linux-gnu/libunistring.so.5 (0x0000799514412000)
	libtasn1.so.6 => /lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007995143fa000)
	libnettle.so.8 => /lib/x86_64-linux-gnu/libnettle.so.8 (0x00007995143a5000)
	libhogweed.so.6 => /lib/x86_64-linux-gnu/libhogweed.so.6 (0x000079951435d000)
	libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007995142d9000)
	libnuma.so.1 => /lib/x86_64-linux-gnu/libnuma.so.1 (0x00007995142cb000)
	liblttng-ust-common.so.1 => /lib/x86_64-linux-gnu/liblttng-ust-common.so.1 (0x00007995142bc000)
	liblttng-ust-tracepoint.so.1 => /lib/x86_64-linux-gnu/liblttng-ust-tracepoint.so.1 (0x000079951429f000)
	libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x0000799514292000)
	libelf.so.1 => /lib/x86_64-linux-gnu/libelf.so.1 (0x0000799514273000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x0000799514257000)
	libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x000079951419b000)
	liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x0000799514169000)
	libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x0000799514155000)
	libpulsecommon-16.1.so => /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-16.1.so (0x00007995140d7000)
	libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x0000799514088000)
	libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x000079951405d000)
	libXrender.so.1 => /lib/x86_64-linux-gnu/libXrender.so.1 (0x0000799514051000)
	libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x0000799514025000)
	libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x0000799514019000)
	libsndfile.so.1 => /lib/x86_64-linux-gnu/libsndfile.so.1 (0x0000799513f8f000)
	libX11-xcb.so.1 => /lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x0000799513f8a000)
	libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x0000799513eaa000)
	libasyncns.so.0 => /lib/x86_64-linux-gnu/libasyncns.so.0 (0x0000799513ea2000)
	libapparmor.so.1 => /lib/x86_64-linux-gnu/libapparmor.so.1 (0x0000799513e8e000)
	libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x0000799513e86000)
	libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x0000799513e7e000)
	libFLAC.so.12 => /lib/x86_64-linux-gnu/libFLAC.so.12 (0x0000799513e1a000)
	libvorbis.so.0 => /lib/x86_64-linux-gnu/libvorbis.so.0 (0x0000799513dec000)
	libvorbisenc.so.2 => /lib/x86_64-linux-gnu/libvorbisenc.so.2 (0x0000799513d41000)
	libopus.so.0 => /lib/x86_64-linux-gnu/libopus.so.0 (0x0000799513ce0000)
	libogg.so.0 => /lib/x86_64-linux-gnu/libogg.so.0 (0x0000799513cd6000)
	libmpg123.so.0 => /lib/x86_64-linux-gnu/libmpg123.so.0 (0x0000799513c7a000)
	libmp3lame.so.0 => /lib/x86_64-linux-gnu/libmp3lame.so.0 (0x0000799513c04000)
	libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x0000799513abc000)
	liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x0000799513a98000)
	libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x0000799513a82000)
	libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x0000799513a5d000)
	libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x0000799513a4e000)

==================================================
libcamera probe (cam -l)
==================================================
[INFO] /dev/kmsg not writable, skipping kernel marker: BEGIN cam -l

$ cam -l
cam: error while loading shared libraries: libtiff.so.5: cannot open shared object file: No such file or directory
[WARN] Command failed: cam -l
[INFO] /dev/kmsg not writable, skipping kernel marker: END cam -l

==================================================
Kernel log (post cam -l)
==================================================

$ dmesg
dmesg: read kernel buffer failed: Operation not permitted
[WARN] Command failed: dmesg

==================================================
Permissions & capabilities
==================================================

$ id
uid=1000(kbingham) gid=1000(kbingham) groups=1000(kbingham),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),30(dip),44(video),46(plugdev),108(kvm),121(lpadmin),132(lxd),133(sambashare),135(docker),998(nix-users)

$ groups
kbingham adm dialout cdrom sudo audio dip video plugdev kvm lpadmin lxd sambashare docker nix-users

$ getcap /usr/bin/cam

==================================================
End of report
==================================================
Report saved to libcamera-report-Monstersaurus-20260207-111858.txt
---
 utils/libcamera-bug-report | 79 ++++++++++++++++++++++++++++++++++++++++++++++
 utils/meson.build          |  7 ++++
 2 files changed, 86 insertions(+)


---
base-commit: c6c5a8bc5b90e476cba806cfcccc704ef115d2aa
change-id: 20260207-kbingham-bug-reporter-60285cd034af

Best regards,

Comments

Laurent Pinchart Feb. 9, 2026, 12:08 a.m. UTC | #1
On Sat, Feb 07, 2026 at 11:30:04AM +0000, Kieran Bingham wrote:
> Introduce a script which can be installed into the system to aide reporting
> potential camera and media related issues.
> 
> The script shall capture system information and store it in a temporary
> file - but it remains the users responsibilty to choose to share this
> data, and no automatic bug submissions are anticipated.
> 
> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> ---
> There are many occasions where people would like to report issues with
> their camera, and there are always a common set of commands that we
> would like to run to identify potential issues.
> 
> Provide a helper that will ease reporting of camera related issues
> especially for bringup of new cameras or when cameras do not show.
> 
> An example bug report from my system follows, which itself shows a
> specific bug!
> 
> $ ./utils/libcamera-bug-report 
> 
> ==================================================
> Report metadata
> ==================================================
> Date: 2026-02-07T11:18:58+00:00
> Host: Monstersaurus
> User: uid=1000(kbingham) gid=1000(kbingham) groups=1000(kbingham),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),30(dip),44(video),46(plugdev),108(kvm),121(lpadmin),132(lxd),133(sambashare),135(docker),998(nix-users)
> 
> ==================================================
> Kernel & OS
> ==================================================
> 
> $ uname -a
> Linux Monstersaurus 6.8.0-90-generic #91-Ubuntu SMP PREEMPT_DYNAMIC Tue Nov 18 14:14:30 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
> 
> $ cat /etc/os-release
> PRETTY_NAME="Ubuntu 24.04.3 LTS"
> NAME="Ubuntu"
> VERSION_ID="24.04"
> VERSION="24.04.3 LTS (Noble Numbat)"
> VERSION_CODENAME=noble
> ID=ubuntu
> ID_LIKE=debian
> HOME_URL="https://www.ubuntu.com/"
> SUPPORT_URL="https://help.ubuntu.com/"
> BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
> PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
> UBUNTU_CODENAME=noble
> LOGO=ubuntu-logo
> 
> $ lsb_release -a
> Distributor ID:	Ubuntu
> Description:	Ubuntu 24.04.3 LTS
> Release:	24.04
> Codename:	noble
> 
> ==================================================
> Media / V4L2 tools
> ==================================================
> 
> $ media-ctl --version
> media-ctl 1.26.1
> 
> $ v4l2-ctl --version
> v4l2-ctl 1.26.1
> 
> $ v4l2-ctl --list-devices
> vim2m (platform:vim2m):
> 	/dev/video9
> 	/dev/media3
> 
> vimc (platform:vimc):
> 	/dev/video2
> 	/dev/video3
> 	/dev/video4
> 	/dev/media1
> 
> vivid (platform:vivid-000):
> 	/dev/video5
> 	/dev/video6
> 	/dev/video7
> 	/dev/video8
> 	/dev/radio0
> 	/dev/radio1
> 	/dev/vbi0
> 	/dev/vbi1
> 	/dev/swradio0
> 	/dev/v4l-touch0
> 	/dev/media2
> 
> Logitech BRIO (usb-0000:0d:00.3-3.4):
> 	/dev/video0
> 	/dev/video1
> 	/dev/media0
> 
> ==================================================
> Device nodes
> ==================================================
> 
> $ ls -l /dev/video0 /dev/video1 /dev/video2 /dev/video3 /dev/video4 /dev/video5 /dev/video6 /dev/video7 /dev/video8 /dev/video9 /dev/v4l-subdev0 /dev/v4l-subdev1 /dev/v4l-subdev2 /dev/v4l-subdev3 /dev/v4l-subdev4 /dev/v4l-subdev5 /dev/v4l-subdev6 /dev/v4l-subdev7 /dev/v4l-touch0 /dev/media0 /dev/media1 /dev/media2 /dev/media3
> crw-rw----+ 1 root video 234,  0 Jan 14 23:56 /dev/media0
> crw-rw----+ 1 root video 234,  1 Jan 14 23:56 /dev/media1
> crw-rw----+ 1 root video 234,  2 Jan 14 23:56 /dev/media2
> crw-rw----+ 1 root video 234,  3 Jan 14 23:56 /dev/media3
> crw-rw----+ 1 root video  81,  5 Jan 14 23:56 /dev/v4l-subdev0
> crw-rw----+ 1 root video  81,  6 Jan 14 23:56 /dev/v4l-subdev1
> crw-rw----+ 1 root video  81,  7 Jan 14 23:56 /dev/v4l-subdev2
> crw-rw----+ 1 root video  81,  8 Jan 14 23:56 /dev/v4l-subdev3
> crw-rw----+ 1 root video  81,  9 Jan 14 23:56 /dev/v4l-subdev4
> crw-rw----+ 1 root video  81, 10 Jan 14 23:56 /dev/v4l-subdev5
> crw-rw----+ 1 root video  81, 11 Jan 14 23:56 /dev/v4l-subdev6
> crw-rw----+ 1 root video  81, 12 Jan 14 23:56 /dev/v4l-subdev7
> crw-rw----+ 1 root video  81, 22 Jan 14 23:56 /dev/v4l-touch0
> crw-rw----+ 1 root video  81,  0 Jan 14 23:56 /dev/video0
> crw-rw----+ 1 root video  81,  1 Jan 14 23:56 /dev/video1
> crw-rw----+ 1 root video  81,  2 Jan 14 23:56 /dev/video2
> crw-rw----+ 1 root video  81,  3 Jan 14 23:56 /dev/video3
> crw-rw----+ 1 root video  81,  4 Jan 14 23:56 /dev/video4
> crw-rw----+ 1 root video  81, 13 Jan 14 23:56 /dev/video5
> crw-rw----+ 1 root video  81, 14 Jan 14 23:56 /dev/video6
> crw-rw----+ 1 root video  81, 20 Jan 14 23:56 /dev/video7
> crw-rw----+ 1 root video  81, 21 Jan 14 23:56 /dev/video8
> crw-rw----+ 1 root video  81, 23 Jan 14 23:56 /dev/video9
> 
> $ grep . /sys/class/video4linux/radio0/name /sys/class/video4linux/radio1/name /sys/class/video4linux/swradio0/name /sys/class/video4linux/v4l-subdev0/name /sys/class/video4linux/v4l-subdev1/name /sys/class/video4linux/v4l-subdev2/name /sys/class/video4linux/v4l-subdev3/name /sys/class/video4linux/v4l-subdev4/name /sys/class/video4linux/v4l-subdev5/name /sys/class/video4linux/v4l-subdev6/name /sys/class/video4linux/v4l-subdev7/name /sys/class/video4linux/v4l-touch0/name /sys/class/video4linux/vbi0/name /sys/class/video4linux/vbi1/name /sys/class/video4linux/video0/name /sys/class/video4linux/video1/name /sys/class/video4linux/video2/name /sys/class/video4linux/video3/name /sys/class/video4linux/video4/name /sys/class/video4linux/video5/name /sys/class/video4linux/video6/name /sys/class/video4linux/video7/name /sys/class/video4linux/video8/name /sys/class/video4linux/video9/name
> /sys/class/video4linux/radio0/name:vivid-000-rad-rx
> /sys/class/video4linux/radio1/name:vivid-000-rad-tx
> /sys/class/video4linux/swradio0/name:vivid-000-sdr-cap
> /sys/class/video4linux/v4l-subdev0/name:Sensor A
> /sys/class/video4linux/v4l-subdev1/name:Sensor B
> /sys/class/video4linux/v4l-subdev2/name:Debayer A
> /sys/class/video4linux/v4l-subdev3/name:Debayer B
> /sys/class/video4linux/v4l-subdev4/name:RGB/YUV Input
> /sys/class/video4linux/v4l-subdev5/name:Scaler
> /sys/class/video4linux/v4l-subdev6/name:Lens A
> /sys/class/video4linux/v4l-subdev7/name:Lens B
> /sys/class/video4linux/v4l-touch0/name:vivid-000-touch-cap
> /sys/class/video4linux/vbi0/name:vivid-000-vbi-cap
> /sys/class/video4linux/vbi1/name:vivid-000-vbi-out
> /sys/class/video4linux/video0/name:Logitech BRIO
> /sys/class/video4linux/video1/name:Logitech BRIO
> /sys/class/video4linux/video2/name:Raw Capture 0
> /sys/class/video4linux/video3/name:Raw Capture 1
> /sys/class/video4linux/video4/name:RGB/YUV Capture
> /sys/class/video4linux/video5/name:vivid-000-vid-cap
> /sys/class/video4linux/video6/name:vivid-000-vid-out
> /sys/class/video4linux/video7/name:vivid-000-meta-cap
> /sys/class/video4linux/video8/name:vivid-000-meta-out
> /sys/class/video4linux/video9/name:vim2m
> 
> ==================================================
> Deferred devices
> ==================================================
> 
> $ cat /sys/kernel/debug/devices_deferred
> cat: /sys/kernel/debug/devices_deferred: Permission denied
> [WARN] Command failed: cat /sys/kernel/debug/devices_deferred
> 
> ==================================================
> V4L2 async pending subdevices
> ==================================================
> 
> $ cat /sys/kernel/debug/v4l2-async/pending_async_subdevices
> cat: /sys/kernel/debug/v4l2-async/pending_async_subdevices: Permission denied
> [WARN] Command failed: cat /sys/kernel/debug/v4l2-async/pending_async_subdevices
> 
> ==================================================
> Media graph topology
> ==================================================
> 
> Parsing /dev/media0
> 
> $ media-ctl -p /dev/media0
> Media controller API version 6.8.12
> 
> Media device information
> ------------------------
> driver          uvcvideo
> model           Logitech BRIO
> serial          61306147
> bus info        usb-0000:0d:00.3-3.4
> hw revision     0x17
> driver version  6.8.12
> 
> Device topology
> - entity 1: Logitech BRIO (1 pad, 1 link)
>             type Node subtype V4L flags 1
>             device node name /dev/video0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 
> - entity 4: Logitech BRIO (0 pad, 0 link)
>             type Node subtype V4L flags 0
>             device node name /dev/video1
> 
> - entity 8: Processing 3 (2 pads, 8 links, 0 routes)
>             type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Camera 1":0 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 		-> "Logitech BRIO":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 14":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 6":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 8":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 9":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 10":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 11":0 [ENABLED,IMMUTABLE]
> 
> - entity 11: Extension 14 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 14: Extension 6 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 17: Extension 8 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 20: Extension 9 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 23: Extension 10 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 26: Extension 11 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 29: Camera 1 (1 pad, 1 link, 0 routes)
>              type V4L2 subdev subtype Sensor flags 0
> 	pad0: Source
> 		-> "Processing 3":0 [ENABLED,IMMUTABLE]
> 
> Parsing /dev/media1
> 
> $ media-ctl -p /dev/media1
> Media controller API version 6.8.12
> 
> Media device information
> ------------------------
> driver          uvcvideo
> model           Logitech BRIO
> serial          61306147
> bus info        usb-0000:0d:00.3-3.4
> hw revision     0x17
> driver version  6.8.12
> 
> Device topology
> - entity 1: Logitech BRIO (1 pad, 1 link)
>             type Node subtype V4L flags 1
>             device node name /dev/video0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 
> - entity 4: Logitech BRIO (0 pad, 0 link)
>             type Node subtype V4L flags 0
>             device node name /dev/video1
> 
> - entity 8: Processing 3 (2 pads, 8 links, 0 routes)
>             type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Camera 1":0 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 		-> "Logitech BRIO":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 14":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 6":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 8":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 9":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 10":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 11":0 [ENABLED,IMMUTABLE]
> 
> - entity 11: Extension 14 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 14: Extension 6 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 17: Extension 8 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 20: Extension 9 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 23: Extension 10 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 26: Extension 11 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 29: Camera 1 (1 pad, 1 link, 0 routes)
>              type V4L2 subdev subtype Sensor flags 0
> 	pad0: Source
> 		-> "Processing 3":0 [ENABLED,IMMUTABLE]
> 
> Parsing /dev/media2
> 
> $ media-ctl -p /dev/media2
> Media controller API version 6.8.12
> 
> Media device information
> ------------------------
> driver          uvcvideo
> model           Logitech BRIO
> serial          61306147
> bus info        usb-0000:0d:00.3-3.4
> hw revision     0x17
> driver version  6.8.12
> 
> Device topology
> - entity 1: Logitech BRIO (1 pad, 1 link)
>             type Node subtype V4L flags 1
>             device node name /dev/video0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 
> - entity 4: Logitech BRIO (0 pad, 0 link)
>             type Node subtype V4L flags 0
>             device node name /dev/video1
> 
> - entity 8: Processing 3 (2 pads, 8 links, 0 routes)
>             type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Camera 1":0 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 		-> "Logitech BRIO":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 14":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 6":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 8":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 9":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 10":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 11":0 [ENABLED,IMMUTABLE]
> 
> - entity 11: Extension 14 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 14: Extension 6 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 17: Extension 8 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 20: Extension 9 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 23: Extension 10 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 26: Extension 11 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 29: Camera 1 (1 pad, 1 link, 0 routes)
>              type V4L2 subdev subtype Sensor flags 0
> 	pad0: Source
> 		-> "Processing 3":0 [ENABLED,IMMUTABLE]
> 
> Parsing /dev/media3
> 
> $ media-ctl -p /dev/media3
> Media controller API version 6.8.12
> 
> Media device information
> ------------------------
> driver          uvcvideo
> model           Logitech BRIO
> serial          61306147
> bus info        usb-0000:0d:00.3-3.4
> hw revision     0x17
> driver version  6.8.12
> 
> Device topology
> - entity 1: Logitech BRIO (1 pad, 1 link)
>             type Node subtype V4L flags 1
>             device node name /dev/video0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 
> - entity 4: Logitech BRIO (0 pad, 0 link)
>             type Node subtype V4L flags 0
>             device node name /dev/video1
> 
> - entity 8: Processing 3 (2 pads, 8 links, 0 routes)
>             type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Camera 1":0 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 		-> "Logitech BRIO":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 14":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 6":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 8":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 9":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 10":0 [ENABLED,IMMUTABLE]
> 		-> "Extension 11":0 [ENABLED,IMMUTABLE]
> 
> - entity 11: Extension 14 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 14: Extension 6 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 17: Extension 8 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 20: Extension 9 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 23: Extension 10 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 26: Extension 11 (2 pads, 1 link, 0 routes)
>              type V4L2 subdev subtype Unknown flags 0
> 	pad0: Sink
> 		<- "Processing 3":1 [ENABLED,IMMUTABLE]
> 	pad1: Source
> 
> - entity 29: Camera 1 (1 pad, 1 link, 0 routes)
>              type V4L2 subdev subtype Sensor flags 0
> 	pad0: Source
> 		-> "Processing 3":0 [ENABLED,IMMUTABLE]
> 
> ==================================================
> libcamera & userspace
> ==================================================
> 
> $ which cam
> /usr/bin/cam
> 
> $ ldd /usr/bin/cam
> 	linux-vdso.so.1 (0x00007fffea592000)
> 	libcamera.so.0.6 => /lib/x86_64-linux-gnu/libcamera.so.0.6 (0x0000799515800000)
> 	libcamera-base.so.0.6 => /lib/x86_64-linux-gnu/libcamera-base.so.0.6 (0x0000799516122000)
> 	libdrm.so.2 => /lib/x86_64-linux-gnu/libdrm.so.2 (0x000079951610b000)
> 	libevent_pthreads-2.1.so.7 => /lib/x86_64-linux-gnu/libevent_pthreads-2.1.so.7 (0x0000799516106000)
> 	libevent-2.1.so.7 => /lib/x86_64-linux-gnu/libevent-2.1.so.7 (0x00007995160b4000)
> 	libjpeg.so.8 => /lib/x86_64-linux-gnu/libjpeg.so.8 (0x000079951602f000)
> 	libSDL2-2.0.so.0 => /lib/x86_64-linux-gnu/libSDL2-2.0.so.0 (0x0000799515624000)
> 	libtiff.so.5 => not found
> 	libyaml-0.so.2 => /lib/x86_64-linux-gnu/libyaml-0.so.2 (0x000079951600e000)
> 	libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x0000799515200000)
> 	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007995155f6000)
> 	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000799514e00000)
> 	libyuv.so.0 => /lib/x86_64-linux-gnu/libyuv.so.0 (0x000079951555e000)
> 	libgnutls.so.30 => /lib/x86_64-linux-gnu/libgnutls.so.30 (0x0000799514c06000)
> 	liblttng-ust.so.1 => /lib/x86_64-linux-gnu/liblttng-ust.so.1 (0x00007995154db000)
> 	libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007995154a8000)
> 	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x0000799515117000)
> 	libdw.so.1 => /lib/x86_64-linux-gnu/libdw.so.1 (0x0000799515063000)
> 	libunwind.so.8 => /lib/x86_64-linux-gnu/libunwind.so.8 (0x0000799515fef000)
> 	/lib64/ld-linux-x86-64.so.2 (0x0000799516311000)
> 	libevent_core-2.1.so.7 => /lib/x86_64-linux-gnu/libevent_core-2.1.so.7 (0x000079951502e000)
> 	libasound.so.2 => /lib/x86_64-linux-gnu/libasound.so.2 (0x0000799514afc000)
> 	libpulse.so.0 => /lib/x86_64-linux-gnu/libpulse.so.0 (0x0000799514aab000)
> 	libsamplerate.so.0 => /lib/x86_64-linux-gnu/libsamplerate.so.0 (0x000079951493c000)
> 	libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007995147ff000)
> 	libXext.so.6 => /lib/x86_64-linux-gnu/libXext.so.6 (0x0000799515494000)
> 	libXcursor.so.1 => /lib/x86_64-linux-gnu/libXcursor.so.1 (0x0000799515fe1000)
> 	libXi.so.6 => /lib/x86_64-linux-gnu/libXi.so.6 (0x0000799515481000)
> 	libXfixes.so.3 => /lib/x86_64-linux-gnu/libXfixes.so.3 (0x0000799515026000)
> 	libXrandr.so.2 => /lib/x86_64-linux-gnu/libXrandr.so.2 (0x0000799515019000)
> 	libXss.so.1 => /lib/x86_64-linux-gnu/libXss.so.1 (0x0000799515014000)
> 	libgbm.so.1 => /lib/x86_64-linux-gnu/libgbm.so.1 (0x00007995147f8000)
> 	libwayland-egl.so.1 => /lib/x86_64-linux-gnu/libwayland-egl.so.1 (0x00007995147f3000)
> 	libwayland-client.so.0 => /lib/x86_64-linux-gnu/libwayland-client.so.0 (0x00007995147e3000)
> 	libwayland-cursor.so.0 => /lib/x86_64-linux-gnu/libwayland-cursor.so.0 (0x00007995147d9000)
> 	libxkbcommon.so.0 => /lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x0000799514790000)
> 	libdecor-0.so.0 => /lib/x86_64-linux-gnu/libdecor-0.so.0 (0x0000799514785000)
> 	libp11-kit.so.0 => /lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007995145e1000)
> 	libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x00007995145bf000)
> 	libunistring.so.5 => /lib/x86_64-linux-gnu/libunistring.so.5 (0x0000799514412000)
> 	libtasn1.so.6 => /lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007995143fa000)
> 	libnettle.so.8 => /lib/x86_64-linux-gnu/libnettle.so.8 (0x00007995143a5000)
> 	libhogweed.so.6 => /lib/x86_64-linux-gnu/libhogweed.so.6 (0x000079951435d000)
> 	libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007995142d9000)
> 	libnuma.so.1 => /lib/x86_64-linux-gnu/libnuma.so.1 (0x00007995142cb000)
> 	liblttng-ust-common.so.1 => /lib/x86_64-linux-gnu/liblttng-ust-common.so.1 (0x00007995142bc000)
> 	liblttng-ust-tracepoint.so.1 => /lib/x86_64-linux-gnu/liblttng-ust-tracepoint.so.1 (0x000079951429f000)
> 	libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x0000799514292000)
> 	libelf.so.1 => /lib/x86_64-linux-gnu/libelf.so.1 (0x0000799514273000)
> 	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x0000799514257000)
> 	libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x000079951419b000)
> 	liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x0000799514169000)
> 	libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x0000799514155000)
> 	libpulsecommon-16.1.so => /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-16.1.so (0x00007995140d7000)
> 	libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x0000799514088000)
> 	libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x000079951405d000)
> 	libXrender.so.1 => /lib/x86_64-linux-gnu/libXrender.so.1 (0x0000799514051000)
> 	libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x0000799514025000)
> 	libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x0000799514019000)
> 	libsndfile.so.1 => /lib/x86_64-linux-gnu/libsndfile.so.1 (0x0000799513f8f000)
> 	libX11-xcb.so.1 => /lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x0000799513f8a000)
> 	libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x0000799513eaa000)
> 	libasyncns.so.0 => /lib/x86_64-linux-gnu/libasyncns.so.0 (0x0000799513ea2000)
> 	libapparmor.so.1 => /lib/x86_64-linux-gnu/libapparmor.so.1 (0x0000799513e8e000)
> 	libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x0000799513e86000)
> 	libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x0000799513e7e000)
> 	libFLAC.so.12 => /lib/x86_64-linux-gnu/libFLAC.so.12 (0x0000799513e1a000)
> 	libvorbis.so.0 => /lib/x86_64-linux-gnu/libvorbis.so.0 (0x0000799513dec000)
> 	libvorbisenc.so.2 => /lib/x86_64-linux-gnu/libvorbisenc.so.2 (0x0000799513d41000)
> 	libopus.so.0 => /lib/x86_64-linux-gnu/libopus.so.0 (0x0000799513ce0000)
> 	libogg.so.0 => /lib/x86_64-linux-gnu/libogg.so.0 (0x0000799513cd6000)
> 	libmpg123.so.0 => /lib/x86_64-linux-gnu/libmpg123.so.0 (0x0000799513c7a000)
> 	libmp3lame.so.0 => /lib/x86_64-linux-gnu/libmp3lame.so.0 (0x0000799513c04000)
> 	libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x0000799513abc000)
> 	liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x0000799513a98000)
> 	libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x0000799513a82000)
> 	libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x0000799513a5d000)
> 	libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x0000799513a4e000)
> 
> ==================================================
> libcamera probe (cam -l)
> ==================================================
> [INFO] /dev/kmsg not writable, skipping kernel marker: BEGIN cam -l
> 
> $ cam -l
> cam: error while loading shared libraries: libtiff.so.5: cannot open shared object file: No such file or directory
> [WARN] Command failed: cam -l
> [INFO] /dev/kmsg not writable, skipping kernel marker: END cam -l
> 
> ==================================================
> Kernel log (post cam -l)
> ==================================================
> 
> $ dmesg
> dmesg: read kernel buffer failed: Operation not permitted
> [WARN] Command failed: dmesg

This is quite common. I wonder if we shouldn't skip writing the report
to stdout, and only print warnings, to ensure they get noticed.

As for how to fix this problem, I'm not entirely sure. I don't want to
hide a sudo within the script, at least not one that is run by default.
I also don't want to tell people to run this as root. One option could
be to add a parameter to the script to run "sudo dmesg" instead of
"dmesg", and mention the option in the warning message.

> 
> ==================================================
> Permissions & capabilities
> ==================================================
> 
> $ id
> uid=1000(kbingham) gid=1000(kbingham) groups=1000(kbingham),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),30(dip),44(video),46(plugdev),108(kvm),121(lpadmin),132(lxd),133(sambashare),135(docker),998(nix-users)
> 
> $ groups
> kbingham adm dialout cdrom sudo audio dip video plugdev kvm lpadmin lxd sambashare docker nix-users
> 
> $ getcap /usr/bin/cam
> 
> ==================================================
> End of report
> ==================================================
> Report saved to libcamera-report-Monstersaurus-20260207-111858.txt

I would be way more vocal here about the need to inspect the report and
ensure there's no sensitive information before sending it.

> ---
>  utils/libcamera-bug-report | 79 ++++++++++++++++++++++++++++++++++++++++++++++
>  utils/meson.build          |  7 ++++
>  2 files changed, 86 insertions(+)
> 
> diff --git a/utils/libcamera-bug-report b/utils/libcamera-bug-report
> new file mode 100755
> index 000000000000..72b89b646007
> --- /dev/null
> +++ b/utils/libcamera-bug-report
> @@ -0,0 +1,79 @@
> +#!/usr/bin/env bash

I don't think we can reasonably expect bash to be present. It's common
in embedded environment to use other shells. Is there anything specific
you need from bash, or could we use /bin/sh ?

> +# SPDX-License-Identifier: LGPL-2.1-or-later
> +
> +REPORT="libcamera-report-$(hostname)-$(date +%Y%m%d-%H%M%S).txt"
> +
> +exec > >(tee "$REPORT") 2>&1
> +
> +section() {
> +    echo
> +    echo "=================================================="
> +    echo "$1"
> +    echo "=================================================="
> +}
> +
> +run() {
> +    echo
> +    echo "\$ $*"
> +    "$@" || echo "[WARN] Command failed: $*"
> +}
> +
> +mark_kmsg() {
> +    if [ -w /dev/kmsg ]; then
> +        echo "libcamera-debug-report[$$]: $1" > /dev/kmsg
> +    else
> +        echo "[INFO] /dev/kmsg not writable, skipping kernel marker: $1"
> +    fi
> +}
> +
> +section "Report metadata"
> +echo "Date: $(date -Is)"
> +echo "Host: $(hostname)"
> +echo "User: $(id)"
> +
> +section "Kernel & OS"
> +run uname -a
> +run cat /etc/os-release
> +command -v lsb_release >/dev/null && run lsb_release -a
> +
> +section "Media / V4L2 tools"
> +command -v media-ctl >/dev/null && run media-ctl --version
> +command -v v4l2-ctl >/dev/null && run v4l2-ctl --version
> +command -v v4l2-ctl >/dev/null && run v4l2-ctl --list-devices
> +
> +section "Device nodes"
> +run ls -l /dev/video* /dev/v4l-* /dev/media* 2>/dev/null
> +run grep . /sys/class/video4linux/*/name
> +
> +section "Deferred devices"
> +run cat /sys/kernel/debug/devices_deferred
> +
> +section "V4L2 async pending subdevices"
> +run cat /sys/kernel/debug/v4l2-async/pending_async_subdevices
> +
> +section "Media graph topology"
> +for m in /dev/media*; do
> +    echo
> +    echo "Parsing $m"
> +    command -v media-ctl >/dev/null && run media-ctl -p "$m"

I'm tempted to make media-ctl a hard dependency and print a warning.

We could avoid v4l2-ctl as a dependency, but as it should come from the
same package as media-ctl, I suppose it's fine.

> +done
> +
> +section "libcamera & userspace"
> +run which cam
> +command -v cam >/dev/null && run ldd `which cam`
> +
> +section "libcamera probe (cam -l)"
> +mark_kmsg "BEGIN cam -l"
> +LIBCAMERA_LOG_LEVELS=*:0 run cam -l
> +mark_kmsg "END cam -l"
> +
> +section "Kernel log (post cam -l)"
> +run dmesg
> +
> +section "Permissions & capabilities"
> +run id
> +run groups
> +command -v getcap >/dev/null && run getcap "$(which cam)"
> +
> +section "End of report"
> +echo "Report saved to $REPORT"
> diff --git a/utils/meson.build b/utils/meson.build
> index 3deed8ad4d7e..1a9203f81763 100644
> --- a/utils/meson.build
> +++ b/utils/meson.build
> @@ -7,3 +7,10 @@ gen_shader_headers = files('gen-shader-headers.sh')
>  
>  ## Module signing
>  gen_ipa_priv_key = files('gen-ipa-priv-key.sh')
> +
> +## Bug reporting utility
> +install_data(
> +    'libcamera-debug-report',

The file is called "libcamera-bug-report", not "libcamera-debug-report".
Have you tested installation ? :-)

> +    install_dir: get_option('bindir'),
> +    install_mode: 'rwxr-xr-x',

This shouldn't be needed as the file is already executable.

> +)
> 
> ---
> base-commit: c6c5a8bc5b90e476cba806cfcccc704ef115d2aa
> change-id: 20260207-kbingham-bug-reporter-60285cd034af
Kieran Bingham Feb. 9, 2026, 9:16 a.m. UTC | #2
Quoting Laurent Pinchart (2026-02-09 00:08:24)
> On Sat, Feb 07, 2026 at 11:30:04AM +0000, Kieran Bingham wrote:
> > Introduce a script which can be installed into the system to aide reporting
> > potential camera and media related issues.
> > 
> > The script shall capture system information and store it in a temporary
> > file - but it remains the users responsibilty to choose to share this
> > data, and no automatic bug submissions are anticipated.
> > 
> > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> > ---
> > There are many occasions where people would like to report issues with
> > their camera, and there are always a common set of commands that we
> > would like to run to identify potential issues.
> > 
> > Provide a helper that will ease reporting of camera related issues
> > especially for bringup of new cameras or when cameras do not show.
> > 
> > An example bug report from my system follows, which itself shows a
> > specific bug!
> > 
> > $ ./utils/libcamera-bug-report 
> > 

...

> > cam: error while loading shared libraries: libtiff.so.5: cannot open shared object file: No such file or directory
> > [WARN] Command failed: cam -l
> > [INFO] /dev/kmsg not writable, skipping kernel marker: END cam -l
> > 
> > ==================================================
> > Kernel log (post cam -l)
> > ==================================================
> > 
> > $ dmesg
> > dmesg: read kernel buffer failed: Operation not permitted
> > [WARN] Command failed: dmesg
> 
> This is quite common. I wonder if we shouldn't skip writing the report
> to stdout, and only print warnings, to ensure they get noticed.
> 
> As for how to fix this problem, I'm not entirely sure. I don't want to
> hide a sudo within the script, at least not one that is run by default.
> I also don't want to tell people to run this as root. One option could
> be to add a parameter to the script to run "sudo dmesg" instead of
> "dmesg", and mention the option in the warning message.

Indeed, I intentionally didn't want any sudo in the script. I assume we
can let the user choose to run as sudo after having run once ?




> > 
> > ==================================================
> > Permissions & capabilities
> > ==================================================
> > 
> > $ id
> > uid=1000(kbingham) gid=1000(kbingham) groups=1000(kbingham),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),30(dip),44(video),46(plugdev),108(kvm),121(lpadmin),132(lxd),133(sambashare),135(docker),998(nix-users)
> > 
> > $ groups
> > kbingham adm dialout cdrom sudo audio dip video plugdev kvm lpadmin lxd sambashare docker nix-users
> > 
> > $ getcap /usr/bin/cam
> > 
> > ==================================================
> > End of report
> > ==================================================
> > Report saved to libcamera-report-Monstersaurus-20260207-111858.txt
> 
> I would be way more vocal here about the need to inspect the report and
> ensure there's no sensitive information before sending it.

Ack



> 
> > ---
> >  utils/libcamera-bug-report | 79 ++++++++++++++++++++++++++++++++++++++++++++++
> >  utils/meson.build          |  7 ++++
> >  2 files changed, 86 insertions(+)
> > 
> > diff --git a/utils/libcamera-bug-report b/utils/libcamera-bug-report
> > new file mode 100755
> > index 000000000000..72b89b646007
> > --- /dev/null
> > +++ b/utils/libcamera-bug-report
> > @@ -0,0 +1,79 @@
> > +#!/usr/bin/env bash
> 
> I don't think we can reasonably expect bash to be present. It's common
> in embedded environment to use other shells. Is there anything specific
> you need from bash, or could we use /bin/sh ?

Just that I usually use bash. I'll see if I can posixify.


> > +# SPDX-License-Identifier: LGPL-2.1-or-later
> > +
> > +REPORT="libcamera-report-$(hostname)-$(date +%Y%m%d-%H%M%S).txt"
> > +
> > +exec > >(tee "$REPORT") 2>&1
> > +
> > +section() {
> > +    echo
> > +    echo "=================================================="
> > +    echo "$1"
> > +    echo "=================================================="
> > +}
> > +
> > +run() {
> > +    echo
> > +    echo "\$ $*"
> > +    "$@" || echo "[WARN] Command failed: $*"
> > +}
> > +
> > +mark_kmsg() {
> > +    if [ -w /dev/kmsg ]; then
> > +        echo "libcamera-debug-report[$$]: $1" > /dev/kmsg
> > +    else
> > +        echo "[INFO] /dev/kmsg not writable, skipping kernel marker: $1"
> > +    fi
> > +}
> > +
> > +section "Report metadata"
> > +echo "Date: $(date -Is)"
> > +echo "Host: $(hostname)"
> > +echo "User: $(id)"
> > +
> > +section "Kernel & OS"
> > +run uname -a
> > +run cat /etc/os-release
> > +command -v lsb_release >/dev/null && run lsb_release -a
> > +
> > +section "Media / V4L2 tools"
> > +command -v media-ctl >/dev/null && run media-ctl --version
> > +command -v v4l2-ctl >/dev/null && run v4l2-ctl --version
> > +command -v v4l2-ctl >/dev/null && run v4l2-ctl --list-devices
> > +
> > +section "Device nodes"
> > +run ls -l /dev/video* /dev/v4l-* /dev/media* 2>/dev/null
> > +run grep . /sys/class/video4linux/*/name
> > +
> > +section "Deferred devices"
> > +run cat /sys/kernel/debug/devices_deferred
> > +
> > +section "V4L2 async pending subdevices"
> > +run cat /sys/kernel/debug/v4l2-async/pending_async_subdevices
> > +
> > +section "Media graph topology"
> > +for m in /dev/media*; do
> > +    echo
> > +    echo "Parsing $m"
> > +    command -v media-ctl >/dev/null && run media-ctl -p "$m"
> 
> I'm tempted to make media-ctl a hard dependency and print a warning.

That's probably a good idea to save a couple of round trips of getting
someone to redo the report!


> We could avoid v4l2-ctl as a dependency, but as it should come from the
> same package as media-ctl, I suppose it's fine.
> 
> > +done
> > +
> > +section "libcamera & userspace"
> > +run which cam
> > +command -v cam >/dev/null && run ldd `which cam`
> > +
> > +section "libcamera probe (cam -l)"
> > +mark_kmsg "BEGIN cam -l"
> > +LIBCAMERA_LOG_LEVELS=*:0 run cam -l
> > +mark_kmsg "END cam -l"
> > +
> > +section "Kernel log (post cam -l)"
> > +run dmesg
> > +
> > +section "Permissions & capabilities"
> > +run id
> > +run groups
> > +command -v getcap >/dev/null && run getcap "$(which cam)"
> > +
> > +section "End of report"
> > +echo "Report saved to $REPORT"
> > diff --git a/utils/meson.build b/utils/meson.build
> > index 3deed8ad4d7e..1a9203f81763 100644
> > --- a/utils/meson.build
> > +++ b/utils/meson.build
> > @@ -7,3 +7,10 @@ gen_shader_headers = files('gen-shader-headers.sh')
> >  
> >  ## Module signing
> >  gen_ipa_priv_key = files('gen-ipa-priv-key.sh')
> > +
> > +## Bug reporting utility
> > +install_data(
> > +    'libcamera-debug-report',
> 
> The file is called "libcamera-bug-report", not "libcamera-debug-report".
> Have you tested installation ? :-)

I did ... but that was before I renamed it ;-)

> > +    install_dir: get_option('bindir'),
> > +    install_mode: 'rwxr-xr-x',
> 
> This shouldn't be needed as the file is already executable.

ack.

> 
> > +)
> > 
> > ---
> > base-commit: c6c5a8bc5b90e476cba806cfcccc704ef115d2aa
> > change-id: 20260207-kbingham-bug-reporter-60285cd034af
> 
> -- 
> Regards,
> 
> Laurent Pinchart
Laurent Pinchart Feb. 9, 2026, 9:34 a.m. UTC | #3
On Mon, Feb 09, 2026 at 09:16:14AM +0000, Kieran Bingham wrote:
> Quoting Laurent Pinchart (2026-02-09 00:08:24)
> > On Sat, Feb 07, 2026 at 11:30:04AM +0000, Kieran Bingham wrote:
> > > Introduce a script which can be installed into the system to aide reporting
> > > potential camera and media related issues.
> > > 
> > > The script shall capture system information and store it in a temporary
> > > file - but it remains the users responsibilty to choose to share this
> > > data, and no automatic bug submissions are anticipated.
> > > 
> > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> > > ---
> > > There are many occasions where people would like to report issues with
> > > their camera, and there are always a common set of commands that we
> > > would like to run to identify potential issues.
> > > 
> > > Provide a helper that will ease reporting of camera related issues
> > > especially for bringup of new cameras or when cameras do not show.
> > > 
> > > An example bug report from my system follows, which itself shows a
> > > specific bug!
> > > 
> > > $ ./utils/libcamera-bug-report 
> > > 
> 
> ...
> 
> > > cam: error while loading shared libraries: libtiff.so.5: cannot open shared object file: No such file or directory
> > > [WARN] Command failed: cam -l
> > > [INFO] /dev/kmsg not writable, skipping kernel marker: END cam -l
> > > 
> > > ==================================================
> > > Kernel log (post cam -l)
> > > ==================================================
> > > 
> > > $ dmesg
> > > dmesg: read kernel buffer failed: Operation not permitted
> > > [WARN] Command failed: dmesg
> > 
> > This is quite common. I wonder if we shouldn't skip writing the report
> > to stdout, and only print warnings, to ensure they get noticed.
> > 
> > As for how to fix this problem, I'm not entirely sure. I don't want to
> > hide a sudo within the script, at least not one that is run by default.
> > I also don't want to tell people to run this as root. One option could
> > be to add a parameter to the script to run "sudo dmesg" instead of
> > "dmesg", and mention the option in the warning message.
> 
> Indeed, I intentionally didn't want any sudo in the script. I assume we
> can let the user choose to run as sudo after having run once ?

That would essentially tell them they have to review the whole script,
while gating internal usage of sudo with a command line argument (off by
default) may make their life easier as they would only have to grep for
sudo usage. I don't know what the best practice is.

> > > 
> > > ==================================================
> > > Permissions & capabilities
> > > ==================================================
> > > 
> > > $ id
> > > uid=1000(kbingham) gid=1000(kbingham) groups=1000(kbingham),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),30(dip),44(video),46(plugdev),108(kvm),121(lpadmin),132(lxd),133(sambashare),135(docker),998(nix-users)
> > > 
> > > $ groups
> > > kbingham adm dialout cdrom sudo audio dip video plugdev kvm lpadmin lxd sambashare docker nix-users
> > > 
> > > $ getcap /usr/bin/cam
> > > 
> > > ==================================================
> > > End of report
> > > ==================================================
> > > Report saved to libcamera-report-Monstersaurus-20260207-111858.txt
> > 
> > I would be way more vocal here about the need to inspect the report and
> > ensure there's no sensitive information before sending it.
> 
> Ack
> 
> > > ---
> > >  utils/libcamera-bug-report | 79 ++++++++++++++++++++++++++++++++++++++++++++++
> > >  utils/meson.build          |  7 ++++
> > >  2 files changed, 86 insertions(+)
> > > 
> > > diff --git a/utils/libcamera-bug-report b/utils/libcamera-bug-report
> > > new file mode 100755
> > > index 000000000000..72b89b646007
> > > --- /dev/null
> > > +++ b/utils/libcamera-bug-report
> > > @@ -0,0 +1,79 @@
> > > +#!/usr/bin/env bash
> > 
> > I don't think we can reasonably expect bash to be present. It's common
> > in embedded environment to use other shells. Is there anything specific
> > you need from bash, or could we use /bin/sh ?
> 
> Just that I usually use bash. I'll see if I can posixify.
> 
> > > +# SPDX-License-Identifier: LGPL-2.1-or-later
> > > +
> > > +REPORT="libcamera-report-$(hostname)-$(date +%Y%m%d-%H%M%S).txt"
> > > +
> > > +exec > >(tee "$REPORT") 2>&1
> > > +
> > > +section() {
> > > +    echo
> > > +    echo "=================================================="
> > > +    echo "$1"
> > > +    echo "=================================================="
> > > +}
> > > +
> > > +run() {
> > > +    echo
> > > +    echo "\$ $*"
> > > +    "$@" || echo "[WARN] Command failed: $*"
> > > +}
> > > +
> > > +mark_kmsg() {
> > > +    if [ -w /dev/kmsg ]; then
> > > +        echo "libcamera-debug-report[$$]: $1" > /dev/kmsg
> > > +    else
> > > +        echo "[INFO] /dev/kmsg not writable, skipping kernel marker: $1"
> > > +    fi
> > > +}
> > > +
> > > +section "Report metadata"
> > > +echo "Date: $(date -Is)"
> > > +echo "Host: $(hostname)"
> > > +echo "User: $(id)"
> > > +
> > > +section "Kernel & OS"
> > > +run uname -a
> > > +run cat /etc/os-release
> > > +command -v lsb_release >/dev/null && run lsb_release -a
> > > +
> > > +section "Media / V4L2 tools"
> > > +command -v media-ctl >/dev/null && run media-ctl --version
> > > +command -v v4l2-ctl >/dev/null && run v4l2-ctl --version
> > > +command -v v4l2-ctl >/dev/null && run v4l2-ctl --list-devices
> > > +
> > > +section "Device nodes"
> > > +run ls -l /dev/video* /dev/v4l-* /dev/media* 2>/dev/null
> > > +run grep . /sys/class/video4linux/*/name
> > > +
> > > +section "Deferred devices"
> > > +run cat /sys/kernel/debug/devices_deferred
> > > +
> > > +section "V4L2 async pending subdevices"
> > > +run cat /sys/kernel/debug/v4l2-async/pending_async_subdevices
> > > +
> > > +section "Media graph topology"
> > > +for m in /dev/media*; do
> > > +    echo
> > > +    echo "Parsing $m"
> > > +    command -v media-ctl >/dev/null && run media-ctl -p "$m"
> > 
> > I'm tempted to make media-ctl a hard dependency and print a warning.
> 
> That's probably a good idea to save a couple of round trips of getting
> someone to redo the report!
> 
> > We could avoid v4l2-ctl as a dependency, but as it should come from the
> > same package as media-ctl, I suppose it's fine.
> > 
> > > +done
> > > +
> > > +section "libcamera & userspace"
> > > +run which cam
> > > +command -v cam >/dev/null && run ldd `which cam`
> > > +
> > > +section "libcamera probe (cam -l)"
> > > +mark_kmsg "BEGIN cam -l"
> > > +LIBCAMERA_LOG_LEVELS=*:0 run cam -l
> > > +mark_kmsg "END cam -l"
> > > +
> > > +section "Kernel log (post cam -l)"
> > > +run dmesg
> > > +
> > > +section "Permissions & capabilities"
> > > +run id
> > > +run groups
> > > +command -v getcap >/dev/null && run getcap "$(which cam)"
> > > +
> > > +section "End of report"
> > > +echo "Report saved to $REPORT"
> > > diff --git a/utils/meson.build b/utils/meson.build
> > > index 3deed8ad4d7e..1a9203f81763 100644
> > > --- a/utils/meson.build
> > > +++ b/utils/meson.build
> > > @@ -7,3 +7,10 @@ gen_shader_headers = files('gen-shader-headers.sh')
> > >  
> > >  ## Module signing
> > >  gen_ipa_priv_key = files('gen-ipa-priv-key.sh')
> > > +
> > > +## Bug reporting utility
> > > +install_data(
> > > +    'libcamera-debug-report',
> > 
> > The file is called "libcamera-bug-report", not "libcamera-debug-report".
> > Have you tested installation ? :-)
> 
> I did ... but that was before I renamed it ;-)
> 
> > > +    install_dir: get_option('bindir'),
> > > +    install_mode: 'rwxr-xr-x',
> > 
> > This shouldn't be needed as the file is already executable.
> 
> ack.
> 
> > 
> > > +)
> > > 
> > > ---
> > > base-commit: c6c5a8bc5b90e476cba806cfcccc704ef115d2aa
> > > change-id: 20260207-kbingham-bug-reporter-60285cd034af

Patch
diff mbox series

diff --git a/utils/libcamera-bug-report b/utils/libcamera-bug-report
new file mode 100755
index 000000000000..72b89b646007
--- /dev/null
+++ b/utils/libcamera-bug-report
@@ -0,0 +1,79 @@ 
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+REPORT="libcamera-report-$(hostname)-$(date +%Y%m%d-%H%M%S).txt"
+
+exec > >(tee "$REPORT") 2>&1
+
+section() {
+    echo
+    echo "=================================================="
+    echo "$1"
+    echo "=================================================="
+}
+
+run() {
+    echo
+    echo "\$ $*"
+    "$@" || echo "[WARN] Command failed: $*"
+}
+
+mark_kmsg() {
+    if [ -w /dev/kmsg ]; then
+        echo "libcamera-debug-report[$$]: $1" > /dev/kmsg
+    else
+        echo "[INFO] /dev/kmsg not writable, skipping kernel marker: $1"
+    fi
+}
+
+section "Report metadata"
+echo "Date: $(date -Is)"
+echo "Host: $(hostname)"
+echo "User: $(id)"
+
+section "Kernel & OS"
+run uname -a
+run cat /etc/os-release
+command -v lsb_release >/dev/null && run lsb_release -a
+
+section "Media / V4L2 tools"
+command -v media-ctl >/dev/null && run media-ctl --version
+command -v v4l2-ctl >/dev/null && run v4l2-ctl --version
+command -v v4l2-ctl >/dev/null && run v4l2-ctl --list-devices
+
+section "Device nodes"
+run ls -l /dev/video* /dev/v4l-* /dev/media* 2>/dev/null
+run grep . /sys/class/video4linux/*/name
+
+section "Deferred devices"
+run cat /sys/kernel/debug/devices_deferred
+
+section "V4L2 async pending subdevices"
+run cat /sys/kernel/debug/v4l2-async/pending_async_subdevices
+
+section "Media graph topology"
+for m in /dev/media*; do
+    echo
+    echo "Parsing $m"
+    command -v media-ctl >/dev/null && run media-ctl -p "$m"
+done
+
+section "libcamera & userspace"
+run which cam
+command -v cam >/dev/null && run ldd `which cam`
+
+section "libcamera probe (cam -l)"
+mark_kmsg "BEGIN cam -l"
+LIBCAMERA_LOG_LEVELS=*:0 run cam -l
+mark_kmsg "END cam -l"
+
+section "Kernel log (post cam -l)"
+run dmesg
+
+section "Permissions & capabilities"
+run id
+run groups
+command -v getcap >/dev/null && run getcap "$(which cam)"
+
+section "End of report"
+echo "Report saved to $REPORT"
diff --git a/utils/meson.build b/utils/meson.build
index 3deed8ad4d7e..1a9203f81763 100644
--- a/utils/meson.build
+++ b/utils/meson.build
@@ -7,3 +7,10 @@  gen_shader_headers = files('gen-shader-headers.sh')
 
 ## Module signing
 gen_ipa_priv_key = files('gen-ipa-priv-key.sh')
+
+## Bug reporting utility
+install_data(
+    'libcamera-debug-report',
+    install_dir: get_option('bindir'),
+    install_mode: 'rwxr-xr-x',
+)