summaryrefslogtreecommitdiff
path: root/src/editor.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-04-12 19:15:35 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-04-12 19:15:35 (GMT)
commit216a3d0121fabd678e50ea6b4fa2447ae9b921f0 (patch)
tree395fcd91b674ff5652e34b46207ba08cc9e7af68 /src/editor.c
parentedac614a164d9cac345d914f4320d71bdb16ab79 (diff)
Created a debugging layout and introduced a heavier use of GLib.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@58 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/editor.c')
-rw-r--r--src/editor.c723
1 files changed, 294 insertions, 429 deletions
diff --git a/src/editor.c b/src/editor.c
index e8ff222..888f1af 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -39,25 +39,20 @@
#include <unistd.h>
/** exemple GTK **/
-/** Partie ptrace() **/
-#include <sys/ptrace.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <unistd.h>
-//#include <linux/user.h>
-#include <sys/syscall.h> /* For SYS_write etc */
-/** Partie ptrace() **/
#include "binary.h"
#include "dlg_sections.h"
#include "easygtk.h"
-#include "gtkbinview.h"
-#include "gtksnippet.h"
#include "pan_strings.h"
#include "pan_symbols.h"
+#include "gtkext/gtkbinview.h"
#include "gtkext/gtkdockpanel.h"
+#include "gtkext/gtksnippet.h"
+#include "format/exe_format.h"
#include "format/mangling/demangler.h"
+
+#include "debug/debuggers.h"
#include "panel/panels.h"
@@ -118,6 +113,22 @@ void mcb_select_sections(GtkMenuItem *, gpointer);
void reload_menu_project(GObject *);
+/*Réagit avec le menu "Débogage -> Démarrer". */
+void mcb_debug_start(GtkCheckMenuItem *, gpointer);
+
+/* Réagit avec le menu "Débogage -> Mettre en pause". */
+void mcb_debug_pause(GtkCheckMenuItem *, gpointer);
+
+/* Réagit avec le menu "Débogage -> Reprendre". */
+void mcb_debug_resume(GtkCheckMenuItem *, gpointer);
+
+/* Réagit avec le menu "Débogage -> Tuer". */
+void mcb_debug_kill(GtkCheckMenuItem *, gpointer);
+
+/* Met à jour l'accessibilité aux éléments du menu "Debogage". */
+void update_debug_menu_items(GObject *, gboolean);
+
+
/******************************************************************************
@@ -163,6 +174,7 @@ int main(int argc, char **argv)
/* Initialisation du programme */
init_all_demanglers();
+ init_all_exe_formats();
/* Création de l'interface */
editor = create_editor();
@@ -183,210 +195,10 @@ int main(int argc, char **argv)
-GCond* data_cond = NULL; /* Must be initialized somewhere */
-GMutex* data_mutex = NULL; /* Must be initialized somewhere */
-gboolean run_again = FALSE;
-
-
-
-
-void
-on_button1_clicked (GtkButton *button,
- gpointer user_data);
-
-
-
-
-GtkLabel *lbl_eax;
-GtkLabel *lbl_ebx;
-GtkLabel *lbl_ecx;
-GtkLabel *lbl_edx;
-
-
-
-
-typedef struct _th_info
-{
- pid_t child;
- GtkTextBuffer *buffer;
-
-
-
-} th_info;
-
-
-
-#include <asm/ptrace-abi.h>
-#include <sys/reg.h>
-
-#include <error.h>
-#include <errno.h>
-
-extern int errno;
-
-
-void *argument_thread(void *args)
-{
- th_info *info;
- long orig_eax, eax;
- long params;
- int status;
-
- char buffer[12];
-
- pid_t pid;
-
-
-
-
- pid = fork();
-
-
-
- if (pid > 0)
- {
- /*****/
-
- }
- else ptrace(PTRACE_TRACEME, 0, NULL, NULL);
-
- sleep(1);
-
-
- if(pid == -1)
- {
- /* ouch, fork() failed */
- perror("fork");
- exit(-1);
- }
- else if(pid == 0)
- {
- // ptrace(PTRACE_TRACEME, 0, NULL, NULL);
- execlp("ls", "ls", "-CF", "/", NULL);
-
- /* if exec() returns, there is something wrong */
- perror("execlp");
-
- /* exit child. note the use of _exit() instead of exit() */
- _exit(-1);
- }
- else
- {
- info = (th_info *)args;
- info->child = pid;
-
- /* parent */
- gtk_text_buffer_insert_at_cursor (info->buffer, "#PARENT# Fork() succeed !\n", -1);
-
-
- while(1)
- {
- pid = waitpid(info->child, &status, 0/*WNOHANG*/);
- //wait(&status);
-
- if(WIFEXITED(status))
- break;
-
- orig_eax = ptrace(PTRACE_PEEKUSER,
- info->child, 4 * ORIG_EAX, NULL);
- if (orig_eax == -1)
- {
- printf("errno :: %d vs %d\n", errno, ESRCH);
- perror("ptrace()");
- }
-
- /* get GTK thread lock */
- gdk_threads_enter();
-
- params = ptrace(PTRACE_PEEKUSER, info->child, 4 * EAX, NULL);
- snprintf(buffer, 11, "0x%08lx", params);
- gtk_label_set_text(lbl_eax, buffer);
-
- params = ptrace(PTRACE_PEEKUSER, info->child, 4 * EBX, NULL);
- snprintf(buffer, 11, "0x%08lx", params);
- gtk_label_set_text(lbl_ebx, buffer);
-
- params = ptrace(PTRACE_PEEKUSER, info->child, 4 * ECX, NULL);
- snprintf(buffer, 11, "0x%08lx", params);
- gtk_label_set_text(lbl_ecx, buffer);
-
- params = ptrace(PTRACE_PEEKUSER, info->child, 4 * EDX, NULL);
- snprintf(buffer, 11, "0x%08lx", params);
- gtk_label_set_text(lbl_edx, buffer);
-
- gtk_text_buffer_insert_at_cursor (info->buffer, "Thread waiting for resume...\n", -1);
-
- gdk_flush ();
-
- /* release GTK thread lock */
- gdk_threads_leave();
-
- g_mutex_lock (data_mutex);
- while (!run_again)
- g_cond_wait (data_cond, data_mutex);
- run_again = FALSE;
- g_mutex_unlock (data_mutex);
-
- ptrace(PTRACE_SYSCALL,
- info->child, NULL, NULL);
- }
-
-
-
- }
-
-
-
- return NULL;
-
-}
-
-
-
-
-void
-on_button1_clicked (GtkButton *button,
- gpointer data)
-{
- GtkTextBuffer *buffer;
- th_info *info;
- GError *error = NULL;
-
- gtk_widget_set_state(GTK_WIDGET(button), GTK_STATE_INSENSITIVE);
-
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (data));
- gtk_text_buffer_insert_at_cursor (buffer, "Hello, this is some text\n", -1);
-
-
- info = (th_info *)calloc(1, sizeof(th_info));
- info->child = 0/*pid*/;
- info->buffer = buffer;
-
- data_cond = g_cond_new ();
- data_mutex = g_mutex_new ();
-
- if (!g_thread_create(argument_thread, info, FALSE, &error))
- {
- printf ("Failed to create YES thread: %s\n", error->message);
- }
-
-}
-
-void
-on_button2_clicked (GtkButton *button,
- gpointer data)
-{
-
- g_mutex_lock (data_mutex);
- run_again = TRUE;
- g_cond_signal (data_cond);
- g_mutex_unlock (data_mutex);
-
-}
@@ -409,6 +221,7 @@ GtkWidget *mywid;
GtkWidget *create_editor(void)
{
GtkWidget *result; /* Fenêtre à renvoyer */
+ GObject *ref; /* version de référence */
GtkWidget *menuboard; /* Barre de menus principale */
GtkWidget *menuitem; /* Elément de menu */
GtkWidget *menubar; /* Support pour éléments */
@@ -422,32 +235,6 @@ GtkWidget *create_editor(void)
GtkWidget *hpaned1;
GtkWidget *scrolledwindow2;
GtkWidget *snippet;
- GtkWidget *fixed1;
- GtkWidget *label1;
- GtkWidget *button2;
- GtkWidget *image1;
- GtkWidget *button1;
- GtkWidget *table1;
- GtkWidget *label3;
- GtkWidget *label4;
- GtkWidget *label5;
- GtkWidget *label6;
- GtkWidget *label7;
- GtkWidget *label8;
- GtkWidget *label9;
- GtkWidget *label10;
- GtkWidget *label11;
- GtkWidget *label12;
- GtkWidget *label14;
- GtkWidget *label15;
- GtkWidget *label16;
- GtkWidget *label17;
- GtkWidget *label18;
- GtkWidget *label19;
- GtkWidget *label20;
- GtkWidget *label21;
- GtkWidget *scrolledwindow1;
- GtkWidget *textview1;
GtkWidget *statusbar1;
GtkWidget *binview;
@@ -463,10 +250,6 @@ GtkWidget *create_editor(void)
GtkWidget *dpanel; /* Support de panneaux */
GtkDockItem *ditem; /* Panneau avec ses infos. */
- GtkWidget *notebook; /* Support à onglets */
- GtkWidget *label; /* Etiquette pour onglet */
-
-
#if 0
GtkWidget *vbox; /* Support à divisions vert. */
@@ -479,6 +262,9 @@ GtkWidget *create_editor(void)
#endif
+ openida_binary *binary;
+
+
result = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request(result, 800, 600);
gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER);
@@ -487,7 +273,7 @@ GtkWidget *create_editor(void)
g_signal_connect(G_OBJECT(result), "destroy", G_CALLBACK(destroy_editor), NULL);
-
+ ref = G_OBJECT(result);
mywid = result;
@@ -576,6 +362,50 @@ GtkWidget *create_editor(void)
+ menuitem = gtk_menu_item_new_with_mnemonic(_("_Debug"));
+ gtk_widget_show(menuitem);
+ gtk_container_add(GTK_CONTAINER(menuboard), menuitem);
+
+ menubar = gtk_menu_new();
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menubar);
+
+ submenuitem = qck_create_menu_item(ref, "mnu_debug_start", _("Start process"), G_CALLBACK(mcb_debug_start), result);
+ gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+
+ submenuitem = qck_create_menu_item(ref, "mnu_debug_pause", _("Pause process"), G_CALLBACK(mcb_debug_pause), result);
+ gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+
+ submenuitem = qck_create_menu_item(ref, "mnu_debug_resume", _("Resume process"), G_CALLBACK(mcb_debug_resume), result);
+ gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+
+ submenuitem = qck_create_menu_item(ref, "mnu_debug_kill", _("Kill process"), G_CALLBACK(mcb_debug_kill), result);
+ gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+
+ submenuitem = qck_create_menu_separator();
+ gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+
+ submenuitem = qck_create_menu_item(ref, "mnu_debug_into", _("Step into"), NULL/*G_CALLBACK()*/, result);
+ gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+
+ submenuitem = qck_create_menu_item(ref, "mnu_debug_over", _("Step over"), NULL/*G_CALLBACK()*/, result);
+ gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+
+ submenuitem = qck_create_menu_item(ref, "mnu_debug_ret", _("Run until ret"), NULL/*G_CALLBACK()*/, result);
+ gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+
+ submenuitem = qck_create_menu_separator();
+ gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+
+ update_debug_menu_items(ref, FALSE);
+
+
+
+
+
+
+
+
+
load_recent_openida_projects_list(G_OBJECT(result), G_CALLBACK(mcb_open_recent_project));
@@ -664,182 +494,11 @@ GtkWidget *create_editor(void)
ditem = gtk_dock_item_new(_("Symbols"), panel);
gtk_dock_panel_add_item(dpanel, ditem);
-
-
-
-
- fixed1 = gtk_fixed_new ();
- gtk_widget_show (fixed1);
-
- ditem = gtk_dock_item_new(_("Dbg"), fixed1);
+ ditem = gtk_dock_item_new(_("Registers"), get_panel(PNT_REGISTERS));
gtk_dock_panel_add_item(dpanel, ditem);
- label1 = gtk_label_new (_("Registres :"));
- gtk_widget_show (label1);
- gtk_fixed_put (GTK_FIXED (fixed1), label1, 16, 48);
- gtk_widget_set_size_request (label1, 128, 16);
- gtk_misc_set_alignment (GTK_MISC (label1), 0, 0.5);
-
- button2 = gtk_button_new ();
- gtk_widget_show (button2);
- gtk_fixed_put (GTK_FIXED (fixed1), button2, 80, 8);
- gtk_widget_set_size_request (button2, 62, 29);
-
- image1 = gtk_image_new_from_stock ("gtk-media-play", GTK_ICON_SIZE_BUTTON);
- gtk_widget_show (image1);
- gtk_container_add (GTK_CONTAINER (button2), image1);
-
- button1 = gtk_button_new_with_mnemonic (_("Run"));
- gtk_widget_show (button1);
- gtk_fixed_put (GTK_FIXED (fixed1), button1, 8, 8);
- gtk_widget_set_size_request (button1, 62, 29);
-
- table1 = gtk_table_new (9, 2, FALSE);
- gtk_widget_show (table1);
- gtk_fixed_put (GTK_FIXED (fixed1), table1, 8, 64);
- gtk_widget_set_size_request (table1, 160, 176);
- gtk_container_set_border_width (GTK_CONTAINER (table1), 8);
-
- label3 = gtk_label_new (_("eax :"));
- gtk_widget_show (label3);
- gtk_table_attach (GTK_TABLE (table1), label3, 0, 1, 0, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5);
-
- label4 = gtk_label_new (_("ebx :"));
- gtk_widget_show (label4);
- gtk_table_attach (GTK_TABLE (table1), label4, 0, 1, 1, 2,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5);
-
- label5 = gtk_label_new (_("ecx :"));
- gtk_widget_show (label5);
- gtk_table_attach (GTK_TABLE (table1), label5, 0, 1, 2, 3,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label5), 0, 0.5);
-
- label6 = gtk_label_new (_("edx :"));
- gtk_widget_show (label6);
- gtk_table_attach (GTK_TABLE (table1), label6, 0, 1, 3, 4,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5);
-
- label7 = gtk_label_new (_("esp :"));
- gtk_widget_show (label7);
- gtk_table_attach (GTK_TABLE (table1), label7, 0, 1, 4, 5,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label7), 0, 0.5);
-
- label8 = gtk_label_new (_("ebp :"));
- gtk_widget_show (label8);
- gtk_table_attach (GTK_TABLE (table1), label8, 0, 1, 5, 6,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label8), 0, 0.5);
-
- label9 = gtk_label_new (_("esi :"));
- gtk_widget_show (label9);
- gtk_table_attach (GTK_TABLE (table1), label9, 0, 1, 6, 7,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label9), 0, 0.5);
-
- label10 = gtk_label_new (_("edi :"));
- gtk_widget_show (label10);
- gtk_table_attach (GTK_TABLE (table1), label10, 0, 1, 7, 8,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label10), 0, 0.5);
-
- label11 = gtk_label_new (_("eip :"));
- gtk_widget_show (label11);
- gtk_table_attach (GTK_TABLE (table1), label11, 0, 1, 8, 9,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label11), 0, 0.5);
-
- label12 = gtk_label_new (_("0x00000000"));
- gtk_widget_show (label12);
- gtk_table_attach (GTK_TABLE (table1), label12, 1, 2, 0, 1,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label12), 0, 0.5);
-
- lbl_eax = label12;
- gtk_widget_modify_font(lbl_eax, pango_font_description_from_string ("Monospace"));
-
- label14 = gtk_label_new (_("0x00000000"));
- gtk_widget_show (label14);
- gtk_table_attach (GTK_TABLE (table1), label14, 1, 2, 2, 3,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label14), 0, 0.5);
-
- lbl_ebx = label14;
- gtk_widget_modify_font(lbl_ebx, pango_font_description_from_string ("Monospace 10"));
-
- label15 = gtk_label_new (_("0x00000000"));
- gtk_widget_show (label15);
- gtk_table_attach (GTK_TABLE (table1), label15, 1, 2, 3, 4,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label15), 0, 0.5);
-
- lbl_ecx = label15;
- gtk_widget_modify_font(lbl_ecx, pango_font_description_from_string ("Monospace 10"));
-
- label16 = gtk_label_new (_("0x00000000"));
- gtk_widget_show (label16);
- gtk_table_attach (GTK_TABLE (table1), label16, 1, 2, 4, 5,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label16), 0, 0.5);
-
- lbl_edx = label16;
- gtk_widget_modify_font(lbl_edx, pango_font_description_from_string ("Monospace 10"));
-
- label17 = gtk_label_new (_("0x00000000"));
- gtk_widget_show (label17);
- gtk_table_attach (GTK_TABLE (table1), label17, 1, 2, 5, 6,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label17), 0, 0.5);
-
- label18 = gtk_label_new (_("0x00000000"));
- gtk_widget_show (label18);
- gtk_table_attach (GTK_TABLE (table1), label18, 1, 2, 6, 7,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label18), 0, 0.5);
-
- label19 = gtk_label_new (_("0x00000000"));
- gtk_widget_show (label19);
- gtk_table_attach (GTK_TABLE (table1), label19, 1, 2, 7, 8,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label19), 0, 0.5);
-
- label20 = gtk_label_new (_("0x00000000"));
- gtk_widget_show (label20);
- gtk_table_attach (GTK_TABLE (table1), label20, 1, 2, 8, 9,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label20), 0, 0.5);
-
- label21 = gtk_label_new (_("0x00000000"));
- gtk_widget_show (label21);
- gtk_table_attach (GTK_TABLE (table1), label21, 1, 2, 1, 2,
- (GtkAttachOptions) (GTK_FILL),
- (GtkAttachOptions) (0), 0, 0);
- gtk_misc_set_alignment (GTK_MISC (label21), 0, 0.5);
-
@@ -904,26 +563,13 @@ GtkWidget *create_editor(void)
- /*
- g_signal_connect ((gpointer) button1, "clicked",
- G_CALLBACK (on_button1_clicked),
- textview1);
- */
-
-
-
-
- g_signal_connect ((gpointer) button2, "clicked",
- G_CALLBACK (on_button2_clicked),
- NULL);
-
-
-
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
- fill_snippet(snippet, _panel, panel);
+ binary = load_binary_file("/tmp/hello");
+ gtk_snippet_set_rendering_lines(snippet, get_openida_binary_lines(binary));
+ g_object_set_data(G_OBJECT(result), "current_binary", binary);
return result;
@@ -1320,3 +966,222 @@ void reload_menu_project(GObject *ref)
gtk_widget_set_sensitive(menuitem, count > 0);
}
+
+
+
+void debugger_stopped_cb(GBinaryDebugger *debugger, uint64_t last, uint64_t cur, gpointer data)
+{
+
+ GObject *ref;
+
+ openida_binary *binary;
+ GRenderingLine *line;
+
+
+ GtkWidget *submenuitem; /* Menu à rendre accessible */
+
+ register_value *values;
+ size_t count;
+
+
+ ref = G_OBJECT(data);
+
+
+ binary = g_object_get_data(ref, "current_binary");
+
+
+ if (last != cur)
+ {
+ line = g_rendering_line_find_by_offset(get_openida_binary_lines(binary), last);
+
+ if (line != NULL)
+ g_rendering_line_remove_flag(line, RLF_RUNNING_BP);
+
+ }
+
+
+ printf("bp at 0x%016llx\n", cur);
+
+ line = g_rendering_line_find_by_offset(get_openida_binary_lines(binary), cur);
+
+ if (line != NULL)
+ g_rendering_line_add_flag(line, RLF_RUNNING_BP);
+ else
+ printf("no line at address !\n");
+
+
+ values = g_binary_debugger_get_registers(debugger, &count);
+
+
+
+
+
+ /* Mises à jour */
+
+ update_debug_menu_items(ref, TRUE);
+
+
+
+
+
+
+
+ refresh_registers_panel_with_registers(get_panel(PNT_REGISTERS), values, count);
+
+
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : menuitem = élément de menu ayant basculé. *
+* data = adresse de l'espace de référencement global. *
+* *
+* Description : Réagit avec le menu "Débogage -> Démarrer". *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void mcb_debug_start(GtkCheckMenuItem *menuitem, gpointer data)
+{
+ openida_binary *binary; /* Binaire à analyser */
+ GBinaryDebugger *debugger; /* Débogueur offrant l'analyse */
+
+
+ binary = g_object_get_data(G_OBJECT(data), "current_binary");
+
+
+
+ debugger = g_new_binary_debugger(DGT_PTRACE, binary);
+ g_object_set_data(G_OBJECT(data), "current_debugger", debugger);
+
+
+ g_signal_connect(debugger, "debugger-stopped", G_CALLBACK(debugger_stopped_cb), data);
+
+ g_binary_debugger_run(debugger);
+
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : menuitem = élément de menu ayant basculé. *
+* data = adresse de l'espace de référencement global. *
+* *
+* Description : Réagit avec le menu "Débogage -> Mettre en pause". *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void mcb_debug_pause(GtkCheckMenuItem *menuitem, gpointer data)
+{
+ GBinaryDebugger *debugger; /* Débogueur offrant l'analyse */
+
+
+ debugger = g_object_get_data(G_OBJECT(data), "current_debugger");
+
+
+
+ //g_binary_debugger_resume(debugger);
+
+
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : menuitem = élément de menu ayant basculé. *
+* data = adresse de l'espace de référencement global. *
+* *
+* Description : Réagit avec le menu "Débogage -> Reprendre". *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void mcb_debug_resume(GtkCheckMenuItem *menuitem, gpointer data)
+{
+ GBinaryDebugger *debugger; /* Débogueur offrant l'analyse */
+
+
+ debugger = g_object_get_data(G_OBJECT(data), "current_debugger");
+
+
+
+ g_binary_debugger_resume(debugger);
+
+
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : menuitem = élément de menu ayant basculé. *
+* data = adresse de l'espace de référencement global. *
+* *
+* Description : Réagit avec le menu "Débogage -> Tuer". *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void mcb_debug_kill(GtkCheckMenuItem *menuitem, gpointer data)
+{
+ GBinaryDebugger *debugger; /* Débogueur offrant l'analyse */
+
+ debugger = g_object_get_data(G_OBJECT(data), "current_debugger");
+
+ g_binary_debugger_kill(debugger);
+
+ /* TODO : retirer l'association binary <-> debugger */
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ref = adresse de l'espace de référencement global. *
+* stopped = indique l'état d'accessibilité des menus. *
+* *
+* Description : Met à jour l'accessibilité aux éléments du menu "Debogage". *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void update_debug_menu_items(GObject *ref, gboolean stopped)
+{
+ GtkWidget *submenuitem; /* Menu à rendre accessible */
+
+ submenuitem = GTK_WIDGET(g_object_get_data(ref, "mnu_debug_pause"));
+ gtk_widget_set_sensitive(submenuitem, stopped);
+
+ submenuitem = GTK_WIDGET(g_object_get_data(ref, "mnu_debug_resume"));
+ gtk_widget_set_sensitive(submenuitem, stopped);
+
+ submenuitem = GTK_WIDGET(g_object_get_data(ref, "mnu_debug_into"));
+ gtk_widget_set_sensitive(submenuitem, stopped);
+
+ submenuitem = GTK_WIDGET(g_object_get_data(ref, "mnu_debug_over"));
+ gtk_widget_set_sensitive(submenuitem, stopped);
+
+ submenuitem = GTK_WIDGET(g_object_get_data(ref, "mnu_debug_ret"));
+ gtk_widget_set_sensitive(submenuitem, stopped);
+
+}