встроенная отладка xlib (трассировка) - PullRequest
0 голосов
/ 28 февраля 2010

Есть ли какие-либо опции отладки, встроенные в Xlib (libX11.so)? Могу ли я получить список вызовов библиотеки X11?

Я хочу получить полную трассировку вызовов функций xlib из многопоточной программы с закрытым исходным кодом. Это не общедоступная встроенная платформа, поэтому я не могу использовать gdb для многопоточной отладки, и на платформе нет ltrace. Кроме того, эта программа не может подключиться к x-серверу через TCP / IP, только Unix-сокет. Я хочу отследить вызовы xlib от самого xlib.

пс. Xlib от довольно современного xfree или даже xorg. от GNU LINUX

Ответы [ 2 ]

2 голосов
/ 28 февраля 2010

Возможно, вы сможете использовать xscope для мониторинга запросов, отправляемых через сокет Unix, даже если вы не можете отправить протокол X по TCP, чтобы использовать инструменты мониторинга сети, такие как Wireshark .

1 голос
/ 24 февраля 2016

Вы можете взглянуть на xlibtrace, который отслеживает интерфейс между Xlib и вашим кодом, а не протокол X Windows wire. Я выполнил пару примеров, и похоже, что это работает.

Источник доступен по адресу 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__
...