Как мне узнать, какая программа «владеет» горячей клавишей?

Я разработчик ядра, поэтому могу сказать вам, что "это зависит". Не исключено, что проактивное удаление и повторная установка драйвера может уберечь от ошибки, как яблоко в день против доктора. Это зависит от жука".

Отличным примером проблемы, для которой rmmod может быть обходным решением, является непроизвольное выделение памяти в драйвере (утечка de facto), когда драйвер не потерял память и может очистить ее во время rmmod.

Если ошибка - это нестабильность, вызванная повреждением, то обходной путь маловероятен, хотя и возможен. Предположим, что проблема решается в несколько этапов: сначала драйвер должен перейти в некоторое относительно редкое состояние S (возможно, недопустимое состояние), а затем должно произойти некоторое относительно редкое событие E, пока он находится в этом состоянии. (Если E происходит, а драйвер не находится в состоянии S, то проблема не воспроизводится). Если rmmod и повторная установка выводят драйвер из состояния S и выполняются периодически, то проблема становится менее воспроизводимой.

Удаление и повторная установка могут иметь свои проблемы, такие как создание утечек (драйвер не очищает все при rmmod) или оставление висячих указателей (драйвер деаллоцирует некоторый объект, но не удаляет его должным образом из всех ассоциаций). При разработке динамических драйверов одним из тестовых примеров должен быть сценарий оболочки, выполняющий rmmod/insmod в цикле. (Это, конечно, не дает полного покрытия: вам также понадобится insmod; различные реальные случаи использования драйвера; rmmod в цикле).

33
11.02.2016, 00:44
1 ответ

Чтобы узнать, какое приложение/программа захватила ваш ключ, используйте отладочный keyym XF86LogGrabInfo. Используйте xdotool для одновременного нажатия клавиш + XF86LogGrabInfo, например, в терминале

KEY=XF86AudioPlay
xdotool keydown ${KEY}; xdotool key XF86LogGrabInfo; xdotool keyup ${KEY} 

Затем проверьте вывод с помощью tail /var/log/Xorg.0 .log
Обратите внимание, что с gnome 3/gdm и systemd это больше не записывается в Xorg.0.log (вместо этого это записывается в journal). В этом случае вы можете run

journalctl -f

и затем в другом терминале выполнить команды xdotool. Переключившись на первый терминал, вы увидите что-то вроде

/usr/lib/gdm/gdm-x-session[629]: Active grab 0x40c0a58e (xi2) on device 'Virtual core keyboard' (3):
/usr/lib/gdm/gdm-x-session[629]: client pid 708 /usr/bin/gnome-shell
/usr/lib/gdm/gdm-x-session[629]: at 32595124 (from passive grab) (device frozen, state 6)
/usr/lib/gdm/gdm-x-session[629]: xi2 event mask for device 3: 0xc000
/usr/lib/gdm/gdm-x-session[629]: passive grab type 2, detail 0xac, activating key 172

В приведенном выше примере программой (клиентом), захватившей ключ, является gnome-shell.

28
27.01.2020, 19:37

Теги

Похожие вопросы