|
Boost : |
From: Hendrik Schober (boost_at_[hidden])
Date: 2002-06-18 10:51:05
<scleary_at_[hidden]> wrote:
> [...]
> When the OS exception is translated to a VCL exception, all stack
> information is lost (for the common example, all you get is the helpful
> message "Access Violation" -- gee, thanx, Borland! ;) ). What you describe
> above would work (i.e., get the full stack) only if your macros were used in
> the function that caused the OS exception and every function in-between that
> and the final catch.
In my logging/exception/assertion framework, when
used in a VCL environment, I do what Ted does and
for an AV get the file name and line number of the
stack trace macros nearest to the point the AV
occured. When used with VC, I don't touch SEH's at
all, since I like to have the debugger's stack dump.
(I meant to implement the other model for release
builds, but the pressure for it wasn't bad enough
to let it ever get at the top of my list. <g>)
> OTOH, you would have all stack information from the point of translation
> outward, and maybe that would be good enough...
It proofed to be a help for debugging with Borland,
since you can't get a stack trace otherwise.
> [...]
> There's no question that OS exceptions can be translated to C++ exceptions.
> I was just pointing out that traceable exceptions can't keep track of the
> stack until after the translation is made.
Again, look at www.HSchober.de/code/SEHTest.cpp.
It's easy to throw a tracable exception in this
case.
> So, it comes back down to intrusiveness: I am writing some library. Do I
> include traceable exception macros in every function? Or maybe just every
> non-"trivial" function? [...]
I got used to the habit of putting them into
"top level functions" of every module/package/
subsystem/<however you call it>. That is, I put
them into those functions that are called from
other modules.
If I have trouble finding an error in some code,
I tend to add more of them. <g> In old code,
there's usually quite a lot of them.
Also, I have a set of macros that disappear in
release mode, to be used in time critical code.
> What about exception-neutrality? If I call user code (either explicitly
> through a callback, or implicitly through a template parameter), and my
> function is supposed to be exception-neutral, how would I keep track of the
> stack? The only way I can see to make this work is to force *everyone* to
> use traceable exceptions...
Of course, the "intrusive model" isn't perfect.
But is did proof to be helpful for us during the
last five years.
After all, I _do_ look a lot at the stack dumps
in logfiles in order to find out what happened if
I lost my (usually always set) breakpoint at the
I lost my exception base class. I _was_ able to
find out about problems that weren't reproducable
here by only looking at the logfiles which were
created at the user's site. If this user is on the
other side of the planet (and is willing and able
to cooperate), that _is_ a very cheap way to do
remote debugging.
> [...] With my current non-intrusive
> solution, the stack tracing is not done unless it is an OS exception.
Is there anything preventing it from beeing used
within the exception class' ctor?
> [...]
> We've been focusing on tracing the stack from the point an exception was
> thrown. My solution traces the call stack; yours the "try" stack -- but
> they both focus on the *exception*. Maybe this is wrong; the original post
> in this thread was about *assertions*. [...]
As I've written elsewhere in this(?) thread, aborting
in case of an error isn't an option for me, even if
it is a serious ("fatal") error. So my assert macro
throws an exception which can be caught. This exception
will be traced as any other of my exceptions.
> [...]
> Intrusiveness begs the questions: you add it to your code. Good. Are you
> going to add it to the Boost.SmartPtr library? Are you going to add it to
> your own general-purpose library, that you plan to put on your web page?
> What about that commercial XML parser library your project uses? Where does
> it stop?
>
> A non-intrusive solution sidesteps this question, almost. ;)
While that's true, I usually consider 3rd party code
as a black box. I do not care what happens inside it
as I expect the writers of that code to debug it. So
I'm simply not interested in stack information about
that code.
> [...]
> I doubt it; even though I'm for the non-intrusive solution, I'll freely
> admit it's *much* more complicated! :) And will take many Boosters a good
> amount of time to get right.
>
> But I'd rather invest the time, and have a good, well-established,
> non-intrusive solution; even if it does take longer to write.
If it's provided as a library for everyone to use,
the effort it takes to develop it isn't that important
anymore (except for those who do the work <g>), since
it pays off everyone.
Ted might have though about him adding it to his project.
> -Steve
Schobi
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk