This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [rfc breakpoint] Catch exceptions


One thing we had to worry about at least on Mac OS X is that we don't use a shared libstdc++, rather every shlib that uses C++ get its own copy of all the libsupc++ code. So there are actually many copies of __cxa__begin_catch hanging around. To do this properly, you have to search exhaustively for these symbols, not just take the first hit. Moreover, you have to redo it on every shared library load, or you will miss some. This still might bite you on other systems, for instance if out of paranoia somebody had linked their shlib or executable statically to libstdc++.a (so they wouldn't get bit by changing ABI issues or whatever).

BTW. The more general problem of a symbol resolving to multiple instances - for instance setting file:line breakpoints in inlined functions or template method defn's - is something we need to address. It really ticks off our C++ friends. I thought I was going to have time to think about this in the next month or two, but I got sidetracked on other issues. But I will need to get back to it after our WWDC (in June).

I thought from some comments in other notes that this was something you were thinking about as well, Daniel. Is that true?

Jim

On Tuesday, March 25, 2003, at 07:37 AM, gdb-patches-digest-help at sources dot redhat dot com wrote:

+static int
+handle_gnu_v3_exceptions (int tempflag, char *cond_string,
+ enum exception_event_kind ex_event, int from_tty)
+{
+ struct minimal_symbol *trigger_func;
+ const char *trigger_func_name;
+ struct symtab_and_line sal;
+ struct breakpoint *b;
+
+ if (ex_event == EX_EVENT_CATCH)
+ trigger_func_name = "__cxa_begin_catch";
+ else
+ trigger_func_name = "__cxa_throw";
+
+ trigger_func = lookup_minimal_symbol (trigger_func_name, NULL, NULL);
+ if (trigger_func == 0)
+ return 0;
+ sal = find_msymbol_start_sal (trigger_func, 1);
+
+ b = set_raw_breakpoint (sal, bp_breakpoint);
+ set_breakpoint_count (breakpoint_count + 1);
+ b->number = breakpoint_count;
+ b->cond = NULL;
+ b->cond_string = (cond_string == NULL) ?
+ NULL : savestring (cond_string, strlen (cond_string));
+ b->thread = -1;
+ b->addr_string = xstrdup (trigger_func_name);
+ b->enable_state = bp_enabled;
+ b->disposition = tempflag ? disp_del : disp_donttouch;
+ mention (b);
+ b->ep_type = ep_gnuv3;
+
+ b->print = print_exception_catchpoint;
+ b->print_one = print_one_exception_catchpoint;
+ b->print_mention = print_mention_exception_catchpoint;
+ return 1;
+}
+


--
Jim Ingham                                   jingham at apple dot com
Developer Tools
Apple Computer


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]