diff -crN ./bug-buddy/bugzilla/gnome/products /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/bugzilla/gnome/products
*** ./bug-buddy/bugzilla/gnome/products	Mon Sep  1 11:47:34 2003
--- /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/bugzilla/gnome/products	Fri Oct 17 14:33:42 2003
***************
*** 1,3 ****
--- 1,4 ----
+ 
  <!DOCTYPE products SYSTEM "http://bugzilla.gnome.org/bugzilla.gnome.org/bugzilla-gnome-org.dtd">
  <products>
    <product votestoconfirm="0" description="The GNOME Bugtracker." maxvotesperbug="10000" votesperuser="0" disallownew="0" name="bugzilla.gnome.org">
diff -crN ./bug-buddy/configure.in /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/configure.in
*** ./bug-buddy/configure.in	Mon Sep  1 11:47:34 2003
--- /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/configure.in	Fri Oct 17 14:34:27 2003
***************
*** 8,13 ****
--- 8,14 ----
  
  AM_MAINTAINER_MODE
  AC_PROG_INTLTOOL
+ AC_PROG_LIBTOOL
  
  SCROLLKEEPER_REQUIRED=0.3.8
  AC_SUBST(SCROLLKEEPER_REQUIRED)
***************
*** 65,70 ****
--- 66,85 ----
  
  AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal)
  
