Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


Hi Tom,

On Tue, 2013-02-26 at 14:23 +0100, Jan Holesovsky wrote:
Michael> Even better than this would (perhaps) be a "break inside thrower that
Michael> is caught here" type breakpoint - that we could invoke to land us in
Michael> whatever code is going to throw as it does that [ and before it started
Michael> all the magic cleanup / unwinding work ]. That is - assuming that it's
Michael> possible for the code to know (at that point) where it will ultimately
Michael> end up (? ;-)

I think it isn't possible in general.  When an exception is thrown, I
think all that can really be determined is the next catch point.

        This would be perfect. Explicit rethrows are relatively rare in our
code, however it is completely normal to have code that we simply don't
understand and/or follow - whereby we do:

A:
        try {
B:              do_incredibly_complex_thing();
        } catch (const uno::Exception &e) {
C:              ... flow eventually ends up here ...
        }

        Where by do_incredibly_complex_thing - it is expected that this method
dlopens a dozen separate shared libraries, does 1bn instructions or so -
and (somewhere in the middle) fails in some odd way - that we're trying
to find. Oh - of course, about two dozen+ 'expected' exceptions will get
thrown and caught during that process.

        Current approaches to trying to find: "what inside B threw to C"
involve: putting a break-point in 'A', then putting a breakpoint in
__cxa_throw - continuing, and typing 'continue <N>' several times to
work out what value of 'two dozen+' we have today, manually counting /
trying to binary chop towards that number: and finally we get near
enough that breaking on and carefully examining every exception in a
plausible range that may cause this issue.

        That flow as you can see is pretty hideous :-) what we really want to
do is:

        catch thrower-to-C

        or somesuch :-) being able to handle rethrows simply by re-starting gdb
and the app, doing a 'catch thrower-to-<rethrow-catch>' would be
blissful in comparison - walking up the chain one by one ;-)

In other words - I'd love if gdb were able to do this even with the
re-throw limitation :-)

        As kendy says this would really help us read, understand, unwind and
improve complex code.

Tom wrote:
I also implemented a way to filter exception catches by name:

   catch catch [REGEXP]
   catch throw [REGEXP]
   catch rethrow [REGEXP]

        This is really nice; the ability to hide many of the "two dozen+"
expected exceptions in some way be really useful. Unfortunately these
are often of quite generic types :-)

        Tor suggested on IRC some way of ignoring specific exception throwing
sites which tend to creep into the code over time and need tackling.
Some low-level technology will decide it's better to fire an Exception
than return an undefined value of some kind - and suddenly two-dozen+
turns into 100's - (I just got this today) ;-)

        Being able to say: catch throw ignore - which would ignore the last
thrown exception site would be really lovely ;-)

        Is any of that useful ? - really looking forward to getting a new
libstdc++ etc. with your fixes in a few months :-)

        Thanks !

                Michael.

-- 
michael.meeks@suse.com  <><, Pseudo Engineer, itinerant idiot


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.