diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2012-02-18 16:41:31 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2012-02-18 16:41:31 (GMT) |
commit | deb012d919ea6c5e79702a39a03a85be2ffcf406 (patch) | |
tree | ae9cee108d05e0a6674d8617a08d0ea09165443c /src/debug/jdwp/debugger.c | |
parent | 73605bffb935fc51a52be1936426211e31dd898a (diff) |
Retrieved the frames stack from the running process.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@235 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/debug/jdwp/debugger.c')
-rw-r--r-- | src/debug/jdwp/debugger.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/debug/jdwp/debugger.c b/src/debug/jdwp/debugger.c index 51a0db8..b416840 100644 --- a/src/debug/jdwp/debugger.c +++ b/src/debug/jdwp/debugger.c @@ -24,7 +24,10 @@ #include "debugger.h" +#include <malloc.h> #include <string.h> + + #include <i18n.h> @@ -70,6 +73,9 @@ 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 *); +/* Fournit la liste des frames courantes d'un thread donné. */ +static dbg_frame_t *g_java_debugger_get_frames_stack(GJavaDebugger *, pid_t, size_t *); + /* Indique le type défini par la GLib pour le débogueur java. */ @@ -116,6 +122,7 @@ 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; + parent->frames_stack = (dbg_get_frames_stack_fc)g_java_debugger_get_frames_stack; #if 0 parent->run = (basic_debugger_fc)g_java_debugger_run; @@ -364,3 +371,75 @@ static pid_t *g_java_debugger_list_all_threads(GJavaDebugger *debugger, char *** return result; } + + +/****************************************************************************** +* * +* Paramètres : debugger = instance du module de débogage chargé. * +* thread = thread concerné par l'analyse. * +* count = nombre de frames en place. [OUT] * +* * +* Description : Fournit la liste des frames courantes d'un thread donné. * +* * +* Retour : Liste des frames trouvées. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static dbg_frame_t *g_java_debugger_get_frames_stack(GJavaDebugger *debugger, pid_t thread, size_t *count) +{ + dbg_frame_t *result; /* Bilan à retourner */ + GDebugPacket *req; /* Requête à formuler */ + jdwp_cmd_thread_frames_request frames; /* Ciblage du thread désiré */ + GDebugPacket *ret; /* Obtention de la réponse */ + jdwp_payload *payload; /* Charge utile d'une réponse */ + size_t i; /* Boucle de parcours */ + + 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_THREAD_REFERENCE, JDWP_CMD_THREAD_FRAMES); + + frames.id = thread; + frames.start = 0; + frames.length = ALL_FRAMES; + g_jdwp_packet_set_payload(G_JDWP_PACKET(req), (jdwp_payload *)&frames); + + if (!g_debug_stream_send_packet(debugger->stream, req)) + goto gjdgsf_req_error; + + ret = g_debug_stream_recv_packet(debugger->stream, + (filter_packet_fc)g_jdwp_packet_is_reply, req); + if (!ret) goto gjdgsf_req_error; + + if (!g_jdwp_packet_parse_payload(G_JDWP_PACKET(ret), + JDWP_CST_THREAD_REFERENCE, JDWP_CMD_THREAD_FRAMES)) + goto gjdgsf_ret_error; + + payload = g_jdwp_packet_get_payload(G_JDWP_PACKET(ret)); + + *count = payload->th_frames.count; + result = (dbg_frame_t *)calloc(*count, sizeof(dbg_frame_t)); + + for (i = 0; i < *count; i++) + { + /* TODO */ + result[i].addr = payload->th_frames.frames[i].location.index; + + } + + gjdgsf_ret_error: + + g_debug_stream_mark_packet_as_free(debugger->stream, ret); + + gjdgsf_req_error: + + g_debug_stream_mark_packet_as_free(debugger->stream, req); + + return result; + +} |