[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#404367: some debugging



merge 456763
thanks

I think the bug mentioned above is a duplicate.

I've analysed a case in which pressing keys '1234' lead to output '122222222222222222234'. The following is some debug output. The duplicate keypresses are seen by ProcessKeyboardEvent() while xserver-xorg-input-keyboard's kbd.c does see the correct number of keypresses (cf. to bug 456763 for that result).

[1225311281.081142] kbd driver rec scancode: 0x022 down
xf86PostKeyboardEvent: nevents=2
[1225311281.081216] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225311281.153208] kbd driver rec scancode: 0x023 down
xf86PostKeyboardEvent: nevents=2
[1225311281.153276] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.472617] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.472675] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.504957] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.505014] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.537949] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.538003] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.570969] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.571070] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.603961] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.604017] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.636956] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.637013] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.669952] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.670006] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.702955] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.703009] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.735951] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.736006] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.768952] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.769007] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.802128] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.802182] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.834971] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.835025] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.867954] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.868010] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.900955] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.901010] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.934245] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.934291] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.966955] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311281.967012] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311281.999953] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311282.000007] ProcessKeyboardEvent(key=0x0b,down,count=1)
[1225311282.022955] kbd driver rec scancode: 0x024 down
xf86PostKeyboardEvent: nevents=2
[1225311282.023017] kbd driver rec scancode: 0x025 down
xf86PostKeyboardEvent: nevents=2
[1225311282.023037] kbd driver rec scancode: 0x022 up
xf86PostKeyboardEvent: nevents=2
[1225311282.023057] kbd driver rec scancode: 0x023 up
xf86PostKeyboardEvent: nevents=2
[1225311282.023076] kbd driver rec scancode: 0x024 up
xf86PostKeyboardEvent: nevents=2
[1225311282.023096] kbd driver rec scancode: 0x025 up
xf86PostKeyboardEvent: nevents=2
[1225311282.023128] ProcessKeyboardEvent(key=0x0c,down,count=1)
[1225311282.023240] ProcessKeyboardEvent(key=0x0d,down,count=1)
[1225311282.023294] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225311282.023307] ProcessKeyboardEvent(key=0x0b,up,count=1)
[1225311282.023319] ProcessKeyboardEvent(key=0x0c,up,count=1)
[1225311282.023331] ProcessKeyboardEvent(key=0x0d,up,count=1)


With some more debug code, I came to the conclusion that mieqEnqueue is also called in the right amounts, as shown in that snippet:

[1225669913.945238] kbd driver rec scancode: 0x022 down
xf86PostKeyboardEvent: nevents=2
[1225669913.945310] mieqEnqueue: oldtail=267/512
[1225669913.945326] mieqEnqueue: newtail=268/512
[1225669914.020137] mieqEnqueue: oldtail=268/512
[1225669914.020191] mieqEnqueue: newtail=269/512
[1225669914.020220] mieqProcessInputEvents: head=267/512
[1225669914.020237] mieqProcessInputEvents: calling 0x55a060
[1225669914.032838] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.032971] mieqProcessInputEvents: head=268/512
[1225669914.032989] mieqProcessInputEvents: calling 0x55a060
[1225669914.282570] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.282633] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.315521] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.315581] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.348529] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.348586] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.387551] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.387611] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.421645] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.421688] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.462520] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.462578] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.511933] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.511993] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.544589] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.721285] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.753518] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.831914] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.864524] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.866070] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.898522] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669914.898570] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669914.931518] ProcessKeyboardEvent(key=0x0a,up,count=1)
[1225669917.279574] ProcessKeyboardEvent(key=0x0a,down,count=1)
[1225669917.280268] kbd driver rec scancode: 0x023 down
xf86PostKeyboardEvent: nevents=2
[1225669917.281070] mieqEnqueue: oldtail=269/512
[1225669917.281092] mieqEnqueue: newtail=270/512
[1225669917.281109] mieqEnqueue: oldtail=270/512
[1225669917.281129] mieqEnqueue: newtail=271/512
[1225669917.281147] kbd driver rec scancode: 0x024 down
xf86PostKeyboardEvent: nevents=2
[1225669917.281186] mieqEnqueue: oldtail=271/512
[1225669917.281203] mieqEnqueue: newtail=272/512
[1225669917.281220] mieqEnqueue: oldtail=272/512
[1225669917.281237] mieqEnqueue: newtail=273/512
[1225669917.281254] kbd driver rec scancode: 0x022 up
xf86PostKeyboardEvent: nevents=2
[1225669917.281289] mieqEnqueue: oldtail=273/512
[1225669917.281305] mieqEnqueue: newtail=274/512
[1225669917.281322] mieqEnqueue: oldtail=274/512
[1225669917.281339] mieqEnqueue: newtail=275/512