+ dnl if the host in an aix system, check the presence of gdb and dbx
+ case "$host" in
+   *aix*)
+     AC_CHECK_PROGS(DBG_NAME, gdb dbx, gdb)
+     if test x$DBG_NAME = xdbx ; then
+       AC_DEFINE(HAVE_AND_USE_DBX, , define this variable if dbx is present on the system and should be used)
+     fi
+     ;;
+   *)
+     ;;
+ esac
+ 
+ 
+ 
  AC_OUTPUT([
  bug-buddy.spec
  Makefile
diff -crN ./bug-buddy/src/Makefile.am /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/Makefile.am
*** ./bug-buddy/src/Makefile.am	Fri Oct 17 12:34:50 2003
--- /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/Makefile.am	Tue Jan 20 19:09:59 2004
***************
*** 32,37 ****
--- 32,39 ----
  
  bin_PROGRAMS = bug-buddy
  
+ bin_SCRIPTS = dbx-cmd dbx-core
+ 
  $(bug_buddy_OBJECTS): $(bb_built_sources)
  
  bug_buddy_SOURCES = \
***************
*** 58,63 ****
--- 60,67 ----
  bug_buddy_LDADD = \
  	$(BUG_BUDDY_LIBS)
  
+ bug_buddy_LDFLAGS = -export-dynamic
+ 
  noinst_PROGRAMS = gnome-crash
  
  gnome_crash_SOURCES = gnome-crash.c
diff -crN ./bug-buddy/src/bug-buddy.h /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/bug-buddy.h
*** ./bug-buddy/src/bug-buddy.h	Mon Sep  1 11:47:33 2003
--- /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/bug-buddy.h	Fri Oct 17 14:34:58 2003
***************
*** 213,220 ****
--- 213,228 ----
  void druid_set_sensitive (gboolean prev, gboolean next, gboolean cancel);
  void druid_set_state (BuddyState state);
  
+ 
+ #ifdef HAVE_AND_USE_DBX
+ void get_trace_with_dbx (char **args, const gchar *app);
+ void get_trace_from_pid_with_dbx (const gchar *app, const gchar *extra);
+ void get_trace_from_core_with_dbx (const gchar *core_file);
+ #else
  void get_trace_from_core (const gchar *core_file);
  void get_trace_from_pair (const gchar *app, const gchar *extra);
+ #endif
+ 
  void stop_gdb (void);
  void start_gdb (void);
  
diff -crN ./bug-buddy/src/bugzilla.c /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/bugzilla.c
*** ./bug-buddy/src/bugzilla.c	Mon Sep  1 11:47:33 2003
--- /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/bugzilla.c	Tue Mar 16 17:51:41 2004
***************
*** 350,357 ****
  	tmp_key = g_strconcat (key, ".tmp", NULL);
  
  	xmlfile->system_path = g_build_filename (BUDDY_DATADIR, "bugzilla", bts->subdir, key, NULL);
! 	xmlfile->cache_path  = g_build_filename (tmppath,       "bugzilla", bts->subdir, key, NULL);
! 	xmlfile->tmp_path    = g_build_filename (tmppath,       "bugzilla", bts->subdir, tmp_key, NULL);
  	localdir             = g_build_filename (tmppath,       "bugzilla", bts->subdir, NULL);
  
  	g_free (tmppath);
--- 350,357 ----
  	tmp_key = g_strconcat (key, ".tmp", NULL);
  
  	xmlfile->system_path = g_build_filename (BUDDY_DATADIR, "bugzilla", bts->subdir, key, NULL);
! 	xmlfile->cache_path  = g_build_filename ("file://", tmppath,       "bugzilla", bts->subdir, key, NULL);
! 	xmlfile->tmp_path    = g_build_filename ("file://", tmppath,       "bugzilla", bts->subdir, tmp_key, NULL);
  	localdir             = g_build_filename (tmppath,       "bugzilla", bts->subdir, NULL);
  
  	g_free (tmppath);
***************
*** 584,604 ****
  {
  	xmlDoc *doc;
  
! 	if (bts->products_xml) { // && !bts->products_xml->done) {
  		doc = load_bugzilla_xml_file (bts->products_xml);
  		if (doc)
  			load_products_xml (bts, doc);
  		bts->products_xml->done = TRUE;
  	}
  	
! 	if (bts->config_xml) { // && !bts->config_xml->done) {
  		doc = load_bugzilla_xml_file (bts->config_xml);
  		if (doc) 
  			load_config_xml (bts, doc);
  		bts->config_xml->done = TRUE;
  	}
  	
! 	if (bts->mostfreq_xml) { // && !bts->mostfreq_xml->done) {
  		doc = load_bugzilla_xml_file (bts->mostfreq_xml);
  		if (doc)
  			load_mostfreq_xml (bts, doc);
--- 584,604 ----
  {
  	xmlDoc *doc;
  
! 	if (bts->products_xml) { /* && !bts->products_xml->done) { */
  		doc = load_bugzilla_xml_file (bts->products_xml);
  		if (doc)
  			load_products_xml (bts, doc);
  		bts->products_xml->done = TRUE;
  	}
  	
! 	if (bts->config_xml) { /* && !bts->config_xml->done) { */
  		doc = load_bugzilla_xml_file (bts->config_xml);
  		if (doc) 
  			load_config_xml (bts, doc);
  		bts->config_xml->done = TRUE;
  	}
  	
! 	if (bts->mostfreq_xml) { /* && !bts->mostfreq_xml->done) { */
  		doc = load_bugzilla_xml_file (bts->mostfreq_xml);
  		if (doc)
  			load_mostfreq_xml (bts, doc);
diff -crN ./bug-buddy/src/bugzilla.h /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/bugzilla.h
*** ./bug-buddy/src/bugzilla.h	Mon Sep  1 11:47:33 2003
--- /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/bugzilla.h	Fri Oct 17 14:35:59 2003
***************
*** 148,154 ****
  	MOSTFREQ_DESC,
  	MOSTFREQ_SHOWN,
  
! 	MOSTFREQ_COLS,
  };
  
  void load_applications (void);
--- 148,154 ----
  	MOSTFREQ_DESC,
  	MOSTFREQ_SHOWN,
  
! 	MOSTFREQ_COLS
  };
  
  void load_applications (void);
diff -crN ./bug-buddy/src/cell-renderer-uri.c /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/cell-renderer-uri.c
*** ./bug-buddy/src/cell-renderer-uri.c	Mon Sep  1 11:47:33 2003
--- /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/cell-renderer-uri.c	Tue Jul  8 12:02:33 2003
***************
*** 11,22 ****
  enum {
  	PROP_0,
  	PROP_URI,
! 	PROP_SHOWN,
  };
  
  enum {
  	SIGNAL_URI_SHOWN,
! 	LAST_SIGNAL,
  };
  
  static guint uri_cell_signals[LAST_SIGNAL] = { 0 };
--- 11,22 ----
  enum {
  	PROP_0,
  	PROP_URI,
! 	PROP_SHOWN
  };
  
  enum {
  	SIGNAL_URI_SHOWN,
! 	LAST_SIGNAL
  };
  
  static guint uri_cell_signals[LAST_SIGNAL] = { 0 };
diff -crN ./bug-buddy/src/config.c /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/config.c
*** ./bug-buddy/src/config.c	Mon Sep  1 11:47:33 2003
--- /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/config.c	Thu Aug 14 12:50:32 2003
***************
*** 37,43 ****
  	CONFIG_ENTRY,
  	CONFIG_USER,
  	CONFIG_MAILER,
! 	CONFIG_INT_ENTRY,
  } ConfigType;
  
  typedef struct {
--- 37,43 ----
  	CONFIG_ENTRY,
  	CONFIG_USER,
  	CONFIG_MAILER,
! 	CONFIG_INT_ENTRY
  } ConfigType;
  
  typedef struct {
***************
*** 58,64 ****
  	{ CONFIG_MAILER, "email-sendmail-gnome-entry", "/bug-buddy/last/mailer",        "email-sendmail-entry" },
  	{ CONFIG_ENTRY,  "email-file-gnome-entry",     "/bug-buddy/last/bugfile",       "email-file-entry" },
  	{ CONFIG_TOGGLE, "email-sendmail-radio",       "/bug-buddy/last/use_sendmail=true" },
! 	//{ CONFIG_INT_ENTRY,  "last-updated-entry",     "/bug-buddy/last/last_update_check" },
  	{ CONFIG_DONE }
  };
  
--- 58,64 ----
  	{ CONFIG_MAILER, "email-sendmail-gnome-entry", "/bug-buddy/last/mailer",        "email-sendmail-entry" },
  	{ CONFIG_ENTRY,  "email-file-gnome-entry",     "/bug-buddy/last/bugfile",       "email-file-entry" },
  	{ CONFIG_TOGGLE, "email-sendmail-radio",       "/bug-buddy/last/use_sendmail=true" },
! 	/*{ CONFIG_INT_ENTRY,  "last-updated-entry",     "/bug-buddy/last/last_update_check" },*/
  	{ CONFIG_DONE }
  };
  
***************
*** 190,197 ****
  #if 0
  	if (gnome_config_get_bool ("/bug-buddy/last/show_debugging=0"))
  		gtk_button_clicked (GTK_BUTTON (GET_WIDGET ("debugging-options-button")));
- #endif
  
  	if (gnome_config_get_bool ("/bug-buddy/last/show_products=1"))
  		gtk_button_clicked (GTK_BUTTON (GET_WIDGET ("product-toggle")));
  }
--- 190,197 ----
  #if 0
  	if (gnome_config_get_bool ("/bug-buddy/last/show_debugging=0"))
  		gtk_button_clicked (GTK_BUTTON (GET_WIDGET ("debugging-options-button")));
  
  	if (gnome_config_get_bool ("/bug-buddy/last/show_products=1"))
  		gtk_button_clicked (GTK_BUTTON (GET_WIDGET ("product-toggle")));
+ #endif
  }
