2010-02-28 78 views
0

在Xlib(libX11.so)中是否内置了任何调试选项?我可以得到X11 lib调用列表吗?xlib集成调试(追踪)

我想从重多线程的闭源程序中获得完整的xlib函数调用。这是一个非公开的嵌入式平台,所以我不能使用gdb进行多线程调试,并且平台上没有ltrace。 此外,此程序无法通过tcp/ip连接到x服务器,只能使用unix-socket。我想从xlib本身跟踪xlib调用。

PS。 Xlib来自相当现代的xfree甚至xorg。从GNU Linux的

回答

2

您可以使用xscope监视发送的Unix套接字的请求,甚至当你不能发送X协议通过TCP能够使用的网络监控工具,如Wireshark

+0

打招呼。 wireshark会解码x函数调用吗? xscope是否包含在默认的xfree - x.org中?哪些版本? – osgx 2010-02-28 21:58:54

+1

Wireshark与xscope一样,解码X协议请求,而不是库函数调用。 X.Org提供xscope,但并非所有分销商都将其包含在其包装中。 (由于X11R7.0,X.Org分别分发每个应用程序,并让构建者决定包含哪些应用程序,所以现在还没有真正的“默认X.Org”,没有人真正使用XFree86。) – alanc 2010-03-01 19:00:14

+0

有一个很多的Linux发行版,其中一些很久没有更新:) – osgx 2010-03-05 08:04:56

1

您可能会研究xlibtrace,它会在Xlib和您的代码之间的接口处追踪,而不是X Windows线路协议。我已经执行了几个例子,它似乎工作。

源可在http://kev.pulo.com.au/xlibtrace

我不得不修改它得到它来编译:

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__