nm /usr/bin/Xorg | grep 55a060
000000000055a060 T ProcessKeyboardEvent


At that point I really got curious which function was doing the additional calls to ProcessKeyboardEvent(), so added logging of backtraces to ProcessKeyboardEvent(), the output of which may be seen below. (Stack frames in which the backtrace doesn't give a function name have been filled in manually with the help of nm.)


[1226009095.847753] kbd driver rec scancode: 0x022 down
xf86PostKeyboardEvent: nevents=2
[1226009095.847827] mieqEnqueue: oldtail=191/512
[1226009095.847841] mieqEnqueue: newtail=192/512
[1226009095.886041] mieqEnqueue: oldtail=192/512
[1226009095.886067] mieqEnqueue: newtail=193/512
[1226009095.886091] mieqProcessInputEvents: head=191/512
[1226009095.886107] mieqProcessInputEvents: calling 0x55a0f0
[1226009095.886128] ProcessKeyboardEvent(key=0x0a,down,count=1)
[0] /usr/bin/X(CoreProcessKeyboardEvent+0x94) [0x45c2a4]
[1] /usr/bin/X(XkbHandleActions+0x20f) [0x5594df]
[2] /usr/bin/X(XkbProcessKeyboardEvent+0x116) [0x559d46]
[3] /usr/bin/X(AccessXFilterPressEvent+0x10c) [0x551c8c]
[4] /usr/bin/X(mieqProcessInputEvents+0x1c9) [0x4e0469]
[5] /usr/bin/X(ProcessInputEvents+0x1c) [0x498ffc]
[6] /usr/bin/X(Dispatch+0x81) [0x44f511]
[7] /usr/bin/X(main+0x4a5) [0x436bd5]
[8] /lib/libc.so.6(__libc_start_main+0xe6) [0x7f2804a3c1a6]
[9] /usr/bin/X(FontFileCompleteXLFD+0x281) [0x435e99]
[1226009095.886992] mieqProcessInputEvents: head=192/512
[1226009095.887009] mieqProcessInputEvents: calling 0x55a0f0
[1226009095.919175] kbd driver rec scancode: 0x023 down
xf86PostKeyboardEvent: nevents=2
[1226009095.919238] mieqEnqueue: oldtail=193/512
[1226009095.919253] mieqEnqueue: newtail=194/512
[1226009095.924321] mieqEnqueue: oldtail=194/512
[1226009095.924346] mieqEnqueue: newtail=195/512
[1226009095.924365] mieqProcessInputEvents: head=193/512
[1226009095.924380] mieqProcessInputEvents: calling 0x55a0f0
[1226009095.924400] ProcessKeyboardEvent(key=0x0b,down,count=1)
[0] /usr/bin/X(CoreProcessKeyboardEvent+0x94) [0x45c2a4]
[1] /usr/bin/X(XkbHandleActions+0x20f) [0x5594df]
[2] /usr/bin/X(XkbProcessKeyboardEvent+0x116) [0x559d46]
[3] /usr/bin/X(AccessXFilterPressEvent+0x10c) [0x551c8c]
[4] /usr/bin/X(mieqProcessInputEvents+0x1c9) [0x4e0469]
[5] /usr/bin/X(ProcessInputEvents+0x1c) [0x498ffc]
[6] /usr/bin/X(Dispatch+0x81) [0x44f511]
[7] /usr/bin/X(main+0x4a5) [0x436bd5]
[8] /lib/libc.so.6(__libc_start_main+0xe6) [0x7f2804a3c1a6]
[9] /usr/bin/X(FontFileCompleteXLFD+0x281) [0x435e99]
[1226009095.925247] mieqProcessInputEvents: head=194/512
[1226009095.925264] mieqProcessInputEvents: calling 0x55a0f0
[1226009096.177415] ProcessKeyboardEvent(key=0x0b,up,count=1)
[0] /usr/bin/X(CoreProcessKeyboardEvent+0x94) [0x45c2a4]
[1] /usr/bin/X(XkbHandleActions+0x20f) [0x5594df]
[2] /usr/bin/X(XkbProcessKeyboardEvent+0x116) [0x559d46]
[3] /usr/bin/X [0x551f54]   551ef0 t AccessXKeyboardEvent
[4] /usr/bin/X [0x552004]   551fb0 t AccessXRepeatKeyExpire
[5] /usr/bin/X [0x56f3b8]   56f3a0 t DoTimer
[6] /usr/bin/X(WaitForSomething+0x5e7) [0x56fa87]
[7] /usr/bin/X(Dispatch+0x8f) [0x44f51f]
[8] /usr/bin/X(main+0x4a5) [0x436bd5]
[9] /lib/libc.so.6(__libc_start_main+0xe6) [0x7f2804a3c1a6]
[10] /usr/bin/X(FontFileCompleteXLFD+0x281) [0x435e99]
[1226009098.702652] ProcessKeyboardEvent(key=0x0b,down,count=1)
[0] /usr/bin/X(CoreProcessKeyboardEvent+0x94) [0x45c2a4]
[1] /usr/bin/X(XkbHandleActions+0x20f) [0x5594df]
[2] /usr/bin/X(XkbProcessKeyboardEvent+0x116) [0x559d46]
[3] /usr/bin/X [0x551f54]   551ef0 t AccessXKeyboardEvent
[4] /usr/bin/X [0x552018]   551fb0 t AccessXRepeatKeyExpire
[5] /usr/bin/X [0x56f3b8]   56f3a0 t DoTimer
[6] /usr/bin/X(WaitForSomething+0x5e7) [0x56fa87]
[7] /usr/bin/X(Dispatch+0x8f) [0x44f51f]
[8] /usr/bin/X(main+0x4a5) [0x436bd5]
[9] /lib/libc.so.6(__libc_start_main+0xe6) [0x7f2804a3c1a6]
[10] /usr/bin/X(FontFileCompleteXLFD+0x281) [0x435e99]
[1226009098.704189] kbd driver rec scancode: 0x024 down
xf86PostKeyboardEvent: nevents=2
[1226009098.704246] mieqEnqueue: oldtail=195/512
[1226009098.704262] mieqEnqueue: newtail=196/512


So it seems that somewhere the repeating of keys is triggered by ways of setting a timer which then calls AccessXKeyboardEvent(). I hope that helps.

The bug can be cured (cf. attached patch) in a haphazard way by always returning 0 in AccessXRepeatKeyExpire(), which of course will break something else (filterkeys?), but works well for me.

Kind regards,

Thiemo Nagel
--
+-------------------------+-------------------------+
| TU Muenchen             | Room   PH1 3558         |
| Physik-Department E18   |                         |
| James-Franck-Strasse    | Phone +49 89 289-12592  |
| D-85747 Garching        | Fax   +49 89 289-12570  |
+-------------------------+-------------------------+
--- xkbAccessX.c~	2008-06-10 19:57:20.000000000 +0200
+++ xkbAccessX.c	2008-11-12 21:25:55.000000000 +0100
@@ -313,6 +313,8 @@
 KeyCode		key;
 BOOL            is_core;
 
+  return 0;
+
     if (xkbi->repeatKey == 0)
 	return 0;
 

Reply to: