How to debug FinalizeError?

Adam D. Ruppe destructionator at gmail.com
Wed Nov 28 23:15:16 UTC 2018


On Wednesday, 28 November 2018 at 22:40:17 UTC, unDEFER wrote:
> Hello! After long-long time of debugging, I just have decided 
> InvalidMemoryOperationError in my program. But now my program 
> after few hours of testing again crashes with "Finalization 
> error".

So InvalidMemoryOperationError means a GC function got called 
while the GC was locked. This is usually because you did an 
allocation inside a destructor.

Finalization error happens when a destructor throws an exception.

Now, many times, trying to throw an exception from inside a 
destructor will first trigger the invalid operation - allocating 
the exception will be an error before the exception actually 
exists. But there are a few ways around this, like preallocating 
or calling a function that uses a statically allocated exception.


Language features that use statically allocated exceptions 
include:

* InvalidMemoryOperationError
* OutOfMemoryError
* SwitchError

There might be more, but this is all I see right now (my process 
btw: search the druntime source code for "staticError", the 
function that makes those. But this is subject to change, so 
first maybe look up the definition of onOutOfMemoryError and see 
the pattern there.)


Of these... well, they are all kinda difficult to cause in a 
destructor.

Are you preallocating something in your code and throwing it in a 
destructor?



Also, what *exactly* is the message you get when the exception 
happens? It should include a line number from druntime as well as 
message from the inner exception that caused it in the first 
place.


More information about the Digitalmars-d-learn mailing list