diff -crN ./bug-buddy/src/dbx-cmd /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/dbx-cmd
*** ./bug-buddy/src/dbx-cmd	Thu Jan  1 01:00:00 1970
--- /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/dbx-cmd	Mon Sep 16 07:51:05 2002
***************
*** 0 ****
--- 1,4 ----
+ dbx $* <<!EOF 2>/dev/null
+ where
+ detach
+ !EOF
diff -crN ./bug-buddy/src/dbx-core /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/dbx-core
*** ./bug-buddy/src/dbx-core	Thu Jan  1 01:00:00 1970
--- /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/dbx-core	Mon Sep 16 07:51:56 2002
***************
*** 0 ****
--- 1,3 ----
+ dbx $* <<!EOF
+ q
+ !EOF
diff -crN ./bug-buddy/src/gdb-buddy.c /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/gdb-buddy.c
*** ./bug-buddy/src/gdb-buddy.c	Mon Sep  1 11:47:33 2003
--- /gestconf/project/GNOME_ACL/GNOME/build/sh_build_GNOME/src/./bug-buddy/src/gdb-buddy.c	Wed Nov 12 16:48:23 2003
***************
*** 18,29 ****
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
   */
  
- #include <config.h>
- 
- #include "bug-buddy.h"
- 
- #include <gnome.h>
- 
  #include <stdio.h>
  
  #include <sys/wait.h>
--- 18,23 ----
***************
*** 32,37 ****
--- 26,37 ----
  #include <math.h>
  #include <string.h>
  
+ #include <config.h>
+ 
+ #include "bug-buddy.h"
+ 
+ #include <gnome.h>
+ 
  #include <libart_lgpl/libart.h>
  
  #define d(x)
