Win64 exception handling

Kai Nacke via digitalmars-d-ldc digitalmars-d-ldc at
Tue Mar 24 04:48:44 PDT 2015

On Monday, 23 March 2015 at 22:55:18 UTC, Johan Engelen wrote:
> Hi all,
>   I have been trying to work on exception handling on Windows 
> x64 (with LLVM 3.6), but for a long time now, I am stuck on 
> something perhaps very simple.
> My test case is this program:
> int main() {
>     try {
>         throw new Exception("johan");
>     } catch (Exception jow) {
>     }
>     return 0;
> }
> This crashes, and Visual Studio's debugger tells me it's 
> because of an unhandled exception. As far as I understand it, 
> we call RtlRaiseException() from _d_throw_exception() and that 
> should call the personality function _d_eh_personality(). 
> However, _d_eh_personality() is never entered. Instead, 
> RtlRaiseException() returns and the program crashes. I am stuck 
> on how to continue from here. I have tried many different 
> things, but I cannot get the OS to call _d_eh_personality().
> One thing that strikes me is that the exception code 
> STATUS_LDC_D_EXCEPTION is passed to RtlRaiseException(), but is 
> not used anywhere else in our source.
> Does LLVM not correctly register _d_eh_personality() with the 
> OS? Or is there some filtering done on the exception code?
> I'd appreciate any help.
> -Johan

Hi Johan!

A quick check revealed: it works with current LLVM trunk but not 
with 3.6. I hvae no clue why.

The connection between RtlRaiseException() and 
_d_eh_personality() is the unwind information. You can 
"disassemble" the unwind information with llvm-objdump -u. If the 
code range is wrong or some other data is corrupt then the 
personality function is not called. You should also disassemble 
the object file and check .xdata and .pdata sections.

(The unwind information from LLVM 3.6 has no flag set. I believe 
that at least UNW_ExceptionHandler must be set.)


More information about the digitalmars-d-ldc mailing list