Newtonsoft JSON.NET 6.0.8 and Mono on Mac OSX fail gloriously

I created a distributed system application that uses JSON heavily. The application works fine on Windows (tested on 7, 8, 8.1, Server 2008, Server 2012) and Ubuntu 14.04 with Mono

However, when you try to run the application on OSX Yosemite 10.10.2 (possibly others), the application does not work in a nice way. I highlighted some of the Newtonsoft JSON.NET calls and run them in a stand-alone isolated application and can never reproduce the problem. I inserted the debug information below in the hope that someone would see something in the stack trace or otherwise, which might indicate an obvious problem.

Stacktrace: at <unknown> <0xffffffff> at (wrapper managed-to-native) object.__icall_wrapper_mono_gc_alloc_vector (intptr,intptr,intptr) <0xffffffff> at (wrapper alloc) object.AllocVector (intptr,intptr) <0xffffffff> at System.Reflection.Emit.DynamicMethod.AddRef (object) <0x00077> at System.Reflection.Emit.DynamicMethodTokenGenerator.GetToken (System.Reflection.MemberInfo,bool) <0x0001b> at System.Reflection.Emit.ILGenerator.Emit (System.Reflection.Emit.OpCode,System.Type) <0x000ee> at Newtonsoft.Json.Utilities.ILGeneratorExtensions.BoxIfNeeded (System.Reflection.Emit.ILGenerator,System.Type) <0x0007a> at Newtonsoft.Json.Utilities.DynamicReflectionDelegateFactory.GenerateCreateGetPropertyIL (System.Reflection.PropertyInfo,System.Reflection.Emit.ILGenerator) <0x0009b> at Newtonsoft.Json.Utilities.DynamicReflectionDelegateFactory.CreateGet<T> (System.Reflection.PropertyInfo) <0x000bf> at Newtonsoft.Json.Utilities.ReflectionDelegateFactory.CreateGet<T> (System.Reflection.MemberInfo) <0x0007d> at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue (object) <0x0003f> at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues (Newtonsoft.Json.JsonWriter,object,Newtonsoft.Json.Serialization.JsonContainerContract,Newtonsoft.Json.Serialization.JsonProperty,Newtonsoft.Json.Serialization.JsonProperty,Newtonsoft.Json.Serialization.JsonContract&,object&) <0x000fe> at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject (Newtonsoft.Json.JsonWriter,object,Newtonsoft.Json.Serialization.JsonObjectContract,Newtonsoft.Json.Serialization.JsonProperty,Newtonsoft.Json.Serialization.JsonContainerContract,Newtonsoft.Json.Serialization.JsonProperty) <0x00197> at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue (Newtonsoft.Json.JsonWriter,object,Newtonsoft.Json.Serialization.JsonContract,Newtonsoft.Json.Serialization.JsonProperty,Newtonsoft.Json.Serialization.JsonContainerContract,Newtonsoft.Json.Serialization.JsonProperty) <0x0015f> at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize (Newtonsoft.Json.JsonWriter,object,System.Type) <0x000bf> at Newtonsoft.Json.JsonSerializer.SerializeInternal (Newtonsoft.Json.JsonWriter,object,System.Type) <0x0053b> at Newtonsoft.Json.JsonSerializer.Serialize (Newtonsoft.Json.JsonWriter,object,System.Type) <0x00019> at Newtonsoft.Json.JsonConvert.SerializeObjectInternal (object,System.Type,Newtonsoft.Json.JsonSerializer) <0x000e7> at Newtonsoft.Json.JsonConvert.SerializeObject (object,System.Type,Newtonsoft.Json.Formatting,Newtonsoft.Json.JsonSerializerSettings) <0x0003f> at Newtonsoft.Json.JsonConvert.SerializeObject (object,Newtonsoft.Json.Formatting,Newtonsoft.Json.JsonSerializerSettings) <0x00017> at kvpbase.kvpserver.serialize_json (object) <0x000e7> at kvpbase.kvpserver.obj_write (System.Net.HttpListenerContext,kvpbase.request_metadata,kvpbase.obj) <0x01bd7> at kvpbase.kvpserver.put_handler (System.Net.HttpListenerContext,kvpbase.request_metadata) <0x00f4f> at kvpbase.kvpserver.user_api (System.Net.HttpListenerContext,kvpbase.request_metadata) <0x0062f> at kvpbase.kvpserver.processor (System.Net.HttpListenerContext,kvpbase.http_request) <0x0103b> at kvpbase.kvpserver.conn_handler (System.IAsyncResult) <0x005a7> at System.Net.ListenerAsyncResult.InvokeCallback (object) <0x00051> at (wrapper runtime-invoke) <Module>.runtime_invoke_void__this___object (object,intptr,intptr,intptr) <0xffffffff> Native stacktrace: Debug info from gdb: (lldb) command source -s 0 '/tmp/mono-gdb-commands.1s6ayI' Executing commands in '/private/tmp/mono-gdb-commands.1s6ayI'. (lldb) process attach --pid 4136 Process 4136 stopped Executable module set to "/usr/bin/mono". Architecture set to: i386-apple-macosx. (lldb) thread list Process 4136 stopped 

I removed a bunch of data stream related ones for short. The full text can be seen here: https://gist.github.com/jchristn/677c53abc3c3028d804f

The serialize_json method looks like this (pretty simple):

 public static string serialize_json(object obj) { return JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings { }); } 

And the Mono version:

 sh-3.2# mono --version Mono JIT compiler version 3.10.0 ((detached/e204655 Mon Oct 13 08:50:28 EDT 2014) Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com TLS: normal SIGSEGV: altstack Notification: kqueue Architecture: x86 Disabled: none Misc: softdebug LLVM: yes(3.4svn-mono-(detached/e656cac) GC: sgen 

The corresponding JSON string looks like this:

 { "url": "http://localhost/root/home/foo", "user_guid": "root", "container_name": "home", "size": 3259, "num_objects": 1, "container_path": [], "child_containers": [ "abcd", "foo", "large-dir" ], "obj_metadata": [ { "key": "foo", "size": 3259, "created": "2014-10-24T07:44:24.5773422Z", "last_update": "2014-10-24T07:44:24.5773422Z", "last_access": "2014-10-24T07:44:24.5773422Z" } ] } 

And its definition:

 public class dir_info { public string url { get; set; } public string user_guid { get; set; } public string container_name { get; set; } public long size { get; set; } public int num_objects { get; set; } public List<string> container_path { get; set; } public List<string> child_containers { get; set; } public List<obj_info> obj_metadata { get; set; } } 

This is an older Macbook Pro, but it has a Core 2 Duo and 8 GB of RAM. Nothing else works on the machine.

Also tried updating Mono to 3.12.1, and it has the same problem.

 sh-3.2# which mono /usr/bin/mono sh-3.2# mono --version Mono JIT compiler version 3.12.1 ((detached/b7764aa Fri Mar 6 15:32:47 EST 2015) Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com TLS: normal SIGSEGV: altstack Notification: kqueue Architecture: x86 Disabled: none Misc: softdebug LLVM: yes(3.6.0svn-mono-(detached/5486eb2) GC: sgen 

I also tried working in Mono on Windows, and the problem does not appear (v3.12.1).

+7
c # mono
source share
1 answer

I had some similar weird impressions of iOS development. (Exceptions like this when using multitasking and JSON) I found that adding these parameters to mtouch AOT resolved my problems:

nrgctx trampolines = 8096, nimt trampolines = 8096, = 4048 ntrampolines

Wish it helped you (and possibly other developers).

+2
source share

All Articles