媒體子系統中的除錯和追蹤¶
本文件用作媒體子系統中除錯裝置驅動程式的起點和查詢,以及從使用者空間除錯這些驅動程式。
一般除錯建議¶
有關一般建議,請參見一般建議文件。
以下各節顯示了一些可用的工具。
dev_debug 模組引數¶
每個影片裝置都提供一個 dev_debug 引數,該引數允許深入瞭解後臺中的 IOCTL。
# cat /sys/class/video4linux/video3/name
rkvdec
# echo 0xff > /sys/class/video4linux/video3/dev_debug
# dmesg -wH
[...] videodev: v4l2_open: video3: open (0)
[ +0.000036] video3: VIDIOC_QUERYCAP: driver=rkvdec, card=rkvdec,
bus=platform:rkvdec, version=0x00060900, capabilities=0x84204000,
device_caps=0x04204000
有關完整文件,請參見影片裝置除錯
dev_dbg() / v4l2_dbg()¶
兩個除錯列印語句,它們特定於裝置和 v4l2 子系統,除非它們對於調查具有長期價值,否則請避免將它們新增到最終提交中。
有關一般概述,請參見printk() & friends 指南。
兩者之間的區別?
v4l2_dbg() 在底層使用 v4l2_printk(),後者進一步使用
printk()直接,因此不能被動態除錯定位dev_dbg() 可以被動態除錯定位
v4l2_dbg() 具有更具體的媒體子系統字首格式,而 dev_dbg 僅突出顯示驅動程式名稱和日誌的位置
動態除錯¶
一種將除錯輸出減少到您需要的方法。
有關一般建議,請參見動態除錯 指南。
這是一個示例,它啟用了檔案中所有可用的 pr_debug()
$ alias ddcmd='echo $* > /proc/dynamic_debug/control'
$ ddcmd '-p; file v4l2-h264.c +p'
$ grep =p /proc/dynamic_debug/control
drivers/media/v4l2-core/v4l2-h264.c:372 [v4l2_h264]print_ref_list_b =p
"ref_pic_list_b%u (cur_poc %u%c) %s"
drivers/media/v4l2-core/v4l2-h264.c:333 [v4l2_h264]print_ref_list_p =p
"ref_pic_list_p (cur_poc %u%c) %s\n"
Ftrace¶
一個內部核心跟蹤器,可以跟蹤靜態預定義的事件、函式呼叫等。對於除錯問題而不更改核心並瞭解子系統的行為非常有用。
有關一般建議,請參見Ftrace 指南。
DebugFS¶
此工具允許您將驅動程式的內部值轉儲或修改為自定義檔案系統中的檔案。
有關一般建議,請參見DebugFS 指南。
Perf & 替代方案¶
用於測量執行系統上的各種統計資料以診斷問題的工具。
有關一般建議,請參見Perf & 替代方案 指南。
媒體裝置示例
收集解碼作業的統計資料:(此示例是在使用 fluster 測試套件的 rkvdec 編解碼器驅動程式的 RK3399 SoC 上)
perf stat -d python3 fluster.py run -d GStreamer-H.264-V4L2SL-Gst1.0 -ts
JVT-AVC_V1 -tv AUD_MW_E -j1
...
Performance counter stats for 'python3 fluster.py run -d
GStreamer-H.264-V4L2SL-Gst1.0 -ts JVT-AVC_V1 -tv AUD_MW_E -j1 -v':
7794.23 msec task-clock:u # 0.697 CPUs utilized
0 context-switches:u # 0.000 /sec
0 cpu-migrations:u # 0.000 /sec
11901 page-faults:u # 1.527 K/sec
882671556 cycles:u # 0.113 GHz (95.79%)
711708695 instructions:u # 0.81 insn per cycle (95.79%)
10581935 branches:u # 1.358 M/sec (15.13%)
6871144 branch-misses:u # 64.93% of all branches (95.79%)
281716547 L1-dcache-loads:u # 36.144 M/sec (95.79%)
9019581 L1-dcache-load-misses:u # 3.20% of all L1-dcache accesses (95.79%)
<not supported> LLC-loads:u
<not supported> LLC-load-misses:u
11.180830431 seconds time elapsed
1.502318000 seconds user
6.377221000 seconds sys
事件和指標的可用性取決於您執行的系統。
錯誤檢查 & panic 分析¶
各種核心配置選項,以增強 Linux 核心的錯誤檢測,但代價是降低效能。
有關一般建議,請參見KASAN、UBSAN、lockdep 和其他錯誤檢查器 指南。
使用 v4l2-compliance 進行驅動程式驗證¶
為了驗證驅動程式是否符合 v4l2 API,使用工具 v4l2-compliance,它是 v4l_utils 的一部分,這是一個與媒體子系統配合使用的使用者空間工具套件。
要檢視詳細的媒體拓撲(並檢查它),請使用
v4l2-compliance -M /dev/mediaX --verbose
您還可以對媒體拓撲中引用的所有裝置執行完整的合規性檢查,使用
v4l2-compliance -m /dev/mediaX
除錯接收影片的問題¶
在驅動程式中實現 vidioc_log_status:這可以將當前狀態記錄到核心日誌中。它由 v4l2-ctl --log-status 呼叫。對於除錯接收影片(TV/S-Video/HDMI/etc)的問題非常有用,因為影片訊號是外部的(因此不可預測)。對於攝像頭感測器輸入不太有用,因為您可以控制攝像頭感測器做什麼。
通常您可以只分配預設值
.vidioc_log_status = v4l2_ctrl_log_status,
但是您也可以建立自己的回撥,以建立自定義狀態日誌。
您可以在 cobalt 驅動程式中找到一個示例(drivers/media/pci/cobalt/cobalt-v4l2.c)。
版權所有 ©2024 : Collabora