diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-04-12 19:15:35 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-04-12 19:15:35 (GMT) |
commit | 216a3d0121fabd678e50ea6b4fa2447ae9b921f0 (patch) | |
tree | 395fcd91b674ff5652e34b46207ba08cc9e7af68 /src/editor.c | |
parent | edac614a164d9cac345d914f4320d71bdb16ab79 (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.c | 723 |
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); + +} |