summaryrefslogtreecommitdiff
path: root/src/debug/jdwp/debugger.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2012-02-18 16:41:31 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2012-02-18 16:41:31 (GMT)
commitdeb012d919ea6c5e79702a39a03a85be2ffcf406 (patch)
treeae9cee108d05e0a6674d8617a08d0ea09165443c /src/debug/jdwp/debugger.c
parent73605bffb935fc51a52be1936426211e31dd898a (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.c79
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;
+
+}