2010-02-28 2 views
0

Xlib (libX11.so)에 내장 된 디버깅 옵션이 있습니까? X11 lib 호출 목록을 가져올 수 있습니까?xlib 통합 디버깅 (추적)

무거운 멀티 스레드, 폐쇄 소스 프로그램에서 xlib 함수 호출의 전체 추적을 얻고 싶습니다. 공개되지 않은 임베디드 플랫폼이기 때문에 다중 스레드 디버깅을 위해 gdb를 사용할 수 없으며 플랫폼에 ltrace가 없습니다. 또한이 프로그램은 tcp/ip를 통해 x 서버에 연결할 수 없으며 유닉스 소켓에만 연결할 수 있습니다. xlib 자체에서 xlib 호출을 추적하고 싶습니다.

ps. 오히려 현대적인 xfree 또는 xorg의 Xlib. gnu linux

답변

2

Wireshark과 같은 네트워크 모니터링 도구를 사용할 수 있도록 TCP를 통해 X 프로토콜을 보낼 수없는 경우에도 xscope을 사용하여 유닉스 소켓을 통해 전송 된 요청을 모니터링 할 수 있습니다.

+0

인사를 :

소스는 내가 컴파일 얻기 위해 수정했다 http://kev.pulo.com.au/xlibtrace

에서 확인할 수있다. wireshark가 x 함수 호출을 디코드합니까? xscope는 기본 xfree - x.org에 포함되어 있습니까? 어떤 버전? – osgx

+1

Wireshark는 xscope와 마찬가지로 라이브러리 함수 호출이 아니라 X 프로토콜 요청을 디코딩합니다. xscope는 X.Org에서 구할 수 있지만 모든 배포자가 패키지 세트에 포함하지는 않습니다. (X11R7.0부터 X.Org는 각 애플리케이션을 개별적으로 배포하고 포함 할 사람을 결정할 수있게하여 요즘은 "기본 X.Org"에 실제로 있지 않습니다. 아무도 실제로 XFree86을 사용하지 않습니다.) – alanc

+0

많은 리눅스 배포판과 그 중 일부는 오랫동안 업데이트되지 않았습니다 :) – osgx

1

Xlibtrace는 X Windows 와이어 프로토콜 대신 Xlib와 코드 사이의 인터페이스에서 추적됩니다. 몇 가지 예제를 실행했으며 작동하는 것 같습니다.

diff -u src/libxlibtrace-functions.h.sh.orig src/libxlibtrace-functions.h.sh 
--- src/libxlibtrace-functions.h.sh.orig 2009-01-19 23:43:46.000000000 -0500 
+++ src/libxlibtrace-functions.h.sh 2016-02-24 13:49:25.155556294 -0500 
@@ -81,7 +81,7 @@ 
    return (t ~ /^[cC][oO][nN][sS][tT][  ]/); 
} 

-function isarray(t) { 
+function our_isarray(t) { 
    return (t ~ /\[.*\]$/); 
} 

@@ -90,7 +90,7 @@ 
     return sprintf("%s", t); 
    } else if (isfunctionpointer(t)) { 
     return gensub("^(.*\\(\\*)(\\).*)$", "\\1"n"\\2", "", t); 
- } else if (isarray(t)) { 
+ } else if (our_isarray(t)) { 
     return gensub("^(.*)(\\[.*\\])$", "\\1"n"\\2", "", t); 
    } else { 
     return sprintf("%s %s", t, n); 
diff -u src/libxlibtrace-print-x.h.orig src/libxlibtrace-print-x.h 
--- src/libxlibtrace-print-x.h.orig 2009-01-19 22:30:06.000000000 -0500 
+++ src/libxlibtrace-print-x.h 2016-02-24 14:27:08.681352710 -0500 
@@ -2415,6 +2415,20 @@ 
    dofflush(f); 
}) 

+// XGenericEventCookie 
+#define __REALTYPE_XGenericEventCookie__ XGenericEventCookie 
+#define __REALTYPE_XGenericEventCookie_p__ XGenericEventCookie * 
+#define __REALTYPE_XGenericEventCookie_pp__ XGenericEventCookie ** 
+#define __TRACE_PRINT_TYPE_STRUCT_BODY_XGenericEventCookie__(safetype) \ 
+ __TRACE_PRINT_STRUCT_MEMBER__(f, safetype, *value, int, type) __PRINT_COMMA__(f) \ 
+ __TRACE_PRINT_STRUCT_MEMBER__(f, safetype, *value, unsigned_long, serial) __PRINT_COMMA__(f) \ 
+ __TRACE_PRINT_STRUCT_MEMBER__(f, safetype, *value, Bool, send_event) __PRINT_COMMA__(f) \ 
+ __TRACE_PRINT_STRUCT_MEMBER__(f, safetype, *value, Display_p, display) __PRINT_COMMA__(f) \ 
+ __TRACE_PRINT_STRUCT_MEMBER__(f, safetype, *value, int, extension) __PRINT_COMMA__(f) \ 
+ __TRACE_PRINT_STRUCT_MEMBER__(f, safetype, *value, int, evtype) __PRINT_COMMA__(f) \ 
+ __TRACE_PRINT_STRUCT_MEMBER__(f, safetype, *value, unsigned_int, cookie) __PRINT_COMMA__(f) \ 
+ __TRACE_PRINT_STRUCT_MEMBER__(f, safetype, *value, void_p, data) 
+__INDIRECT_CALL_3__(__TRACE_PRINT_TYPE_STRUCT,__LIBXLIBTRACE_PRINT_X_SUFF__,__)(XGenericEventCookie) 


#undef __LIBXLIBTRACE_PRINT_X_BODY__ 
관련 문제