[Mono-dev] MSVC compiled mono_jit_walk_stack problems

Aras Pranckevicius aras at otee.dk
Tue Jan 17 13:02:33 EST 2006


Just got libgc/libmono compiling under microsoft VC7/VC8 (wasn't that
hard), but I'm having problems with mono_jit_walk_stack.

Basically, it uses MONO_INIT_CONTEXT_FROM_CALLER, which for MSVC is
defined as inline assembly using ebp register:
    unsigned int stackptr, retaddr;
        __asm mov stackptr, ebp
        __asm mov eax, DWORD PTR [ebp + 4]
        __asm mov retaddr, eax

As such, it requires the compiler to maintain "frame pointers" via
ebp. The problem is, MSVC in default "optimize for speed" mode quite
often omits them - the result is that ebp is often zero, and this code
tries to read from memory location 0x4 - a segfault.

At the moment I've forced MSVC to maintain frame pointers for the
whole mini-exceptions.c file: placed
    #ifdef _MSC_VER
    #pragma optimize("y",off)
at beginning and
    #ifdef _MSC_VER
    #pragma optimize("",on)
at the end of it.

However, I'm not sure if that produces the correct results for stack
walking (but it gets rid of segfault).

The stack walk is a result of calling mono_method_get_last_managed,
which our codebase uses to do something with mono exceptions.

Aras Pranckevicius

More information about the Mono-devel-list mailing list