On 11/29/18 2:07 AM, unDEFER wrote:
No I'm not preallocating any exceptions. It was idea, but I removed all calls which can make throw. I'm using very old dmd 2.074.1, so as I have patched it for my text editor with IDE functions. I had a year break in development, so now I need to rewrite all my patches.
But exactly the output of my program looks like this:

core.exception.FinalizeError@src/rt/lifetime.d(1407): Finalization error
=== Bypassed ===

|||||||||||| BerkeleyDB exceptions mixed with output of destructors ||||||||||||||||||

core.exception.InvalidMemoryOperationError@src/core/exception.d(696): Invalid memory operation

It means that "Invalid memory operation" occurred earlier than "Finalization error"?
The line on which shows the pointer src/rt/lifetime.d(1407) is exactly:
         onFinalizeError(*pc, e);
Why gdb doesn't see this function?

You need to compile druntime in debug mode. One thing you can do is implement the function locally, and then break on it (it's a C linkage, so I think the linker will grab your copy instead of the one in druntime)

i.e. in your code, do:

extern(C) void onFinalizeError(TypeInfo info, Throwable e, string file = __FILE__, size_t line = __LINE__)
   import core.stdc.stdio;
   printf("break here\n");

My program (the text editor) had run test all night under gdb with break on InvalidMemoryOperationError and didn't fall. So it is very-very-very hard to reproduce. And I haven't ideas where maybe this throw. At least I don't see any throw in explicit form.

These are unfortunately really tough to debug. You get very little info, and the stack trace is generally useless.


Reply via email to