diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2010-07-29 00:02:49 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2010-07-29 00:02:49 (GMT) |
commit | 73af1bd66e5d1a2e30d56151532710f2b28d12df (patch) | |
tree | 88f98194359accd8349193f4cbe3c4cabee24d23 /src/debug/remgdb/gdb.c | |
parent | f150f36ee0297b4499a41bbbfc06699cd2f72db5 (diff) |
Improved the GDB client.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@175 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/debug/remgdb/gdb.c')
-rw-r--r-- | src/debug/remgdb/gdb.c | 179 |
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" |