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/panels | |
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/panels')
-rwxr-xr-x | src/panels/Makefile.am | 1 | ||||
-rw-r--r-- | src/panels/breaks.c | 454 | ||||
-rw-r--r-- | src/panels/breaks.h | 59 | ||||
-rw-r--r-- | src/panels/panel-int.h | 4 | ||||
-rw-r--r-- | src/panels/panel.c | 27 | ||||
-rw-r--r-- | src/panels/panel.h | 3 | ||||
-rw-r--r-- | src/panels/registers.h | 2 | ||||
-rw-r--r-- | src/panels/symbols.c | 1 |
8 files changed, 549 insertions, 2 deletions
diff --git a/src/panels/Makefile.am b/src/panels/Makefile.am index 2ab4bad..0db863a 100755 --- a/src/panels/Makefile.am +++ b/src/panels/Makefile.am @@ -2,6 +2,7 @@ noinst_LTLIBRARIES = libpanels.la libpanels_la_SOURCES = \ + breaks.h breaks.c \ glimpse.h glimpse.c \ log.h log.c \ panel-int.h \ diff --git a/src/panels/breaks.c b/src/panels/breaks.c new file mode 100644 index 0000000..5455aed --- /dev/null +++ b/src/panels/breaks.c @@ -0,0 +1,454 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * breaks.c - panneau d'affichage des points d'arrêt + * + * Copyright (C) 2010 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "breaks.h" + + +#include "panel-int.h" +#include "../gtkext/easygtk.h" +#include "../gtkext/support.h" + + + +#define _(str) str + + +/* Panneau d'affichage des points d'arrêt (instance) */ +struct _GBreaksPanel +{ + GEditorPanel parent; /* A laisser en premier */ + + GtkTreeView *treeview; /* Composant d'affichage */ + GtkTreeStore *store; /* Modèle de gestion */ + + GOpenidaBinary *binary; /* Binaire en cours d'étude */ + +}; + + +/* Panneau d'affichage des points d'arrêt (classe) */ +struct _GBreaksPanelClass +{ + GEditorPanelClass parent; /* A laisser en premier */ + +}; + + +/* Colonnes de la liste des symboles */ +typedef enum _BreaksColumn +{ + BKC_POINT, /* Point d'arrêt de référence */ + BKC_ICON, /* Statut du point d'arrêt */ + BKC_ADDRESS, /* Adresse mémoire du symbole */ + BKC_STRING, /* Désignation humaine */ + + BKC_COUNT /* Nombre de colonnes */ + +} BreaksColumn; + + +/* Initialise la classe des panneaux de points d'arrêt. */ +static void g_breaks_panel_class_init(GBreaksPanelClass *); + +/* Initialise une instance de panneau de points d'arrêt. */ +static void g_breaks_panel_init(GBreaksPanel *); + +/* Réagit à un changement du binaire courant. */ +static void reload_breaks_for_new_binary(GBreaksPanel *, GOpenidaBinary *); + + + + +/* Intègre à l'affichage un groupe de points d'arrêt. */ +static void add_bp_group_to_breaks_panel(GOpenidaBinary *, GBreakGroup *, GBreaksPanel *); + +/* Réagit à une nouvelle création de point d'arrêt. */ +static void refresh_breaks_panel_on_bp_added(GBreakGroup *, GBreakPoint *, GBreaksPanel *); + +/* Réagit à une suppression de point d'arrêt. */ +static void refresh_breaks_panel_on_bp_removed(GBreakGroup *, GBreakPoint *, GBreaksPanel *); + +/* Réagit à une modification de point d'arrêt. */ +static void refresh_breaks_panel_on_bp_changed(GBreakGroup *, GBreakPoint *, GBreaksPanel *); + + + + +/* Retrouve un point d'arrêt dans la liste affichée. */ +static bool find_breakpoint_in_breaks_panel(GBreaksPanel *, GBreakPoint *, GtkTreeIter *); + + + +/* Indique le type définit pour un panneau d'affichage des points d'arrêt. */ +G_DEFINE_TYPE(GBreaksPanel, g_breaks_panel, G_TYPE_EDITOR_PANEL); + + +/****************************************************************************** +* * +* Paramètres : klass = classe à initialiser. * +* * +* Description : Initialise la classe des panneaux de points d'arrêt. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_breaks_panel_class_init(GBreaksPanelClass *klass) +{ + +} + + +/****************************************************************************** +* * +* Paramètres : panel = instance à initialiser. * +* * +* Description : Initialise une instance de panneau de points d'arrêt. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_breaks_panel_init(GBreaksPanel *panel) +{ + GEditorPanel *base; /* Version basique d'instance */ + GObject *ref; /* Espace de référencement */ + GtkTooltips *tooltips; /* Affichage des bulles d'aide */ + GtkWidget *toolbar; /* Barre d'outils */ + GtkWidget *button; /* Bouton de cette même barre */ + GtkWidget *separator; /* Barre de séparation vert. */ + GtkWidget *scrollwnd; /* Support défilant */ + GtkWidget *treeview; /* Affichage de la liste */ + GtkCellRenderer *renderer; /* Moteur de rendu de colonne */ + GtkTreeViewColumn *column; /* Colonne de la liste */ + GtkTreeSelection *select; /* Sélection dans la liste */ + + + + + base = G_EDITOR_PANEL(panel); + + base->name = _("Breakpoints"); + base->reload_binary = (reload_for_new_binary_fc)reload_breaks_for_new_binary; + + base->widget = gtk_vbox_new(FALSE, 0); + gtk_widget_show(base->widget); + + ref = G_OBJECT(base->widget); + g_object_set_data(ref, "panel", panel); + + scrollwnd = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(scrollwnd); + gtk_box_pack_start(GTK_BOX(base->widget), scrollwnd, TRUE, TRUE, 0); + + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwnd), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwnd), GTK_SHADOW_IN); + + panel->store = gtk_tree_store_new(BKC_COUNT, G_TYPE_OBJECT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING); + + treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(panel->store)); + gtk_widget_show(treeview); + gtk_container_add(GTK_CONTAINER(scrollwnd), treeview); + + panel->treeview = GTK_TREE_VIEW(treeview); + + g_object_unref(G_OBJECT(panel->store)); + + column = gtk_tree_view_column_new(); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + gtk_tree_view_set_expander_column(GTK_TREE_VIEW(treeview), column); + + + + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _("Address")); + + renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", BKC_ICON); + + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, TRUE); + gtk_tree_view_column_add_attribute(column, renderer, "text", BKC_ADDRESS); + + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + + + + //renderer = gtk_cell_renderer_text_new(); + //column = gtk_tree_view_column_new_with_attributes(_("Address"), renderer, "text", BKC_ADDRESS, NULL); + //gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("String"), renderer, "text", BKC_STRING, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + + + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Crée un panneau d'aperçu de graphiques. * +* * +* Retour : Adresse de la structure mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GEditorPanel *g_breaks_panel_new(void) +{ + GEditorPanel *result; /* Structure à retourner */ + + result = g_object_new(G_TYPE_BREAKS_PANEL, NULL); + + return G_EDITOR_PANEL(result); + +} + + +/****************************************************************************** +* * +* Paramètres : panel = panneau à mettre à jour. * +* binary = nouvelle instance de binaire analysé. * +* * +* Description : Réagit à un changement du binaire courant. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void reload_breaks_for_new_binary(GBreaksPanel *panel, GOpenidaBinary *binary) +{ + + printf("CHNAGE BINARY !\n"); + + panel->binary = binary; + + g_openida_binary_for_each_bp_group(binary, (GExtFunc)add_bp_group_to_breaks_panel, panel); + + +} + + + + + + + + + + + + + + +/****************************************************************************** +* * +* Paramètres : binary = instance active du binaire analysé. * +* group = groupe de points d'arrêt présent dans le binaire. * +* panel = panneau à mettre à jour. * +* * +* Description : Intègre à l'affichage un groupe de points d'arrêt. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void add_bp_group_to_breaks_panel(GOpenidaBinary *binary, GBreakGroup *group, GBreaksPanel *panel) +{ + /* FIXME : bloquer toute émission de signal tant que les ajouts ne sont pas terminés. */ + + g_signal_connect(group, "added", + G_CALLBACK(refresh_breaks_panel_on_bp_added), panel); + + g_signal_connect(group, "removed", + G_CALLBACK(refresh_breaks_panel_on_bp_removed), panel); + + g_break_group_for_each(group, (GExtFunc)refresh_breaks_panel_on_bp_added, panel); + +} + + +/****************************************************************************** +* * +* Paramètres : group = ensemble de points d'arrêt intervenant. * +* point = point d'arrêt à l'origine de la procédure. * +* panel = panneau à mettre à jour. * +* * +* Description : Réagit à une nouvelle création de point d'arrêt. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void refresh_breaks_panel_on_bp_added(GBreakGroup *group, GBreakPoint *point, GBreaksPanel *panel) +{ + GExeFormat *format; /* Format associé au binaire */ + GArchProcessor *proc; /* Architecture utilisée */ + char address[VMPA_MAX_SIZE]; /* Conversion de l'adresse */ + GtkTreeIter iter; /* Point d'insertion */ + + format = g_openida_binary_get_format(panel->binary); + proc = get_arch_processor_from_format(format); + + vmpa_to_string(g_break_point_get_address(point), + g_arch_processor_get_memory_size(proc), + address); + + gtk_tree_store_append(panel->store, &iter, NULL); + gtk_tree_store_set(panel->store, &iter, + BKC_POINT, point, + BKC_ADDRESS, address, + BKC_STRING, "???", + -1); + + /* Pour le reste... */ + refresh_breaks_panel_on_bp_changed(group, point, panel); + +} + + +/****************************************************************************** +* * +* Paramètres : group = ensemble de points d'arrêt intervenant. * +* point = point d'arrêt à l'origine de la procédure. * +* panel = panneau à mettre à jour. * +* * +* Description : Réagit à une suppression de point d'arrêt. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void refresh_breaks_panel_on_bp_removed(GBreakGroup *group, GBreakPoint *point, GBreaksPanel *panel) +{ + GtkTreeIter iter; /* Point de modification */ + + if (!find_breakpoint_in_breaks_panel(panel, point, &iter)) + return; + + gtk_tree_store_remove(panel->store, &iter); + +} + + +/****************************************************************************** +* * +* Paramètres : group = ensemble de points d'arrêt intervenant. * +* point = point d'arrêt à l'origine de la procédure. * +* panel = panneau à mettre à jour. * +* * +* Description : Réagit à une modification de point d'arrêt. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void refresh_breaks_panel_on_bp_changed(GBreakGroup *group, GBreakPoint *point, GBreaksPanel *panel) +{ + GtkTreeIter iter; /* Point de modification */ + GdkPixbuf *pixbuf; /* Tampon d'image chargé */ + + if (!find_breakpoint_in_breaks_panel(panel, point, &iter)) + return; + + pixbuf = get_pixbuf_from_file("breakpoint_normal.png"); + if (pixbuf == NULL) return; + + gtk_tree_store_set(panel->store, &iter, + BKC_ICON, pixbuf, + -1); + +} + + + + + + + + + + +/****************************************************************************** +* * +* Paramètres : panel = panneau d'affichage à consulter. * +* point = point d'arrêt lié à la procédure. * +* * +* Description : Retrouve un point d'arrêt dans la liste affichée. * +* * +* Retour : Bilan de la recherche. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool find_breakpoint_in_breaks_panel(GBreaksPanel *panel, GBreakPoint *point, GtkTreeIter *iter) +{ + bool result; /* Bilan à retourner */ + GtkTreeIter tmp; /* Sauvegarde temporaire */ + bool test; /* Valide la poursuite */ + GBreakPoint *bp; /* Adresse à comparer */ + + result = false; + + for (test = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(panel->store), &tmp); + test && !result; + test = gtk_tree_model_iter_next(GTK_TREE_MODEL(panel->store), &tmp)) + { + gtk_tree_model_get(GTK_TREE_MODEL(panel->store), + &tmp, BKC_POINT, &bp, -1); + + if (bp == point) + { + *iter = tmp; + result = true; + } + + } + + return result; + +} diff --git a/src/panels/breaks.h b/src/panels/breaks.h new file mode 100644 index 0000000..7a32e31 --- /dev/null +++ b/src/panels/breaks.h @@ -0,0 +1,59 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * breaks.h - prototypes pour le panneau d'affichage des points d'arrêt + * + * Copyright (C) 2010 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#ifndef _PANELS_BREAKS_H +#define _PANELS_BREAKS_H + + +#include <glib-object.h> + + +#include "panel.h" + + + +#define G_TYPE_BREAKS_PANEL g_breaks_panel_get_type() +#define G_BREAKS_PANEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_breaks_panel_get_type(), GBreaksPanel)) +#define G_IS_BREAKS_PANEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_breaks_panel_get_type())) +#define G_BREAKS_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BREAKS_PANEL, GBreaksPanelClass)) +#define G_IS_BREAKS_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BREAKS_PANEL)) +#define G_BREAKS_PANEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BREAKS_PANEL, GBreaksPanelClass)) + + +/* Panneau d'affichage des points d'arrêt (instance) */ +typedef struct _GBreaksPanel GBreaksPanel; + +/* Panneau d'affichage des points d'arrêt (classe) */ +typedef struct _GBreaksPanelClass GBreaksPanelClass; + + +/* Indique le type définit pour un panneau d'affichage des points d'arrêt. */ +GType g_breaks_panel_get_type(void); + +/* Crée un panneau d'affichage des points d'arrêt. */ +GEditorPanel *g_breaks_panel_new(void); + + + +#endif /* _PANELS_BREAKS_H */ diff --git a/src/panels/panel-int.h b/src/panels/panel-int.h index 417665f..0048d19 100644 --- a/src/panels/panel-int.h +++ b/src/panels/panel-int.h @@ -34,6 +34,9 @@ +/* Réagit à un changement du binaire courant. */ +typedef void (* reload_for_new_binary_fc) (GEditorPanel *, GOpenidaBinary *); + /* Réagit à un changement d'affichage principal de contenu. */ typedef void (* reload_for_new_view_fc) (GEditorPanel *, GtkBinView *, bool); @@ -47,6 +50,7 @@ struct _GEditorPanel const char *name; /* Nom du panneau */ + reload_for_new_binary_fc reload_binary; /* Changement de binaire */ reload_for_new_view_fc reload_view; /* Rechargement dû à une vue */ GtkWidget *widget; /* Composant GTK d'affichage */ diff --git a/src/panels/panel.c b/src/panels/panel.c index 9cf3f98..c9acac9 100644 --- a/src/panels/panel.c +++ b/src/panels/panel.c @@ -25,6 +25,7 @@ #include "panel.h" +#include "breaks.h" #include "glimpse.h" #include "panel-int.h" #include "symbols.h" @@ -143,6 +144,9 @@ void init_internal_panels(void) { GEditorPanel *panel; /* Nouveau panneau chargé */ + panel = g_breaks_panel_new(); + panels_list_add_tail(panel, &panels_list); + panel = g_symbols_panel_new(); panels_list_add_tail(panel, &panels_list); @@ -180,6 +184,29 @@ void place_all_panels_in_editor(GtkWidget *top) /****************************************************************************** * * +* Paramètres : binary = nouvelle instance de binaire analysé. * +* * +* Description : Lance une actualisation du fait d'un changement de binaire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void notify_panels_of_binary_change(GOpenidaBinary *binary) +{ + GEditorPanel *iter; /* Boucle de parcours */ + + panels_list_for_each(iter, panels_list) + if (iter->reload_binary != NULL) + iter->reload_binary(iter, binary); + +} + + +/****************************************************************************** +* * * Paramètres : view = nouvelle visualisation de désassemblage. * * same = changement de binaire ou de vue ? * * * diff --git a/src/panels/panel.h b/src/panels/panel.h index 1a94ebc..38eeb79 100644 --- a/src/panels/panel.h +++ b/src/panels/panel.h @@ -76,6 +76,9 @@ void init_internal_panels(void); /* Incruste tous les panneaux dans la fenêtre de l'éditeur. */ void place_all_panels_in_editor(GtkWidget *); +/* Lance une actualisation du fait d'un changement de binaire. */ +void notify_panels_of_binary_change(GOpenidaBinary *); + /* Lance une actualisation du fait d'un changement de vue. */ void notify_panels_of_view_change(GtkBinView *, bool); diff --git a/src/panels/registers.h b/src/panels/registers.h index 7110414..0abf849 100644 --- a/src/panels/registers.h +++ b/src/panels/registers.h @@ -29,7 +29,7 @@ #include <gtk/gtk.h> -#include "../debug/debuggers.h" +#include "../debug/debugger.h" diff --git a/src/panels/symbols.c b/src/panels/symbols.c index d24bedf..e3c9bd4 100644 --- a/src/panels/symbols.c +++ b/src/panels/symbols.c @@ -26,7 +26,6 @@ #include <string.h> -#include <gtk/gtk.h> #include "panel-int.h" |