I've built a distributed systems application that makes heavy use of JSON. The app runs great natively on Windows (tested on 7, 8, 8.1, Server 2008, Server 2012) and Ubuntu 14.04 with Mono
However, the app fails in a glorious manner when I attempt to run it on OSX Yosemite 10.10.2 (maybe others). I've isolated some of the calls to Newtonsoft JSON.NET and run them in a standalone sandboxed app and can never reproduce the issue. I've pasted the debug information below in hopes that someone sees something in the stack trace or otherwise that might point to 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 thread-related data for brevity. The full text can be seen here: https://gist.github.com/jchristn/677c53abc3c3028d804f
The serialize_json method is as follows (quite 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 JSON string in question looks like:
{
"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 on an older Macbook Pro, but it has a Core 2 Duo and 8GB of RAM. There is nothing else running on the machine.
Also tried updating Mono to 3.12.1 and it has the same issue.
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've also tried running within Mono on Windows and the issue does not appear (v3.12.1).
Yet Newtonsoft. Json was basically scrapped by Microsoft with the coming of . NET Core 3.0 in favor of its newer offering designed for better performance, System. Text.
Correct, JsonSerializer is threadsafe. No state is shared while serializing but if you change a setting on the JsonSerializer while in the middle of serializing an object then those will automatically be used.
Use the Newtonsoft. Json; To build and run the app, press F5 or select Debug > Start Debugging. Select the Click Me button to see the contents of the TextBlock object replaced with JSON text.
Json.NET is open source software and is completely free for commercial use.
I had some similar strange experiences on iOS development. (Exceptions like this when using multitasking and JSON) I have found adding these to mtouch AOT options resolved my problems:
nrgctx-trampolines=8096,nimt-trampolines=8096,ntrampolines=4048
Wish it can help you (and maybe other developers) too.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With