[geany/geany-plugins] 885c3d: fixes several bugs (see Changelog)

Alexander Petukhov git-noreply at xxxxx
Wed Apr 4 09:57:19 UTC 2012


Branch:      refs/heads/master
Author:      Alexander Petukhov <devel at apetukhov.ru>
Committer:   Alexander Petukhov <devel at apetukhov.ru>
Date:        Wed, 04 Apr 2012 09:57:19
Commit:      885c3d1e8173c8aa2b7bf28deba013abc1b850b6
             https://github.com/geany/geany-plugins/commit/885c3d1e8173c8aa2b7bf28deba013abc1b850b6

Log Message:
-----------
fixes several bugs (see Changelog)


Modified Paths:
--------------
    debugger/ChangeLog
    debugger/TODO
    debugger/src/bptree.c
    debugger/src/cell_renderers/cellrendererbreakicon.c
    debugger/src/cell_renderers/cellrendererframeicon.c
    debugger/src/cell_renderers/cellrenderertoggle.c
    debugger/src/dbm_gdb.c
    debugger/src/debug.c
    debugger/src/envtree.c
    debugger/src/stree.c
    debugger/src/vtree.c
    debugger/src/wtree.c

Modified: debugger/ChangeLog
8 files changed, 8 insertions(+), 0 deletions(-)
===================================================================
@@ -1,3 +1,11 @@
+04-04-2012 	Alexander Petukhov <devel at apetukhov.ru>
+
+	* fixing exiting with code case that was unhandled and caused SIGSEGV (gdb)
+	* set current directory to executable's one (gdb)
+	* handling spaces in target and breakpoints filenames (gdb)
+	* fixing memory leaks on gtk_tree_row_reference_get_path and tree/list stores
+	* fixing SIGSEGV when selecting a cell in custom cell renderers using a keyboard
+
 10-03-2012 	Alexander Petukhov <devel at apetukhov.ru>
 
 	* switching between frames by clicking a frame arrow in the stack window


Modified: debugger/TODO
7 files changed, 3 insertions(+), 4 deletions(-)
===================================================================
@@ -1,9 +1,7 @@
 BUGS:
-- terminal stops to produce any output after some debug seesions
 - tooltip appears even if a pointer in no longer inside editor window
-- check possible memory leaks on a)gtk_tree_row_reference_get_path b)missing unrefs on tree/list stores
-- cell_renderer_toogle SIGSEGV in cell_renderer_toggle_activate when activating a cell using a keyboard (event->button == NULL)
-- debug geany with debugger project. switch frames then step over -> continue instead, then close geany being debugged -> dbm_gdb.c:502 (no step reason, probably the record from the previos step command???)
+- when "Jump to current instruction" - two active frame icons in stack view
+- no icons in stack and breaks after unload/load plugin
 
 FEATURES:
 - custom tooltip with sticking facilities
@@ -24,3 +22,4 @@ FEATURES:
 - custom tooltip on breaks and stack trace windows with code snippet around break or frame
 - font from the geany settings for a message window
 - a button in the upper right path of a right notebook for a hiding/showing button panel
+- use left/right keys to collapse/expand in breakpoints tree


Modified: debugger/src/bptree.c
5 files changed, 4 insertions(+), 1 deletions(-)
===================================================================
@@ -616,6 +616,7 @@ gboolean bptree_init(move_to_line_cb cb)
 		G_TYPE_STRING);
 	model = GTK_TREE_MODEL(store);
 	tree = gtk_tree_view_new_with_model (model);
+	g_object_unref(store);
 	
 	/* set tree view properties */
 	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), 1);
@@ -802,7 +803,9 @@ void bptree_add_breakpoint(breakpoint* bp)
 	}
 	else
 	{
-		gtk_tree_model_get_iter(model, &file_iter, gtk_tree_row_reference_get_path(file_reference));
+		GtkTreePath *path = gtk_tree_row_reference_get_path(file_reference);
+		gtk_tree_model_get_iter(model, &file_iter, path);
+		gtk_tree_path_free(path);
 	}
 	
 	/* lookup where to insert new row */


