<배경>
strace를 사용하고자 했는데, 어쩌다 xtrace가 있더라.
혹시 Xserver와 관련해서 뭔가 trace 하는가 했는데, 예감이 맞았다.
<결론>
결론부터 얘기하면, Xclient와 Xserver 사이의 X11 Protocol 상의 정보를 훔쳐볼 수 있다.
즉, Xlib을 사용하는 Xclient 프로그램 혹은 Xlib를 backend로 사용하는 GTK 프로그램 등의 프로그램의 소스를 보지 않아도 내부적으로 사용하는 Xlib API의 이름을 알 수 있다.
또한 해당 API를 통해 Xserver 와 주고받는 정보도 볼 수 있는데 어느 정도까지 제공해주는지는 확인해봐야 할 것 같다. 기본 Xlib API는 되는듯 한데, 다른 X extension상의 API는 대부분 어느 API인지 그 이름조차 안 나오는 것 같다. 그래도 특정 Xclient에서 어떤 Xlib API를 사용하는지 살펴보는 용도로는 사용할 수 있을 것 같다.
그밖에 옵션을 통해 시각을 출력할 수 있는데, 이를 통해 특정 Xclient 프로그램의 Xserver 이용 비중을 측정한다거나, 특정 Xlib API에 대한 이용 비중을 측정하는 것은 좀 무리가 있어 보인다.
정확하게 하려면 역시 Xserver 내에 logging 소스를 추가하고 이를 분석하는 게 정확할 것 같다.
<추가 사항>
<참고 사항>
opensource 로 소스를 받을 수 있고,
ubuntu에서는 apt-get install xtrace 로 설치할 수 있다.
http://xtrace.alioth.debian.org/ 를 참고해서 자세한 정보를 얻을 수 있는데, 설치 후 man xtrace 로 옵션에 대한 정보를 볼 수 있다.
<추력 정보 설명>
아래 <사용 예>에서 방법을 보도록 하고, 바로 아래 xtrace 의 출력 결과 예를 살펴 보자.
좌측 순으로 시각, 방향(<는 Xserver로, > Xclient로), data size(?) 이고, 그 이후는 해당 정보이다.
X11 protocol에는 Xclient가 보내는 request와 Xserver가 보내는 reply, error, event 가 있는데 이에 대한 정보를 보여준다. 특히 request는 어떤 request 인지 major, minor 번호와 해당 API 이름와 정보를 출력한다.
아래는 xtrace 참고 웹 페이지에서 가져온 것으로,
xtrace에서 keyboard extension에 대한 정보를 갖고 있지 않아서 152번 Major에 대한 request가 무엇인지 알 수 없어 'unknown'으로 보여주고 있다.
000:>:0x0004:32: Reply to BigReqEnable: maximum-request-length=1048575
000:<:0005: 20: Request(98): QueryExtension name='XKEYBOARD'
000:>:0x0005:32: Reply to QueryExtension: present=true(0x01) major-opcode=152 first-event=111 first-error=178
000:<:0006: 8: Request(152): unknown
<사용 예>
$ xtrace --relative-timestamps &
No display name to create specified, trying :9
$ DISPLAY=:9 xdpyinfo
Got connection from unknown(local)
0. 0 000:<: am lsb-first want 11:0 authorising with 'MIT-MAGIC-COOKIE-1' of length 16
0. 1 000:>: Success, version is 11:0-52704.
0. 1 000:<:0001: 20: Request(98): QueryExtension name='BIG-REQUESTS'
0. 1 000:>:0001:32: Reply to QueryExtension: present=true(0x01) major-opcode=142 first-event=0 first-error=0
0. 1 000:<:0002: 4: BIG-REQUESTS-Request(142,0): BigReqEnable
0. 2 000:>:0002:32: Reply to BigReqEnable: maximum-request-length=4194303
0. 2 000:<:0003: 20: Request(55): CreateGC cid=0x04a00000 drawable=0x000000fa values={background=0x00ffffff}
0. 2 000:<:0004: 24: Request(20): GetProperty delete=false(0x00) window=0x000000fa property=0x17("RESOURCE_MANAGER") type=0x1f("STRING") long-offset=0x00000000 long-length=0x05f5e100
0. 2 000:>:0004:208: Reply to GetProperty: type=0x1f("STRING") bytes-after=0x00000000 data='Xcursor.size:\t18\nXcursor.theme:\tHuman\nXcursor.theme_core:\ttrue\nXft.antialias:\t1\nXft.dpi:\t96\nXft.hinting:\t1\nXft.hintstyle:\thintslight\nXft.lcdfilter:\tlcddefault\nXft.rgba:\trgb\n'
0. 2 000:<:0005: 20: Request(98): QueryExtension name='XKEYBOARD'
0. 3 000:>:0005:32: Reply to QueryExtension: present=true(0x01) major-opcode=144 first-event=96 first-error=153
0. 3 000:<:0006: 8: XKEYBOARD-Request(144,0): UseExtension major=1 minor=0
0. 3 000:>:0006:32: Reply to UseExtension: major=1 minor=0
0. 4 000:<:0007: 4: Request(43): GetInputFocus
0. 4 000:>:0007:32: Reply to GetInputFocus: revert-to=Parent(0x02) focus=0x04600005
0. 4 000:<:0008: 4: Request(99): ListExtensions
0. 4 000:>:0008:300: Reply to ListExtensions: number of STRs in names=0x1b names={ s='MIT-SCREEN-SAVER'},{ s='XFree86-VidModeExtension'},{ s='XFree86-DGA'},{ s='DPMS'},{ s='XVideo'},{ s='X-Resource'},{ s='DOUBLE-BUFFER'},{ s='RECORD'},{ s='DRI2'},{ s='Generic Event Extension'},{ s='SHAPE'},{ s='MIT-SHM'},{ s='XInputExtension'},{ s='XTEST'},{ s='BIG-REQUESTS'},{ s='SYNC'},{ s='XKEYBOARD'},{ s='XC-MISC'},{ s='SECURITY'},{ s='XFIXES'},{ s='RENDER'},{ s='RANDR'},{ s='XINERAMA'},{ s='Composite'},{ s='DAMAGE'},{ s='GLX'},{ s='SGI-GLX'},{ s=''},{ s=''};
0. 6 000:<:0009: 12: Request(97): QueryBestSize class=Cursor(0x00) drawable=0x000000fa width=65535 height=65535
0. 6 000:>:0009:32: Reply to QueryBestSize: width=64 height=64
0. 59 000:<:000a: 8: Request(60): FreeGC gc=0x04a00000
0. 59 000:<:000b: 4: Request(43): GetInputFocus
0. 59 000:>:000b:32: Reply to GetInputFocus: revert-to=Parent(0x02) focus=0x04600005
strace를 사용하고자 했는데, 어쩌다 xtrace가 있더라.
혹시 Xserver와 관련해서 뭔가 trace 하는가 했는데, 예감이 맞았다.
<결론>
결론부터 얘기하면, Xclient와 Xserver 사이의 X11 Protocol 상의 정보를 훔쳐볼 수 있다.
즉, Xlib을 사용하는 Xclient 프로그램 혹은 Xlib를 backend로 사용하는 GTK 프로그램 등의 프로그램의 소스를 보지 않아도 내부적으로 사용하는 Xlib API의 이름을 알 수 있다.
또한 해당 API를 통해 Xserver 와 주고받는 정보도 볼 수 있는데 어느 정도까지 제공해주는지는 확인해봐야 할 것 같다. 기본 Xlib API는 되는듯 한데, 다른 X extension상의 API는 대부분 어느 API인지 그 이름조차 안 나오는 것 같다. 그래도 특정 Xclient에서 어떤 Xlib API를 사용하는지 살펴보는 용도로는 사용할 수 있을 것 같다.
그밖에 옵션을 통해 시각을 출력할 수 있는데, 이를 통해 특정 Xclient 프로그램의 Xserver 이용 비중을 측정한다거나, 특정 Xlib API에 대한 이용 비중을 측정하는 것은 좀 무리가 있어 보인다.
정확하게 하려면 역시 Xserver 내에 logging 소스를 추가하고 이를 분석하는 게 정확할 것 같다.
<추가 사항>
- 다양한 옵션을 제공하는데, 이중 일부를 소개한다.
- -D [name] : 가상으로 사용할 display 값으로, '-D :9' 처럼 쓰면 되고 기본 적으로 :9 로 되어 있다.
- -d [name] : 기본 Xserver의 display 값으로 안 쓰면 기본값을 사용한다.
- -k : 더 이상 Xclient 가 없어도 xtrace를 종료하지 않는다.
- -i : Xclient가 Xserver에 보내는 매 request를 보낼지 선택할 수 있다.
- -o [filename] : stdout 대신에 특정 파일에 출력한다.
- --timestamps : 매 정보에 대한 시각을 출력한다.
- --relative-timestamps : 매 정보에 대한 시각을 출력하되, 첫 연결을 기준으로 상대적 시각을 출력한다.
<참고 사항>
opensource 로 소스를 받을 수 있고,
ubuntu에서는 apt-get install xtrace 로 설치할 수 있다.
http://xtrace.alioth.debian.org/ 를 참고해서 자세한 정보를 얻을 수 있는데, 설치 후 man xtrace 로 옵션에 대한 정보를 볼 수 있다.
<추력 정보 설명>
아래 <사용 예>에서 방법을 보도록 하고, 바로 아래 xtrace 의 출력 결과 예를 살펴 보자.
좌측 순으로 시각, 방향(<는 Xserver로, > Xclient로), data size(?) 이고, 그 이후는 해당 정보이다.
X11 protocol에는 Xclient가 보내는 request와 Xserver가 보내는 reply, error, event 가 있는데 이에 대한 정보를 보여준다. 특히 request는 어떤 request 인지 major, minor 번호와 해당 API 이름와 정보를 출력한다.
아래는 xtrace 참고 웹 페이지에서 가져온 것으로,
xtrace에서 keyboard extension에 대한 정보를 갖고 있지 않아서 152번 Major에 대한 request가 무엇인지 알 수 없어 'unknown'으로 보여주고 있다.
000:>:0x0004:32: Reply to BigReqEnable: maximum-request-length=1048575
000:<:0005: 20: Request(98): QueryExtension name='XKEYBOARD'
000:>:0x0005:32: Reply to QueryExtension: present=true(0x01) major-opcode=152 first-event=111 first-error=178
000:<:0006: 8: Request(152): unknown
<사용 예>
$ xtrace --relative-timestamps &
No display name to create specified, trying :9
$ DISPLAY=:9 xdpyinfo
Got connection from unknown(local)
0. 0 000:<: am lsb-first want 11:0 authorising with 'MIT-MAGIC-COOKIE-1' of length 16
0. 1 000:>: Success, version is 11:0-52704.
0. 1 000:<:0001: 20: Request(98): QueryExtension name='BIG-REQUESTS'
0. 1 000:>:0001:32: Reply to QueryExtension: present=true(0x01) major-opcode=142 first-event=0 first-error=0
0. 1 000:<:0002: 4: BIG-REQUESTS-Request(142,0): BigReqEnable
0. 2 000:>:0002:32: Reply to BigReqEnable: maximum-request-length=4194303
0. 2 000:<:0003: 20: Request(55): CreateGC cid=0x04a00000 drawable=0x000000fa values={background=0x00ffffff}
0. 2 000:<:0004: 24: Request(20): GetProperty delete=false(0x00) window=0x000000fa property=0x17("RESOURCE_MANAGER") type=0x1f("STRING") long-offset=0x00000000 long-length=0x05f5e100
0. 2 000:>:0004:208: Reply to GetProperty: type=0x1f("STRING") bytes-after=0x00000000 data='Xcursor.size:\t18\nXcursor.theme:\tHuman\nXcursor.theme_core:\ttrue\nXft.antialias:\t1\nXft.dpi:\t96\nXft.hinting:\t1\nXft.hintstyle:\thintslight\nXft.lcdfilter:\tlcddefault\nXft.rgba:\trgb\n'
0. 2 000:<:0005: 20: Request(98): QueryExtension name='XKEYBOARD'
0. 3 000:>:0005:32: Reply to QueryExtension: present=true(0x01) major-opcode=144 first-event=96 first-error=153
0. 3 000:<:0006: 8: XKEYBOARD-Request(144,0): UseExtension major=1 minor=0
0. 3 000:>:0006:32: Reply to UseExtension: major=1 minor=0
0. 4 000:<:0007: 4: Request(43): GetInputFocus
0. 4 000:>:0007:32: Reply to GetInputFocus: revert-to=Parent(0x02) focus=0x04600005
0. 4 000:<:0008: 4: Request(99): ListExtensions
0. 4 000:>:0008:300: Reply to ListExtensions: number of STRs in names=0x1b names={ s='MIT-SCREEN-SAVER'},{ s='XFree86-VidModeExtension'},{ s='XFree86-DGA'},{ s='DPMS'},{ s='XVideo'},{ s='X-Resource'},{ s='DOUBLE-BUFFER'},{ s='RECORD'},{ s='DRI2'},{ s='Generic Event Extension'},{ s='SHAPE'},{ s='MIT-SHM'},{ s='XInputExtension'},{ s='XTEST'},{ s='BIG-REQUESTS'},{ s='SYNC'},{ s='XKEYBOARD'},{ s='XC-MISC'},{ s='SECURITY'},{ s='XFIXES'},{ s='RENDER'},{ s='RANDR'},{ s='XINERAMA'},{ s='Composite'},{ s='DAMAGE'},{ s='GLX'},{ s='SGI-GLX'},{ s=''},{ s=''};
0. 6 000:<:0009: 12: Request(97): QueryBestSize class=Cursor(0x00) drawable=0x000000fa width=65535 height=65535
0. 6 000:>:0009:32: Reply to QueryBestSize: width=64 height=64
0. 59 000:<:000a: 8: Request(60): FreeGC gc=0x04a00000
0. 59 000:<:000b: 4: Request(43): GetInputFocus
0. 59 000:>:000b:32: Reply to GetInputFocus: revert-to=Parent(0x02) focus=0x04600005