diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2012-02-17 17:51:06 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2012-02-17 17:51:06 (GMT) |
commit | 73605bffb935fc51a52be1936426211e31dd898a (patch) | |
tree | 094d72321011baae0d5054e06906e9d006249c3b /src/debug/jdwp/debugger.c | |
parent | 98a3c749a15349b874dcef0ce3a43ebff651d95a (diff) |
Listed all running threads using Python.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@234 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/debug/jdwp/debugger.c')
-rw-r--r-- | src/debug/jdwp/debugger.c | 171 |
1 files changed, 162 insertions, 9 deletions
diff --git a/src/debug/jdwp/debugger.c b/src/debug/jdwp/debugger.c index ada09bb..51a0db8 100644 --- a/src/debug/jdwp/debugger.c +++ b/src/debug/jdwp/debugger.c @@ -24,6 +24,7 @@ #include "debugger.h" +#include <string.h> #include <i18n.h> @@ -66,6 +67,10 @@ static void g_java_debugger_init(GJavaDebugger *); /* Procède au démarrage effectif de la session de débogage. */ static bool g_java_debugger_attach(GJavaDebugger *); +/* Fournit les identifiants de tous les threads actifs. */ +static pid_t *g_java_debugger_list_all_threads(GJavaDebugger *, char ***, size_t *); + + /* Indique le type défini par la GLib pour le débogueur java. */ G_DEFINE_TYPE(GJavaDebugger, g_java_debugger, G_TYPE_BINARY_DEBUGGER); @@ -110,6 +115,8 @@ static void g_java_debugger_init(GJavaDebugger *debugger) parent->attach = (attach_debugger_fc)g_java_debugger_attach; + parent->all_threads = (dbg_list_all_threads_fc)g_java_debugger_list_all_threads; + #if 0 parent->run = (basic_debugger_fc)g_java_debugger_run; parent->resume = (resume_debugger_fc)g_java_debugger_resume; @@ -174,6 +181,8 @@ static bool g_java_debugger_attach(GJavaDebugger *debugger) result = g_debug_stream_connect(debugger->stream); if (!result) goto gjda_error; + result = false; + /* Demande de version */ req = g_debug_stream_get_free_packet(debugger->stream); @@ -182,14 +191,15 @@ static bool g_java_debugger_attach(GJavaDebugger *debugger) JDWP_CST_VIRTUAL_MACHINE, JDWP_CMD_VM_VERSION); if (!g_debug_stream_send_packet(debugger->stream, req)) - goto gjda_error; + goto gjda_req_error; ret = g_debug_stream_recv_packet(debugger->stream, (filter_packet_fc)g_jdwp_packet_is_reply, req); - if (!ret) goto gjda_error; + if (!ret) goto gjda_req_error; - if (!g_jdwp_packet_parse_payload(G_JDWP_PACKET(ret), JDWP_CST_VIRTUAL_MACHINE, JDWP_CMD_VM_VERSION)) - goto gjda_error; + if (!g_jdwp_packet_parse_payload(G_JDWP_PACKET(ret), + JDWP_CST_VIRTUAL_MACHINE, JDWP_CMD_VM_VERSION)) + goto gjda_ret_error; payload = g_jdwp_packet_get_payload(G_JDWP_PACKET(ret)); @@ -198,15 +208,158 @@ static bool g_java_debugger_attach(GJavaDebugger *debugger) payload->vs_reply.jdwp_major, payload->vs_reply.jdwp_minor, payload->vs_reply.vm_version.value); - g_jdwp_packet_free_payload(G_JDWP_PACKET(ret), JDWP_CST_VIRTUAL_MACHINE, JDWP_CMD_VM_VERSION); + g_debug_stream_mark_packet_as_free(debugger->stream, req); + g_debug_stream_mark_packet_as_free(debugger->stream, ret); + + /* Récupération des tailles d'identifiants */ + + req = g_debug_stream_get_free_packet(debugger->stream); + + g_jdwp_packet_set_request_header(G_JDWP_PACKET(req), + JDWP_CST_VIRTUAL_MACHINE, JDWP_CMD_VM_ID_SIZES); + + if (!g_debug_stream_send_packet(debugger->stream, req)) + goto gjda_req_error; + + ret = g_debug_stream_recv_packet(debugger->stream, + (filter_packet_fc)g_jdwp_packet_is_reply, req); + if (!ret) goto gjda_req_error; + + if (!g_jdwp_packet_parse_payload(G_JDWP_PACKET(ret), + JDWP_CST_VIRTUAL_MACHINE, JDWP_CMD_VM_ID_SIZES)) + goto gjda_ret_error; + + payload = g_jdwp_packet_get_payload(G_JDWP_PACKET(ret)); + + g_jdwp_packet_set_sizes(G_JDWP_PACKET(ret), &payload->sz_reply); + + result = true; + + gjda_ret_error: + + g_debug_stream_mark_packet_as_free(debugger->stream, ret); + + gjda_req_error: + + g_debug_stream_mark_packet_as_free(debugger->stream, req); gjda_error: - if (req != NULL) - g_debug_stream_mark_packet_as_free(debugger->stream, req); + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : debugger = instance du module de débogage chargé. * +* names = désignations de tous les threads ou NULL. [OUT] * +* count = nombre de threads actifs. [OUT] * +* * +* Description : Fournit les identifiants de tous les threads actifs. * +* * +* Retour : Liste des threads décomptés. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static pid_t *g_java_debugger_list_all_threads(GJavaDebugger *debugger, char ***names, size_t *count) +{ + pid_t *result; /* Bilan à retourner */ + GDebugPacket *req; /* Requête à formuler */ + GDebugPacket *ret; /* Obtention de la réponse */ + jdwp_payload *payload; /* Charge utile d'une réponse */ + size_t i; /* Boucle de parcours */ + GDebugPacket *sub_req; /* Requête à formuler */ + jdwp_cmd_thread_name_request ident; /* Indentification d'un thread */ + GDebugPacket *sub_ret; /* Obtention de la réponse */ + jdwp_payload *sub_payload; /* Charge utile d'une réponse */ + + result = NULL; + *count = 0; + + req = g_debug_stream_get_free_packet(debugger->stream); + + g_jdwp_packet_set_request_header(G_JDWP_PACKET(req), + JDWP_CST_VIRTUAL_MACHINE, JDWP_CMD_VM_ALL_THREADS); + + if (!g_debug_stream_send_packet(debugger->stream, req)) + goto gjdlat_req_error; + + ret = g_debug_stream_recv_packet(debugger->stream, + (filter_packet_fc)g_jdwp_packet_is_reply, req); + if (!ret) goto gjdlat_req_error; + + if (!g_jdwp_packet_parse_payload(G_JDWP_PACKET(ret), + JDWP_CST_VIRTUAL_MACHINE, JDWP_CMD_VM_ALL_THREADS)) + goto gjdlat_ret_error; + + payload = g_jdwp_packet_get_payload(G_JDWP_PACKET(ret)); + + *count = payload->th_reply.count; + result = (pid_t *)calloc(*count, sizeof(pid_t)); + + if (names != NULL) + *names = (char **)calloc(*count, sizeof(char *)); + + for (i = 0; i < *count; i++) + { + result[i] = (pid_t)payload->th_reply.threads[i]; + + if (names != NULL) + { + sub_req = g_debug_stream_get_free_packet(debugger->stream); + + g_jdwp_packet_set_request_header(G_JDWP_PACKET(sub_req), + JDWP_CST_THREAD_REFERENCE, JDWP_CMD_THREAD_NAME); + + ident.id = result[i]; + g_jdwp_packet_set_payload(G_JDWP_PACKET(sub_req), (jdwp_payload *)&ident); + + if (!g_debug_stream_send_packet(debugger->stream, sub_req)) + { + g_debug_stream_mark_packet_as_free(debugger->stream, sub_req); + (*names)[i] = strdup("???"); + continue; + } + + sub_ret = g_debug_stream_recv_packet(debugger->stream, + (filter_packet_fc)g_jdwp_packet_is_reply, sub_req); + if (!sub_ret) + { + g_debug_stream_mark_packet_as_free(debugger->stream, sub_req); + (*names)[i] = strdup("???"); + continue; + } + + if (!g_jdwp_packet_parse_payload(G_JDWP_PACKET(sub_ret), + JDWP_CST_THREAD_REFERENCE, JDWP_CMD_THREAD_NAME)) + { + g_debug_stream_mark_packet_as_free(debugger->stream, sub_req); + g_debug_stream_mark_packet_as_free(debugger->stream, sub_ret); + (*names)[i] = strdup("???"); + continue; + } + + sub_payload = g_jdwp_packet_get_payload(G_JDWP_PACKET(sub_ret)); + + (*names)[i] = strdup(sub_payload->th_name.name.value); + + g_debug_stream_mark_packet_as_free(debugger->stream, sub_req); + g_debug_stream_mark_packet_as_free(debugger->stream, sub_ret); + + } + + } + + gjdlat_ret_error: + + g_debug_stream_mark_packet_as_free(debugger->stream, ret); + + gjdlat_req_error: - if (ret != NULL) - g_debug_stream_mark_packet_as_free(debugger->stream, ret); + g_debug_stream_mark_packet_as_free(debugger->stream, req); return result; |