***************
*** 93,99 ****
--- 93,103 ----
  		    (old_type != CRASH_DIALOG) ||
  		    (!old_app || strcmp (app, old_app)) ||
  		    (!old_extra || strcmp (extra, old_extra))) {
+ #ifdef HAVE_AND_USE_DBX
+ 			get_trace_from_pid_with_dbx (app, extra);
+ #else
  			get_trace_from_pair (app, extra);
+ #endif
  		}
  		break;
  	case CRASH_CORE:
***************
*** 101,107 ****
--- 105,115 ----
  		if (druid_data.explicit_dirty ||
  		    (old_type != CRASH_CORE) ||
  		    (!old_extra || strcmp (extra, old_extra))) {
+ #ifdef HAVE_AND_USE_DBX
+ 			get_trace_from_core_with_dbx (extra);
+ #else
  			get_trace_from_core (extra);
+ #endif
  		}
  		break;
  	default:
***************
*** 152,167 ****
  	return;
  }
  
  void 
! get_trace_from_core (const gchar *core_file)
  {
  	gchar *gdb_cmd;
  	gchar buf[1024];
  	gchar *binary = NULL;
  	int status;
  	FILE *f;
  
! 	gdb_cmd = g_strdup_printf ("gdb --batch --core=%s", core_file);
  
  	f = popen (gdb_cmd, "r");
  	g_free (gdb_cmd);
--- 160,314 ----
  	return;
  }
  
+ static gboolean
+ handle_gdb_input (GIOChannel *ioc, GIOCondition condition, gpointer data)
+ {	
+ 	gboolean retval = FALSE;
+ 	gchar buf[1024];
+ 	gsize len;
+ 	GIOStatus io_status;
+ 
+  gdb_try_read:
+ 	io_status = g_io_channel_read_chars (ioc, buf, 1024, &len, NULL);
+ 
+ 	switch (io_status) {
+ 	case G_IO_STATUS_AGAIN:
+ 		goto gdb_try_read;
+ 	case G_IO_STATUS_ERROR:
+ 		d(g_warning (_("Error on read... aborting")));
+ 		break;
+ 	case G_IO_STATUS_NORMAL:
+ 		retval = TRUE;
+ 		break;
+ 	default:
+ 		break;
+ 	}
+ 
+ 	if (len > 0) {
+ 		GtkTextIter end;
+ 		GtkTextBuffer *buffy;
+ 		GtkTextView *tv;
+ 		char *utftext;
+ 		gsize localelen;
+ 		gsize utflen;
+ 
+ 		tv = GTK_TEXT_VIEW (GET_WIDGET ("gdb-text"));
+ 		buffy = gtk_text_view_get_buffer (tv);
+ 
+ 		gtk_text_buffer_get_end_iter (buffy, &end);
+ 		/* gdb charset is ISO-8859-1 */
+ 		utftext = g_convert_with_fallback (buf, len, "UTF-8", "ISO-8859-1", NULL, &localelen, &utflen, NULL);
+ 		gtk_text_buffer_insert (buffy, &end, utftext, utflen);
+ 		g_free (utftext);
+ 	}
+ 
+ 	if (!retval)
+ 		stop_gdb ();
+ 
+ 	return retval;
+ }
+ 
+ #ifdef HAVE_AND_USE_DBX
+ 
+ void
+ get_trace_with_dbx (char **args, const gchar *app)
+ {
+ 	GtkWidget *d;
+ 	char *s;
+ 	args[0] = g_find_program_in_path ("dbx-cmd");
+ 
+ 	if (!args[0]) {
+ 		d = gtk_message_dialog_new (GTK_WINDOW (GET_WIDGET ("druid-window")),
+ 					    0,
+ 					    GTK_MESSAGE_ERROR,
+ 					    GTK_BUTTONS_OK,
+ 					    _("dbx-cmd could not be found on your system.\n"
+ 					      "Debugging information will not be obtained."));
+ 		d(g_message ("Path: %s", getenv ("PATH")));
+ 		gtk_dialog_set_default_response (GTK_DIALOG (d),
+ 						 GTK_RESPONSE_OK);
+ 		gtk_dialog_run (GTK_DIALOG (d));
+ 		gtk_widget_destroy (d);
+ 		return;
+ 	}
+ 	if (!app || !*app) {
+ 		g_free(args[0]);
+ 		return;
+ 	}
+ 
+ 	d(g_message ("About to debug '%s'", app));
+ 	
+ 	if (!g_find_program_in_path ("dbx")) {
+ 		d = gtk_message_dialog_new (GTK_WINDOW (GET_WIDGET ("druid-window")),
+ 					    0,
+ 					    GTK_MESSAGE_ERROR,
+ 					    GTK_BUTTONS_OK,
+ 					    _("dbx could not be found on your system.\n"
+ 					      "Debugging information will not be obtained."));
+ 		d(g_message ("Path: %s", getenv ("PATH")));
+ 		gtk_dialog_set_default_response (GTK_DIALOG (d),
+ 						 GTK_RESPONSE_OK);
+ 		gtk_dialog_run (GTK_DIALOG (d));
+ 		gtk_widget_destroy (d);
+ 		g_free(args[0]);
+ 		return;
+ 	}
+ 
+ 	/* FIXME: use GError */
+ 	if (!g_spawn_async_with_pipes (NULL, args, NULL, 0, NULL, NULL,
+ 				       &druid_data.gdb_pid,
+ 				       NULL, 
+ 				       &druid_data.fd, 
+ 				       NULL, NULL)) {
+ 		d = gtk_message_dialog_new (GTK_WINDOW (GTK_WIDGET ("druid-window")),
+ 					    0,
+ 					    GTK_MESSAGE_ERROR,
+ 					    GTK_BUTTONS_OK,
+ 					    _("There was an error running dbx-cmd."));
+ 		gtk_dialog_run (GTK_DIALOG (d));
+ 		gtk_dialog_set_default_response (GTK_DIALOG (d),
+ 						 GTK_RESPONSE_OK);
+ 		gtk_widget_destroy (d);
+ 		g_free (args[0]);
+ 		return;
+ 	}
+ 	
+ 	druid_data.ioc = g_io_channel_unix_new (druid_data.fd);
+ 	
+ 	s = g_strdup_printf ("Backtrace was generated from '%s'\n\n", app);
+ 	buddy_set_text ("gdb-text", s);
+ 	g_free (s);
+ 	g_io_add_watch (druid_data.ioc, G_IO_IN | G_IO_HUP,
+ 			handle_gdb_input, NULL);
+ 	g_io_channel_unref (druid_data.ioc);
+ 
+ 	druid_set_sensitive (FALSE, FALSE, TRUE);
+ 	start_animation ();
+ 
+ 	gtk_widget_set_sensitive (GTK_WIDGET (GET_WIDGET ("gdb-stop")), TRUE);
+ 	gtk_widget_set_sensitive (GTK_WIDGET (GET_WIDGET ("gdb-go")), FALSE);
+ 
+ 	druid_data.explicit_dirty = FALSE;
+ 
+ 	g_free (args[0]);
+ }
+ 
  void 
