summaryrefslogtreecommitdiff
path: root/src/debug/remgdb/gdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/debug/remgdb/gdb.c')
-rw-r--r--src/debug/remgdb/gdb.c179
1 files changed, 147 insertions, 32 deletions
diff --git a/src/debug/remgdb/gdb.c b/src/debug/remgdb/gdb.c
index 068cf26..ea8e48e 100644
--- a/src/debug/remgdb/gdb.c
+++ b/src/debug/remgdb/gdb.c
@@ -23,7 +23,46 @@
#include "gdb.h"
+
+#include "../debugger-int.h"
+
+
+
+#include "helpers.h"
+#include "tcp.h"
+
+
+
+
+/* Débogueur utilisant un serveur GDB (instance) */
+struct _GGdbDebugger
+{
+ GBinaryDebugger parent; /* A laisser en premier */
+
+ GGdbStream *stream; /* Flux de communication */
+
+
#if 0
+ GCond *cond; /* Poursuite du déroulement */
+ GMutex *mutex; /* Accès à la condition */
+
+ ptrace_options *options; /* Configuration du débogage */
+
+ pid_t child; /* Processus suivi lancé */
+
+ gboolean run_again; /* Reprise du débogage */
+#endif
+};
+
+/* Débogueur utilisant un serveur GDB (classe) */
+struct _GGdbDebuggerClass
+{
+ GBinaryDebuggerClass parent; /* A laisser en premier */
+
+};
+
+
+
/* Initialise la classe du débogueur utilisant gdb. */
@@ -33,6 +72,16 @@ static void g_gdb_debugger_class_init(GGdbDebuggerClass *);
static void g_gdb_debugger_init(GGdbDebugger *);
+/* Met en marche le débogueur utilisant un serveur GDB. */
+static bool g_gdb_debugger_run(GGdbDebugger *);
+
+/* Remet en marche le débogueur utilisant un serveur GDB. */
+static bool g_gdb_debugger_resume(GGdbDebugger *);
+
+/* Tue le débogueur utilisant un serveur GDB. */
+static bool g_gdb_debugger_kill(GGdbDebugger *);
+
+
/* Indique le type défini par la GLib pour le débogueur gdb. */
G_DEFINE_TYPE(GGdbDebugger, g_gdb_debugger, G_TYPE_BINARY_DEBUGGER);
@@ -79,19 +128,49 @@ static void g_gdb_debugger_init(GGdbDebugger *debugger)
parent->resume = (resume_debugger_fc)g_gdb_debugger_resume;
parent->kill = (basic_debugger_fc)g_gdb_debugger_kill;
- parent->get_reg_values = (get_register_values_fc)get_register_values_using_gdb_debugger;
+ //parent->get_reg_values = (get_register_values_fc)get_register_values_using_gdb_debugger;
- debugger->cond = g_cond_new();
- debugger->mutex = g_mutex_new();
+ //debugger->cond = g_cond_new();
+ //debugger->mutex = g_mutex_new();
}
/******************************************************************************
* *
+* Paramètres : binary = binaire représenter à déboguer. *
+* options = paramètres destinés au débogage. *
+* *
+* Description : Crée un débogueur utilisant un serveur GDB distant. *
+* *
+* Retour : Instance de débogueur mise en place ou NULL. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GBinaryDebugger *g_gdb_debugger_new(GOpenidaBinary *binary, void *options)
+{
+ GBinaryDebugger *result; /* Débogueur à retourner */
+
+ result = g_object_new(G_TYPE_GDB_DEBUGGER, NULL);
+
+ return result;
+
+}
+
+
+
+
+
+
+
+
+/******************************************************************************
+* *
* Paramètres : debugger = débogueur à lancer. *
* *
-* Description : Met en marche le débogueur utilisant gdb. *
+* Description : Met en marche le débogueur utilisant un serveur GDB. *
* *
* Retour : Bilan de l'opération. *
* *
@@ -99,30 +178,68 @@ static void g_gdb_debugger_init(GGdbDebugger *debugger)
* *
******************************************************************************/
-bool g_gdb_debugger_run(GGdbDebugger *debugger)
+static bool g_gdb_debugger_run(GGdbDebugger *debugger)
{
- GError *error; /* Bilan de création de thread */
- if (debugger->options == NULL)
- debugger->options = create_gdb_options_from_binary(G_BINARY_DEBUGGER(debugger)->binary);
- if (debugger->options == NULL)
- return false;
+ GGdbPacket *packet;
+ bool test;
+
+ const char *data;
+ size_t len;
+
+
+ int sig;
+ vmpa_t addr;
+ pid_t thread;
+
+
+ debugger->stream = g_gdb_tcp_client_new("127.0.0.1", "6666");
+ if (debugger->stream == NULL) return false;
+
+
+ printf("Connection done !\n");
+
+
+
+ packet = g_gdb_stream_get_free_packet(debugger->stream);
+
+ g_gdb_packet_start_new_command(packet);
+ g_gdb_packet_append(packet, "?");
+
+
+ test = g_gdb_stream_send_packet(debugger->stream, packet);
+
+
+
+ printf(" >> Paquet '%s' bien envoyé ? %s\n", "?", test ? "oui" : "non");
+
+
+
+ g_gdb_stream_mark_packet_as_free(debugger->stream, packet);
+
+ packet = g_gdb_stream_recv_packet(debugger->stream);
+
+ g_gdb_packet_get_data(packet, &data, &len, NULL);
+
+ printf(" << Réception de '%s'\n", data);
+
+
+
+
+
+ get_stop_reply_sig_info(packet, &sig, &addr, &thread, SRE_LITTLE);
+
+ g_signal_emit_by_name(debugger, "halted", sig, addr, thread);
+
+
- if (!g_thread_create((GThreadFunc)gdb_thread, debugger, FALSE, &error))
- {
- printf ("Failed to create the thread: %s\n", error->message);
- }
- /*
- printf("Start Debugger with bin :: %p\n", G_BINARY_DEBUGGER_GET_IFACE(debugger)->binary);
- g_signal_emit_by_name(debugger, "debugger-stopped", (uint64_t)0xdeadbeaf);
- */
return true;
}
@@ -132,7 +249,7 @@ bool g_gdb_debugger_run(GGdbDebugger *debugger)
* *
* Paramètres : debugger = débogueur à relancer. *
* *
-* Description : Remet en marche le débogueur utilisant gdb(). *
+* Description : Remet en marche le débogueur utilisant un serveur GDB. *
* *
* Retour : Bilan de l'opération. *
* *
@@ -140,13 +257,16 @@ bool g_gdb_debugger_run(GGdbDebugger *debugger)
* *
******************************************************************************/
-bool g_gdb_debugger_resume(GGdbDebugger *debugger)
+static bool g_gdb_debugger_resume(GGdbDebugger *debugger)
{
+
+
+ /*
g_mutex_lock(debugger->mutex);
debugger->run_again = TRUE;
g_cond_signal(debugger->cond);
g_mutex_unlock(debugger->mutex);
-
+ */
return true;
}
@@ -156,7 +276,7 @@ bool g_gdb_debugger_resume(GGdbDebugger *debugger)
* *
* Paramètres : debugger = débogueur à relancer. *
* *
-* Description : Tue le débogueur utilisant gdb(). *
+* Description : Tue le débogueur utilisant un serveur GDB. *
* *
* Retour : Bilan de l'opération. *
* *
@@ -164,8 +284,11 @@ bool g_gdb_debugger_resume(GGdbDebugger *debugger)
* *
******************************************************************************/
-bool g_gdb_debugger_kill(GGdbDebugger *debugger)
+static bool g_gdb_debugger_kill(GGdbDebugger *debugger)
{
+
+
+#if 0
int ret; /* Bilan de l'appel système */
ret = kill(debugger->child, SIGKILL);
@@ -177,19 +300,11 @@ bool g_gdb_debugger_kill(GGdbDebugger *debugger)
debugger->run_again = TRUE;
g_cond_signal(debugger->cond);
g_mutex_unlock(debugger->mutex);
-
+#endif
return true;
}
-#endif
-
-
-
-
-
-
-#include "tcp.h"