2015-03-05 16 views
7

Zbudowałem aplikację systemów rozproszonych, która intensywnie korzysta z JSON. Aplikacja działa świetnie natywnie w systemie Windows (testowana na 7, 8, 8.1, Server 2008, Server 2012) i Ubuntu 14.04 z MonoNewtonsoft JSON.NET 6.0.8 i Mono na Mac OSX nie udanie się w cudowny sposób

Jednak aplikacja nie działa w sposób chwalebny, gdy próbuję uruchomić go na OS X Yosemite 10.10 .2 (może inne). Wyłączyłem niektóre z połączeń z Newtonsoft JSON.NET i uruchomiłem je w samodzielnej aplikacji piaskownicy i nigdy nie mogę odtworzyć problemu. Wkleiłem poniższe informacje dotyczące debugowania, mając nadzieję, że ktoś zauważy coś na śladzie stosu lub w inny sposób, który może wskazywać na oczywisty 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 

Usunąłem kilka powiązanych z wątkiem danych dla zwięzłości. Pełny tekst można zobaczyć tutaj: https://gist.github.com/jchristn/677c53abc3c3028d804f

Sposób serialize_json jest następujący (dość proste):

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

a wersja Mono:

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 

Ciąg JSON w pytaniu wygląda :

{ 
    "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" 
    } 
    ] 
} 

I jego definicja:

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; } 
} 

To jest na starszym MacBooku Pro, ale ma Core 2 Duo i 8 GB pamięci RAM. Nic nie działa na komputerze.

Próbowano również aktualizacji Mono do 3.12.1 i ma ten sam 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 

Próbowałem również uruchomić w systemie Mono w systemie Windows, a problem nie pojawia się (v3.12.1).

+2

Wątpię, czy ktokolwiek będzie w stanie ci pomóc, nie widząc łańcucha json, który powoduje ten wyjątek. –

+0

Wygląda na wyjątek OutOfMemoryException. Rigth? –

+0

Aktualizowanie ze szczegółami teraz – joelc

Odpowiedz

2

Miałem podobne dziwne doświadczenia w rozwoju iOS. (Wyjątki takie jak ten przy użyciu wielozadaniowość i JSON) znalazłem dodając je do mTouch opcje AOT rozwiązać moje problemy:

nrgctx-trampoliny = 8096, nimt-trampoliny = 8096, ntrampolines = 4048

Szkoda, że ​​nie można pomóżcie (także innym programistom).

+0

Oh. Mój. Bóg. Kocham Cię. To mnie uratowało. Dla porównania uruchomiłem mono - aot = nrgctx-trampolines = 8096, nimt-trampolines = 8096, ntrampolines = 4048 filename.exe, który uruchamia kompilator Ahead of Time, a następnie uruchamiam mój plik wykonywalny za pomocą pliku mono filename.exe. Problem zniknął! Dziękuję bardzo!!! – joelc

Powiązane problemy