[Mono-osx] Bug: Using interop that return struct crashes

Phi Le iamphi at gmail.com
Fri Feb 6 13:17:47 EST 2009


Hello,

I am having problems calling CoreGraphics interops that return structs
in an embedded instance of mono.  I am using Mono 2.2 on OS X 10.5.6.
I have attached and included the code to reproduce the problem.  I
have found 3 different errors using different structs.  Take a look at
my gdb output.  Interestingly, there were no problem if the struct
contains just a pointer (void */IntPtr), or just an int.

I know how to work around the problem by using an out parameter, but I
would like a solution where I can use the original function signature.

Thanks,

Phi

File: MyClass.cs
<code>
using System;
using System.Runtime.InteropServices;

namespace Test {
    public class MyClass {
        public static void Main(String[] args) {
            try {
                Console.WriteLine("MyClass.Main()");
                InterOpTest();
            } catch (Exception ex) {
                Console.WriteLine(ex.ToString());
            }
        }

        [DllImport("__Internal")]
        private static extern MyStruct InterOpTest();

    }

    [StructLayout(LayoutKind.Sequential)]
    public struct MyStruct {
        //public char x;
        //public int y;
        //public float f;
        public IntPtr p;
    }
}
</code>

File: main.c
<code>
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>

struct MyStruct {
    //char x;
    //int y;
    //float f;
    void * p;
};
typedef struct MyStruct MyStruct;

MyStruct InterOpTest() {
    fprintf(stderr, "MyStruct InterOpTest()\n");
    MyStruct retVal;
    return retVal;
}

int main(int argc, char *argv[])
{
    char* file = "MyClass.exe";

    MonoAssembly* assembly;
    MonoDomain* domain;

    domain = mono_jit_init(file);
    assembly = mono_domain_assembly_open (domain, file);
    mono_jit_exec(domain, assembly, 1, argv);
    return 0;
}
</code>

File: Makefile
<code>
all:
    mcs MyClass.cs
    gcc main.c `pkg-config --cflags --libs mono`
clean:
    rm MyClass.exe a.out
</code>




gdb output for: struct { char x; }
<terminal>
phis-macbook-pro:monoTest phi$ make
mcs MyClass.cs
gcc main.c `pkg-config --cflags --libs mono`
phis-macbook-pro:monoTest phi$ gdb a.out
GNU gdb 6.3.50-20050815 (Apple version gdb-962) (Sat Jul 26 08:14:40 UTC 2008)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-apple-darwin"...Reading symbols for
shared libraries ....... done

(gdb) run
Starting program: /Users/phi/workspace/monoTest/a.out
Reading symbols for shared libraries
++++++..............................................................................
done
MyClass.Main()

Program received signal SIGBUS, Bus error.
0x008ea7d5 in mono_decompose_vtype_opts (cfg=0x110b6a0) at decompose.c:1185
1185    decompose.c: No such file or directory.
    in decompose.c
(gdb) where
#0  0x008ea7d5 in mono_decompose_vtype_opts (cfg=0x110b6a0) at decompose.c:1185
#1  0x0089ff00 in mini_method_compile (method=0x181aa94,
opts=64055807, domain=0x5fe70, run_cctors=1, compile_aot=0, parts=0)
at mini.c:12656
#2  0x008a0ba1 in mono_jit_compile_method (method=0x181aa94) at mini.c:13134
#3  0x008a0947 in mono_jit_compile_method (method=0x181a924) at mini.c:13122
#4  0x0091eebd in mono_magic_trampoline (regs=0xbffff7d8, code=0x802b1
"??\f?:", m=0x181a924, tramp=0x0) at mini-trampolines.c:290
#5  0x00025066 in ?? ()
#6  0x00080203 in ?? ()
#7  0x009df9e4 in mono_runtime_exec_main (method=0x1803c64,
args=0x66ea0, exc=0x0) at object.c:3299
#8  0x009e3a17 in mono_runtime_run_main (method=0x1803c64, argc=1,
argv=0xbffff9a8, exc=0x0) at object.c:3084
#9  0x00001fcf in main ()
(gdb) quit
The program is running.  Exit anyway? (y or n) y
phis-macbook-pro:monoTest phi$
</terminal>

gdb output for: struct { char x; int y;}
<terminal>
(gdb) run
Starting program: /Users/phi/workspace/monoTest/a.out
Reading symbols for shared libraries
++++++..............................................................................
done
MyClass.Main()

Program received signal SIGSEGV, Segmentation fault.
0x8fe18c02 in __dyld_misaligned_stack_error ()
(gdb) where
#0  0x8fe18c02 in __dyld_misaligned_stack_error ()
#1  0x00000053 in ?? ()
#2  0x00001f6b in InterOpTest ()
#3  0x000848a5 in ?? ()
#4  0x000802b1 in ?? ()
#5  0x00080203 in ?? ()
#6  0x009df9e4 in mono_runtime_exec_main (method=0x1803c64,
args=0x66ea0, exc=0x0) at object.c:3299
#7  0x009e3a17 in mono_runtime_run_main (method=0x1803c64, argc=1,
argv=0xbffff9a8, exc=0x0) at object.c:3084
#8  0x00001fd1 in main ()
(gdb)
</terminal>

gdb output for: struct { float f; }
<terminal>
gdb) run
Starting program: /Users/phi/workspace/monoTest/a.out
Reading symbols for shared libraries
++++++..............................................................................
done
MyClass.Main()
**
ERROR:mini-x86.c:2020:emit_move_return_value: code should not be reached

Program received signal SIGABRT, Aborted.
0x919d4e42 in __kill ()
(gdb) where
#0  0x919d4e42 in __kill ()
#1  0x919d4e34 in kill$UNIX2003 ()
#2  0x91a4723a in raise ()
#3  0x91a53679 in abort ()
#4  0x00121f74 in g_assertion_message ()
#5  0x0093203a in emit_move_return_value (cfg=0x110bb10, ins=0xadc1ac,
code=0x184302b "") at mini-x86.c:2020
#6  0x009337ce in mono_arch_output_basic_block (cfg=0x110bb10,
bb=0x182457c) at mini-x86.c:2865
#7  0x00866332 in mono_codegen (cfg=0x110bb10) at mini.c:11955
#8  0x0089f4b0 in mini_method_compile (method=0x181aa94,
opts=64055807, domain=0x5fe70, run_cctors=1, compile_aot=0, parts=0)
at mini.c:12807
#9  0x008a0ba1 in mono_jit_compile_method (method=0x181aa94) at mini.c:13134
#10 0x008a0947 in mono_jit_compile_method (method=0x181a924) at mini.c:13122
#11 0x0091eebd in mono_magic_trampoline (regs=0xbffff7d8, code=0x802b1
"??\f?:", m=0x181a924, tramp=0x0) at mini-trampolines.c:290
#12 0x00025066 in ?? ()
#13 0x00080203 in ?? ()
#14 0x009df9e4 in mono_runtime_exec_main (method=0x1803c64,
args=0x66ea0, exc=0x0) at object.c:3299
#15 0x009e3a17 in mono_runtime_run_main (method=0x1803c64, argc=1,
argv=0xbffff9a8, exc=0x0) at object.c:3084
#16 0x00001fce in main ()
(gdb)
</terminal>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: InterOpTest.tar
Type: application/x-tar
Size: 10240 bytes
Desc: not available
Url : http://lists.ximian.com/pipermail/mono-osx/attachments/20090206/d097082e/attachment-0001.tar 


More information about the Mono-osx mailing list