Modified: debugger/src/cell_renderers/cellrendererbreakicon.c
8 files changed, 6 insertions(+), 2 deletions(-)
===================================================================
@@ -261,8 +261,12 @@ static void cell_renderer_break_icon_render(GtkCellRenderer *cell, GdkDrawable *
 static gint cell_renderer_break_icon_activate(GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path,
 	GdkRectangle *background_area, GdkRectangle *cell_area, GtkCellRendererState  flags)
 {
-	if (event->button.x >= cell_area->x &&
-		event->button.x < (cell_area->x + cell_area->width))
+	if (!event ||
+		(
+			event->button.x >= cell_area->x &&
+			event->button.x < (cell_area->x + cell_area->width)
+		)
+	)
 	{
 		g_signal_emit (cell, clicked_signal, 0, path);
 	}


Modified: debugger/src/cell_renderers/cellrendererframeicon.c
8 files changed, 6 insertions(+), 2 deletions(-)
===================================================================
@@ -45,8 +45,12 @@ enum {
 static gint cell_renderer_frame_icon_activate(GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path,
 	GdkRectangle *background_area, GdkRectangle *cell_area, GtkCellRendererState  flags)
 {
-	if (event->button.x >= cell_area->x &&
-		event->button.x < (cell_area->x + cell_area->width))
+	if (!event ||
+		(
+			event->button.x >= cell_area->x &&
+			event->button.x < (cell_area->x + cell_area->width)
+		)
+	)
 	{
 		g_signal_emit (cell, clicked_signal, 0, path);
 	}


Modified: debugger/src/cell_renderers/cellrenderertoggle.c
8 files changed, 6 insertions(+), 2 deletions(-)
===================================================================
@@ -35,8 +35,12 @@
 static gint cell_renderer_toggle_activate(GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path,
 	GdkRectangle *background_area, GdkRectangle *cell_area, GtkCellRendererState  flags)
 {
-	if (event->button.x >= cell_area->x &&
-		event->button.x < (cell_area->x + cell_area->width))
+	if (!event ||
+		(
+			event->button.x >= cell_area->x &&
+			event->button.x < (cell_area->x + cell_area->width)
+		)
+	)
 	{
 		g_signal_emit_by_name(cell, "toggled", path);
 	}


Modified: debugger/src/dbm_gdb.c
39 files changed, 31 insertions(+), 8 deletions(-)
===================================================================
@@ -72,6 +72,7 @@ enum sr {
 	SR_EXITED_NORMALLY,
 	SR_SIGNAL_RECIEVED,
 	SR_EXITED_SIGNALLED,
+	SR_EXITED_WITH_CODE,
 } stop_reason;
 
 /* callbacks to use for messaging, error reporting and state change alerting */
@@ -490,6 +491,8 @@ static gboolean on_read_from_gdb(GIOChannel * src, GIOCondition cond, gpointer d
 					stop_reason = SR_EXITED_NORMALLY;
 				else if (!strcmp(reason, "exited-signalled"))
 					stop_reason = SR_EXITED_SIGNALLED;
+				else if (!strcmp(reason, "exited"))
+					stop_reason = SR_EXITED_WITH_CODE;
 			}
 			else
 			{
@@ -531,8 +534,18 @@ static gboolean on_read_from_gdb(GIOChannel * src, GIOCondition cond, gpointer d
 					dbg_cbs->set_stopped(atoi(thread_id));
 				}
 			}
-			else if (stop_reason == SR_EXITED_NORMALLY || stop_reason == SR_EXITED_SIGNALLED)
+			else if (stop_reason == SR_EXITED_NORMALLY || stop_reason == SR_EXITED_SIGNALLED || stop_reason == SR_EXITED_WITH_CODE)
 			{
+				if (stop_reason == SR_EXITED_WITH_CODE)
+				{
+					gchar *code = strstr(reason + strlen(reason) + 1,"exit-code=\"") + strlen("exit-code=\"");
+					*(strchr(code, '\"')) = '\0';
+					gchar *message = g_strdup_printf(_("Program exited with code \"%i\""), (int)(char)strtol(code, NULL, 8));
+					dbg_cbs->report_error(message);
+
+					g_free(message);
+				}
+
 				stop();
 			}
 		}
@@ -692,13 +705,17 @@ gboolean run(const gchar* file, const gchar* commandline, GList* env, GList *wit
 	/* spawn GDB */
 	const gchar *exclude[] = { "LANG", NULL };
 	gchar **gdb_env = utils_copy_environment(exclude, "LANG", "C", NULL);
-	if (!g_spawn_async_with_pipes(NULL, (gchar**)gdb_args, gdb_env,
+	gchar *working_directory = g_path_get_dirname(file);
+	if (!g_spawn_async_with_pipes(working_directory, (gchar**)gdb_args, gdb_env,
 				     GDB_SPAWN_FLAGS, NULL,
 				     NULL, &gdb_pid, &gdb_in, &gdb_out, NULL, &err))
 	{
 		dbg_cbs->report_error(_("Failed to spawn gdb process"));
+		g_free(working_directory);
+		g_strfreev(gdb_env);
 		return FALSE;
 	}
+	g_free(working_directory);
 	g_strfreev(gdb_env);
 	
 	/* move gdb to it's own process group */
@@ -743,8 +760,8 @@ gboolean run(const gchar* file, const gchar* commandline, GList* env, GList *wit
 
 	/* loading file */
 	GString *command = g_string_new("");
-	g_string_printf(command, "-file-exec-and-symbols %s", file);
-	commands = add_to_queue(commands, _("~\"Loading target file ...\""), command->str, _("Error loading file"), FALSE);
+	g_string_printf(command, "-file-exec-and-symbols \"%s\"", file);
+	commands = add_to_queue(commands, _("~\"Loading target file.\\n\""), command->str, _("Error loading file"), FALSE);
 	g_string_free(command, TRUE);
 
 	/* setting asyncronous mode */
@@ -792,7 +809,7 @@ gboolean run(const gchar* file, const gchar* commandline, GList* env, GList *wit
 	{
 		breakpoint *bp = (breakpoint*)biter->data;
 		command = g_string_new("");
-		g_string_printf(command, "-break-insert -f %s:%i", bp->file, bp->line);
+		g_string_printf(command, "-break-insert -f \"\\\"%s\\\":%i\"", bp->file, bp->line);
 
 		GString *error_message = g_string_new("");
 		g_string_printf(error_message, _("Breakpoint at %s:%i cannot be set\nDebugger message: %s"), bp->file, bp->line, "%s");
@@ -934,8 +951,14 @@ int get_break_number(char* file, int line)
 		*strchr(bstart, '\"') = '\0';
 		int bline = atoi(bstart);
 		
-		if (!strcmp(fname, file) && bline == line)
+		gchar *file_quoted = g_strdup_printf("\\\"%s\\\"", file);
+		int break_found = !strcmp(fname, file_quoted) && bline == line;
+		g_free(file_quoted);
+
+		if (break_found)
+		{
 			return num;
+		}
 		
 		bstart += strlen(bstart) + 1;
 	} 
@@ -957,11 +980,11 @@ gboolean set_break(breakpoint* bp, break_set_activity bsa)
 		gchar *record = NULL;
 		
 		/* 1. insert breakpoint */
-		sprintf (command, "-break-insert %s:%i", bp->file, bp->line);
+		sprintf (command, "-break-insert \"\\\"%s\\\":%i\"", bp->file, bp->line);
 		if (RC_DONE != exec_sync_command(command, TRUE, &record))
 		{
 			g_free(record);
-			sprintf (command, "-break-insert -f %s:%i", bp->file, bp->line);
+			sprintf (command, "-break-insert -f \"\\\"%s\\\":%i\"", bp->file, bp->line);
 			if (RC_DONE != exec_sync_command(command, TRUE, &record))
 			{
 				g_free(record);


Modified: debugger/src/debug.c
14 files changed, 12 insertions(+), 2 deletions(-)
===================================================================
@@ -240,7 +240,9 @@ static void on_watch_changed(GtkCellRendererText *renderer, gchar *path, gchar *
 		-1);
 
 	/* check if it is empty row */
-	gboolean is_empty_row = !gtk_tree_path_compare (tree_path, wtree_empty_path());
+	GtkTreePath *empty_path = wtree_empty_path();
+	gboolean is_empty_row = !gtk_tree_path_compare (tree_path, empty_path);
+	gtk_tree_path_free(empty_path);
 
    	gchar *striped = g_strstrip(g_strdup(new_text));
 	if (!strlen(striped) &&
@@ -447,6 +449,8 @@ static gboolean on_watch_key_pressed_callback(GtkWidget *widget, GdkEvent  *even
 
 
 				gtk_tree_store_remove(wstore, &titer);
+
+				gtk_tree_path_free(path);
 			}
 			
 			iter = iter->next;
@@ -455,7 +459,11 @@ static gboolean on_watch_key_pressed_callback(GtkWidget *widget, GdkEvent  *even
 		/* if all (with or without empty row) was selected - set empty row
 		as a path to be selected after deleting */
 		if (!reference_to_select)
-			reference_to_select = gtk_tree_row_reference_new (gtk_tree_view_get_model(GTK_TREE_VIEW(wtree)), wtree_empty_path());
+		{
+			GtkTreePath *path = wtree_empty_path();
+			reference_to_select = gtk_tree_row_reference_new (gtk_tree_view_get_model(GTK_TREE_VIEW(wtree)), path);
+			gtk_tree_path_free(path);
+		}
 
 		/* set selection */
 		gtk_tree_selection_unselect_all(selection);
@@ -471,6 +479,8 @@ static gboolean on_watch_key_pressed_callback(GtkWidget *widget, GdkEvent  *even
 		config_set_debug_changed();
 	}
 
+	gtk_tree_path_free(empty_path);
+
 	/* free rows list */
 	g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
 	g_list_free (rows);


Modified: debugger/src/envtree.c
23 files changed, 18 insertions(+), 5 deletions(-)
===================================================================
@@ -151,6 +151,7 @@ static void delete_selected_rows()
 			gtk_tree_model_get_iter(model, &titer, path);
 			gtk_list_store_remove(store, &titer);
 
+			gtk_tree_path_free(path);
 			iter = iter->next;
 		}
 
@@ -159,6 +160,7 @@ static void delete_selected_rows()
 		GtkTreePath *path = gtk_tree_row_reference_get_path(reference_to_select);
 		gtk_tree_selection_select_path(selection, path);
 		gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(tree), path, NULL, TRUE, 0.5, 0.5);
+		gtk_tree_path_free(path);
 
 		/* free references list */
 		g_list_foreach (references, (GFunc)gtk_tree_row_reference_free, NULL);
@@ -168,6 +170,8 @@ static void delete_selected_rows()
 	/* free selection reference */
 	gtk_tree_row_reference_free(reference_to_select);
 
+	gtk_tree_path_free(empty_path);
+
 	/* free rows list */
 	g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
 	g_list_free (rows);
@@ -213,9 +217,11 @@ static void on_render_value(GtkTreeViewColumn *tree_column,
 	{
 		/* do not allow to edit value for empty row */
 		GtkTreePath *path = gtk_tree_model_get_path(tree_model, iter);
-		gboolean empty = !gtk_tree_path_compare(path, gtk_tree_row_reference_get_path(empty_row));
+		GtkTreePath *empty_path = gtk_tree_row_reference_get_path(empty_row);
+		gboolean empty = !gtk_tree_path_compare(path, empty_path);
 		g_object_set (cell, "editable", entering_new_var || !empty, NULL);
 		gtk_tree_path_free(path);
+		gtk_tree_path_free(empty_path);
 	}
 }
 
@@ -226,8 +232,10 @@ static void on_value_changed(GtkCellRendererText *renderer, gchar *path, gchar *
 {
 	GtkTreeIter  iter;
 	GtkTreePath *tree_path = gtk_tree_path_new_from_string (path);
-    
-	gboolean empty = !gtk_tree_path_compare(tree_path, gtk_tree_row_reference_get_path(empty_row));
+
+    GtkTreePath *empty_path = gtk_tree_row_reference_get_path(empty_row);
+	gboolean empty = !gtk_tree_path_compare(tree_path, empty_path);
+	gtk_tree_path_free(empty_path);
 
 	gtk_tree_model_get_iter (
 		 model,
@@ -300,7 +308,8 @@ static void on_value_editing_cancelled(GtkCellRenderer *renderer, gpointer user_
 {
 	/* check whether escape was pressed when editing
 	new variable value cell */
-	if(!gtk_tree_path_compare(being_edited_value, gtk_tree_row_reference_get_path(empty_row)))
+	GtkTreePath *empty_path = gtk_tree_row_reference_get_path(empty_row);
+	if(!gtk_tree_path_compare(being_edited_value, empty_path))
 	{
 		/* if so - clear name sell */
 		GtkTreeIter iter;
@@ -318,6 +327,7 @@ static void on_value_editing_cancelled(GtkCellRenderer *renderer, gpointer user_
 	g_object_set (renderer_value, "editable", FALSE, NULL);
 
 	gtk_tree_path_free(being_edited_value);
+	gtk_tree_path_free(empty_path);
 }
 
 /*
@@ -327,8 +337,9 @@ static void on_name_changed(GtkCellRendererText *renderer, gchar *path, gchar *n
 {
 	GtkTreeIter  iter;
 	GtkTreePath *tree_path = gtk_tree_path_new_from_string (path);
+	GtkTreePath *empty_path = gtk_tree_row_reference_get_path(empty_row);
     
-	gboolean empty = !gtk_tree_path_compare(tree_path, gtk_tree_row_reference_get_path(empty_row));
+	gboolean empty = !gtk_tree_path_compare(tree_path, empty_path);
 
 	gtk_tree_model_get_iter (
 		 model,
@@ -371,6 +382,7 @@ static void on_name_changed(GtkCellRendererText *renderer, gchar *path, gchar *n
 	}
 	
 	gtk_tree_path_free(tree_path);
+	gtk_tree_path_free(empty_path);
 	g_free(oldvalue);
 	g_free(striped);
 }
@@ -387,6 +399,7 @@ static void on_name_changed(GtkCellRendererText *renderer, gchar *path, gchar *n
 		G_TYPE_STRING);
 	model = GTK_TREE_MODEL(store);
 	tree = gtk_tree_view_new_with_model (model);
+	g_object_unref(store);
 	
 	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), TRUE);
 	g_signal_connect(G_OBJECT(tree), "key-press-event", G_CALLBACK (on_envtree_keypressed), NULL);


Modified: debugger/src/stree.c
15 files changed, 12 insertions(+), 3 deletions(-)
===================================================================
@@ -333,6 +333,7 @@ static void on_selection_changed(GtkTreeSelection *treeselection, gpointer user_
 		
 	model = GTK_TREE_MODEL(store);
 	tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
+	g_object_unref(store);
 	
 	/* set tree view properties */
 	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), 1);
@@ -411,7 +412,9 @@ void stree_add(frame *f)
 {
 	GtkTreeRowReference *reference = (GtkTreeRowReference*)g_hash_table_lookup(threads, (gpointer)active_thread_id);
 	GtkTreeIter thread_iter;
-	gtk_tree_model_get_iter(model, &thread_iter, gtk_tree_row_reference_get_path(reference));
+	GtkTreePath *path = gtk_tree_row_reference_get_path(reference);
+	gtk_tree_model_get_iter(model, &thread_iter, path);
+	gtk_tree_path_free(path);
 
 	GtkTreeIter frame_iter;
 	gtk_tree_store_insert_before(store, &frame_iter, &thread_iter, 0);
@@ -443,7 +446,9 @@ void stree_select_first_frame()
 	
 	GtkTreeRowReference *reference = (GtkTreeRowReference*)g_hash_table_lookup(threads, (gpointer)active_thread_id);
 	GtkTreeIter thread_iter, frame_iter;
-	gtk_tree_model_get_iter(model, &thread_iter, gtk_tree_row_reference_get_path(reference));
+	GtkTreePath *active_path = gtk_tree_row_reference_get_path(reference);
+	gtk_tree_model_get_iter(model, &thread_iter, active_path);
+	gtk_tree_path_free(active_path);
 	if(gtk_tree_model_iter_children(model, &frame_iter, &thread_iter))
 	{
 		gtk_tree_store_set (store, &frame_iter, S_ACTIVE, TRUE, -1);
@@ -534,6 +539,8 @@ void stree_remove_thread(int thread_id)
 	gtk_tree_store_remove(store, &iter);
 
 	g_hash_table_remove(threads, (gpointer)(glong)thread_id);
+
+	gtk_tree_path_free(tpath);
 }
 
 /*
@@ -543,7 +550,9 @@ void stree_remove_frames()
 {
 	GtkTreeRowReference *reference = (GtkTreeRowReference*)g_hash_table_lookup(threads, (gpointer)active_thread_id);
 	GtkTreeIter thread_iter;
-	gtk_tree_model_get_iter(model, &thread_iter, gtk_tree_row_reference_get_path(reference));
+	GtkTreePath *tpath = gtk_tree_row_reference_get_path(reference);
+	gtk_tree_model_get_iter(model, &thread_iter, tpath);
+	gtk_tree_path_free(tpath);
 
 	GtkTreeIter child;
 	if (gtk_tree_model_iter_children(model, &child, &thread_iter))


Modified: debugger/src/vtree.c
1 files changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -148,6 +148,7 @@ void render_value(GtkTreeViewColumn *tree_column,
 		G_TYPE_INT,
 		G_TYPE_INT);
 	GtkWidget* tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
+	g_object_unref(store);
 		
 	/* set tree view parameters */
 	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), TRUE);


Modified: debugger/src/wtree.c
6 files changed, 4 insertions(+), 2 deletions(-)
===================================================================
@@ -99,10 +99,12 @@ static void on_render_name(GtkTreeViewColumn *tree_column,
 GtkTreeIter wtree_empty_row()
 {
 	GtkTreeIter empty;
-	
+
+	GtkTreePath *path = gtk_tree_row_reference_get_path(empty_row);
 	gtk_tree_model_get_iter(gtk_tree_view_get_model(GTK_TREE_VIEW(tree)),
 		&empty,
-		gtk_tree_row_reference_get_path(empty_row));
+		path);
+	gtk_tree_path_free(path);
 	
 	return empty;
 }


@@ Diff output truncated at 100000 characters. @@


--------------
This E-Mail was brought to you by github_commit_mail.py (Source: TBD).



More information about the Plugins-Commits mailing list