! get_trace_from_core_with_dbx (const gchar *core_file)
  {
  	gchar *gdb_cmd;
  	gchar buf[1024];
  	gchar *binary = NULL;
  	int status;
  	FILE *f;
+ 	char* args[] = {"dbx-cmd", "ObjectFile", "CoreFile", NULL};
+ 	char *app2;
  
! 	if (!core_file || !*core_file) {
! 		return;
! 	}
! 
! 	gdb_cmd = g_strdup_printf ("dbx-core %s %s 2>&1", core_file, core_file);
  
  	f = popen (gdb_cmd, "r");
  	g_free (gdb_cmd);
***************
*** 172,178 ****
  					    0,
  					    GTK_MESSAGE_ERROR,
  					    GTK_BUTTONS_OK,
! 					    _("Unable to process core file with gdb:\n"
  					      "'%s'"), core_file);
  		gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_OK);
  		gtk_dialog_run (GTK_DIALOG (d));
--- 319,325 ----
  					    0,
  					    GTK_MESSAGE_ERROR,
  					    GTK_BUTTONS_OK,
! 					    _("Unable to process core file with dbx:\n"
  					      "'%s'"), core_file);
  		gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_OK);
  		gtk_dialog_run (GTK_DIALOG (d));
***************
*** 180,197 ****
  		return;
  	}
  
! 	while (fgets(buf, 1024, f) != NULL) {
! 		if (!binary && !strncmp(buf, "Core was generated", 16)) {
! 			gchar *s;
! 			gchar *ptr = buf;
! 			while (*ptr != '`' && *ptr !='\0') ptr++;
! 			if (*ptr == '`') {
! 				ptr++;
! 				s = ptr;
! 				while (*ptr != '\'' && *ptr !=' ' && *ptr !='\0') ptr++;
! 				*ptr = '\0';
! 				binary = g_strdup(s);
! 			}
  		}
  	}
  
