Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Newtonsoft JSON.NET 6.0.8 and Mono on Mac OSX fails in glorious manner

Tags:

c#

json.net

mono

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).

like image 405
joelc Avatar asked Mar 05 '15 02:03

joelc


People also ask

Is Newtonsoft JSON still supported?

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.

Is Newtonsoft JsonSerializer thread safe?

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.

How do I use Newtonsoft JSON?

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.

Is Newtonsoft JSON free?

Json.NET is open source software and is completely free for commercial use.


1 Answers

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.

like image 136
Mostafa Aghajani Avatar answered Sep 27 '22 22:09

Mostafa Aghajani