[Mono-dev] Unable to call methods on managed objects while running Mono on the iPhone

Peter Moberg peter.moberg at gmail.com
Mon Feb 23 09:01:12 EST 2009


Hi,

got it to work! I forgot that I had to undefine the "HAVE_MMAP". Seems  
like that call doesn't work (but doesn't complain either) on the  
iPhone. After doing that I was able to call the ToString on the  
Exception class and retrieve the string back just fine!


On Feb 23, 2009, at 5:12 AM, Zoltan Varga wrote:

> Hi,
>
>  You have to compile your AOT code using --aot=full, and run the  
> runtime using
> the --full-aot option. When embedding, the later can be achieved by  
> setting the
> mono_aot_only variable to TRUE _before_ calling mono_jit_init ().
>
>                Zoltan
>
> On Mon, Feb 23, 2009 at 6:07 AM, mobbe <peter.moberg at gmail.com> wrote:
>>
>> An update on this one...I found a setting in XCode that said   
>> "Compile for
>> Thumb" and that one was set to true. I unchecked it and recompiled
>> everything and now the code doesn't stop at the same position  
>> anymore...now
>> I get an EXC_BAD_ACCESS on the get_hazardous_pointer...so I am  
>> still not
>> there but at least I cleared the hurdle I first posted about. Since  
>> thumb
>> instructions are 16 bits and ARM mode are 32 bits things must have  
>> not been
>> aligned properly and hence the BAD_INSTRUCTION exceptions. This is  
>> the call
>> stack right now...
>>
>> #0      0x0007e0cc in get_hazardous_pointer at domain.c:276
>> #1      0x0007e4e8 in mono_jit_info_table_find at domain.c:370
>> #2      0x0020f17c in mono_get_generic_context_from_code at
>> mini-generic-sharing.c:26
>> #3      0x0020f5a8 in mono_convert_imt_slot_to_vtable_slot at
>> mini-trampolines.c:47
>> #4      0x0021044c in mono_magic_trampoline at mini-trampolines.c:348
>> #5      0x03904524 in method_order_end
>>
>> I guess my next step is to research my hazardous_pointers....
>>
>>
>>
>> mobbe wrote:
>>>
>>> Over the past couple of weeks I have been working with getting the  
>>> Mono
>>> framework up and running on the iPhone and I am darn close to have  
>>> it all
>>> working.. .I have been able to get the AOT compilation to work and  
>>> was
>>> able this morning to startup Mono in full aot mode on the device.  
>>> Big
>>> thanks to Zoltan Varga for helping me through all the roadblocks I  
>>> ran
>>> into.  I have been working with a SVN HEAD version that I updated  
>>> last
>>> week sometime.
>>>
>>> Next step I took was to try to invoke some methods on classes in the
>>> msorlib assembly to see if I could execute managed code and this  
>>> is where
>>> I ran into a new road block..
>>>
>>> It looks like I am only able to execute .ctor methods!? During the  
>>> startup
>>> of Mono it creates a few exceptions (OutOfMemoryException etc..)  
>>> and it
>>> invokes its constructor method and passes in parameters. This  
>>> works just
>>> fine...and here it is executing managed code.
>>>
>>> However, I tried to execute the ToString() method on an instance  
>>> of the
>>> Exception class and then the program is interrupted and stopped in  
>>> the
>>> prolog for the function mono_get_lmf_addr.. if I continue to run the
>>> program
>>> I get a BAD_INSTRUCTION message and the whole thing shuts down...
>>>
>>> Here is the code I am trying to execute...
>>>
>>> MonoDomain * domain = mono_jit_init("");
>>> MonoAssembly* msCorlib = mono_domain_assembly_open  
>>> (domain,"mscorlib");
>>> MonoImage* image = mono_assembly_get_image(msCorlib);
>>>
>>> MonoClass *klass = mono_class_from_name (image, "System",  
>>> "Exception");
>>> MonoObject* o = mono_object_new (domain, klass);
>>>
>>> MonoMethodDesc* methodDesc =
>>> mono_method_desc_new("System.Object:ToString", TRUE);
>>> MonoMethod* toStringMethod =  
>>> mono_method_desc_search_in_class(methodDesc,
>>> klass);
>>> MonoObject* result = mono_runtime_invoke(toStringMethod, o, NULL,  
>>> NULL);
>>>
>>>
>>> I don't know if it would help you but here is the assembly where  
>>> it all
>>> stops...
>>> mono_get_lmf_addr
>>> 0x001d5bdc  <+0000>  push {r4, r5, r7, lr}
>>> 0x001d5bde  <+0002>  add r7, sp, #8
>>> 0x001d5be0  <+0004>  sub sp, #12 <-- stops here
>>> 0x001d5be2  <+0006>  ldr r3, [pc, #76] (0x1d5c30
>>> <mono_get_lmf_addr+84>)
>>> 0x001d5be4  <+0008>  add r3, pc
>>> 0x001d5be6  <+0010>  ldr r3, [r3, #0]
>>> 0x001d5be8  <+0012>  adds r0, r3, #0
>>> 0x001d5bea  <+0014>  bl 0x3e640 <TlsGetValue>
>>>
>>> I get the same problem if I try to run other methods on other  
>>> objects or
>>> static methods as well...Only constructor methods seems to work.
>>>
>>> It looks to me that the stack isn't setup properly since it always  
>>> throws
>>> the EXC_BAD_INSTRUCTION when trying to access the stack pointer.
>>>
>>> I have been banging my head against this problem for two days and  
>>> right
>>> now I am not able to figure out how to troubleshoot this. If there  
>>> is
>>> anyone out there that have any suggestion on how I should go about
>>> troubleshooting this I would really appreciate it. It stings a bit  
>>> to come
>>> this close and not be able to cross the finish line...
>>>
>>>
>>> Thanks,
>>>
>>>
>>
>> --
>> View this message in context: http://www.nabble.com/Unable-to-call-methods-on-managed-objects-while-running-Mono-on-the-iPhone-tp22155202p22155556.html
>> Sent from the Mono - Dev mailing list archive at Nabble.com.
>>
>> _______________________________________________
>> Mono-devel-list mailing list
>> Mono-devel-list at lists.ximian.com
>> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>>



More information about the Mono-devel-list mailing list