--- 327,342 ----
  		return;
  	}
  
! 	while ( (!binary) && (fgets(buf, 1024, f) != NULL) ) {
! 		gchar *s;
! 		gchar *ptr = buf;
! 		while (*ptr != '(' && *ptr !='\0') ptr++;
! 		if (*ptr == '(') {
! 			ptr++;
! 			s = ptr;
! 			while (*ptr != ')' && *ptr !=' ' && *ptr !='\0') ptr++;
! 			*ptr = '\0';
! 			binary = g_strdup(s);
  		}
  	}
  
***************
*** 203,209 ****
  					    0,
  					    GTK_MESSAGE_ERROR,
  					    GTK_BUTTONS_OK,
! 					    _("GDB was unable to determine which binary created\n"
  					      "'%s'"), core_file);
  		gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_OK);
  		gtk_dialog_run (GTK_DIALOG (d));
--- 348,354 ----
  					    0,
  					    GTK_MESSAGE_ERROR,
  					    GTK_BUTTONS_OK,
! 					    _("DBX was unable to determine which binary created\n"
  					      "'%s'"), core_file);
  		gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_OK);
  		gtk_dialog_run (GTK_DIALOG (d));
***************
*** 211,273 ****
  		return;
  	}	
  
  	if (!popt_data.app_file) {
  		d(g_message ("Setting binary: %s", binary));
  		popt_data.app_file = g_strdup (binary);
  	}
  
! 	get_trace_from_pair (binary, core_file);
  	g_free (binary);
  }
  
! static gboolean
! handle_gdb_input (GIOChannel *ioc, GIOCondition condition, gpointer data)
! {	
! 	gboolean retval = FALSE;
! 	gchar buf[1024];
! 	gsize len;
! 	GIOStatus io_status;
! 
!  gdb_try_read:
! 	io_status = g_io_channel_read_chars (ioc, buf, 1024, &len, NULL);
  
! 	switch (io_status) {
! 	case G_IO_STATUS_AGAIN:
! 		goto gdb_try_read;
! 	case G_IO_STATUS_ERROR:
! 		d(g_warning (_("Error on read... aborting")));
! 		break;
! 	case G_IO_STATUS_NORMAL:
! 		retval = TRUE;
! 		break;
! 	default:
! 		break;
  	}
  
! 	if (len > 0) {
! 		GtkTextIter end;
! 		GtkTextBuffer *buffy;
! 		GtkTextView *tv;
! 		char *utftext;
! 		gsize localelen;
! 		gsize utflen;
  
! 		tv = GTK_TEXT_VIEW (GET_WIDGET ("gdb-text"));
! 		buffy = gtk_text_view_get_buffer (tv);
! 
! 		gtk_text_buffer_get_end_iter (buffy, &end);
! 		/* gdb charset is ISO-8859-1 */
! 		utftext = g_convert_with_fallback (buf, len, "UTF-8", "ISO-8859-1", NULL, &localelen, &utflen, NULL);
! 		gtk_text_buffer_insert (buffy, &end, utftext, utflen);
! 		g_free (utftext);
  	}
! 
! 	if (!retval)
! 		stop_gdb ();
! 
! 	return retval;
  }
  
  void
  get_trace_from_pair (const gchar *app, const gchar *extra)
  {
--- 356,421 ----
  		return;
  	}	
  
+ 	if (!app2) {
+ 		GtkWidget *d;
+ 		d = gtk_message_dialog_new (GTK_WINDOW (GET_WIDGET ("druid-window")),
+ 					    0,
+ 					    GTK_MESSAGE_ERROR,
+ 					    GTK_BUTTONS_OK,
+ 					    _("Unable to determine the path to the binary '%s'"), binary);
+ 		gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_OK);
+ 		gtk_dialog_run (GTK_DIALOG (d));
+ 		gtk_widget_destroy (d);
+ 		g_free (binary);
+ 		return;
+ 	}
+ 	
  	if (!popt_data.app_file) {
  		d(g_message ("Setting binary: %s", binary));
  		popt_data.app_file = g_strdup (binary);
  	}
  
! 	args[1] = app2;
! 	args[2] = (char *)core_file;
! 	
! 	get_trace_with_dbx (args, app2);
! 
  	g_free (binary);
