달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'Tool/ETC'에 해당되는 글 1건

  1. 2010.03.06 xtrace - Xclient program이 사용하는 xlib API를 보자
<배경>

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 소스를 추가하고 이를 분석하는 게 정확할 것 같다.


<추가 사항>
  1. 다양한 옵션을 제공하는데, 이중 일부를 소개한다.
  2. -D [name] : 가상으로 사용할 display 값으로,  '-D :9' 처럼 쓰면 되고 기본 적으로 :9 로 되어 있다.
  3. -d [name] : 기본 Xserver의 display 값으로 안 쓰면 기본값을 사용한다.
  4. -k : 더 이상 Xclient 가 없어도 xtrace를 종료하지 않는다.
  5. -i : Xclient가 Xserver에 보내는 매 request를 보낼지 선택할 수 있다.
  6. -o [filename] : stdout 대신에 특정 파일에 출력한다.
  7. --timestamps : 매 정보에 대한 시각을 출력한다.
  8. --relative-timestamps : 매 정보에 대한 시각을 출력하되, 첫 연결을 기준으로 상대적 시각을 출력한다.

<참고 사항>

opensource 로 소스를 받을 수 있고,
ubuntu에서는 apt-get install xtrace 로 설치할 수 있다.
http://xtrace.alioth.debian.org/ 를 참고해서 자세한 정보를 얻을 수 있는데, 설치 후 man xtrace 로 옵션에 대한 정보를 볼 수 있다.


<추력 정보 설명>

아래  <사용 예>에서 방법을 보도록 하고, 바로 아래 xtrace 의 출력 결과 예를 살펴 보자.

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


좌측 순으로 시각, 방향(<는 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

Posted by neodelicious
|