+ 	g_free (app2);
  }
  
! void
! get_trace_from_pid_with_dbx (const gchar *app, const gchar *pid)
! {
! 	char* args[] = {"dbx-cmd", "-a pid", "ObjectFile", NULL};
! 	char *app2;
  
! 	if (!app || !pid || !*app || !*pid) {
! 		return;
  	}
  
! 	/* FIXME: we should probably be fully expanding the link to
! 	   see if it is a directory, but unix sucks and i am lazy */
! 	if (g_file_test (app, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK))
! 		app2 = g_strdup (app);
! 	else
! 		app2 = g_find_program_in_path (app);
  
! 	if (!app2) {
! 		return;
  	}
! 	
! 	args[1] = g_strdup_printf ("-a %s", pid);
! 	args[2] = app2;
! 	
! 	get_trace_with_dbx (args, app2);
! 	
! 	g_free (args[1]);
! 	g_free (app2);
  }
  
+ #else /* HAVE_AND_USE_DBX */
+ 
  void
  get_trace_from_pair (const gchar *app, const gchar *extra)
  {
***************
*** 299,306 ****
  		return;
  	}
  
! 	if (!app || !extra || !*app || !*extra)
  		return;
  	
  
  	if (*app == G_DIR_SEPARATOR) {
--- 447,456 ----
  		return;
  	}
  
! 	if (!app || !extra || !*app || !*extra) {
! 		g_free (args[0]);
  		return;
+ 	}
  	
  
  	if (*app == G_DIR_SEPARATOR) {
***************
*** 380,384 ****
--- 530,605 ----
  
  	druid_data.explicit_dirty = FALSE;
  
+ 	g_free (app2);
  	g_free (long_app);
  }
+ 
+ void 
+ get_trace_from_core (const gchar *core_file)
+ {
+ 	gchar *gdb_cmd;
+ 	gchar buf[1024];
+ 	gchar *binary = NULL;
+ 	int status;
+ 	FILE *f;
+ 
+ 	gdb_cmd = g_strdup_printf ("gdb --batch --core=%s", core_file);
+ 
+ 	f = popen (gdb_cmd, "r");
+ 	g_free (gdb_cmd);
+ 
+ 	if (!f) {
+ 		GtkWidget *d;
+ 		d = gtk_message_dialog_new (GTK_WINDOW (GET_WIDGET ("druid-window")),
+ 					    0,
+ 					    GTK_MESSAGE_ERROR,
+ 					    GTK_BUTTONS_OK,
+ 					    _("Unable to process core file with gdb:\n"
+ 					      "'%s'"), core_file);
+ 		gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_OK);
+ 		gtk_dialog_run (GTK_DIALOG (d));
+ 		gtk_widget_destroy (d);
+ 		return;
+ 	}
+ 
+ 	while (fgets(buf, 1024, f) != NULL) {
+ 		if (!binary && !strncmp(buf, "Core was generated", 16)) {
+ 			gchar *s;
+ 			gchar *ptr = buf;
+ 			while (*ptr != '`' && *ptr !='\0') ptr++;
+ 			if (*ptr == '`') {
+ 				ptr++;
+ 				s = ptr;
+ 				while (*ptr != '\'' && *ptr !=' ' && *ptr !='\0') ptr++;
+ 				*ptr = '\0';
+ 				binary = g_strdup(s);
+ 			}
+ 		}
+ 	}
+ 
+ 	status = pclose(f);
+ 
+ 	if (!binary) {
+ 		GtkWidget *d;
+ 		d = gtk_message_dialog_new (GTK_WINDOW (GET_WIDGET ("druid-window")),
+ 					    0,
+ 					    GTK_MESSAGE_ERROR,
+ 					    GTK_BUTTONS_OK,
+ 					    _("GDB was unable to determine which binary created\n"
+ 					      "'%s'"), core_file);
+ 		gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_OK);
+ 		gtk_dialog_run (GTK_DIALOG (d));
+ 		gtk_widget_destroy (d);
+ 		return;
+ 	}	
+ 
+ 	if (!popt_data.app_file) {
+ 		d(g_message ("Setting binary: %s", binary));
+ 		popt_data.app_file = g_strdup (binary);
+ 	}
+ 
+ 	get_trace_from_pair (binary, core_file);
+ 	g_free (binary);
+ }
+ 
+ #endif /* HAVE_AND_USE_DBX */
