2009-12-25 36 views
9

chciałem przetestować Mono AOT, więc napisałem prostą aplikację konsoli z MonoDevelop:Mono AOT Segmentacja błędów - dziwny problem

using System; 

namespace abc 
{ 
    public class Program 
    { 
     public static void Main() 
     { 
      Console.WriteLine("Hello World!"); 
     } 
    } 
} 

on tworzony plik o nazwie "abc.exe" w bin/debugowania. Kiedy próbuję zrobić:

mono abc.exe 

zadziałało. Więc próbowałem to ZNACZYĆ. Zrobiłem:

mono --aot abc.exe 

stworzyło mi plik o nazwie abc.exe.so. Kiedy próbuję go uruchomić, generuje błąd "Błąd segmentacji (rdzeń porzucony)". Oto wyjście mono - a:

Code: 51 Info: 5 Ex Info: 8 Unwind Info: 31 Class Info: 30 PLT: 2 GOT Info: 11 GOT Info Offsets: 16 GOT: 20 Offsets: 48 
Compiled 2 out of 3 methods (66%) 
1 methods have other problems (33%) 
Methods without GOT slots: 1 (33%) 
Direct calls: 0 (100%) 
JIT time: 1 ms, Generation time: 0 ms, Assembly+Link time: 0 ms. 

Jak mogę to naprawić?

Dzięki.

Odpowiedz

7

To, co skolima powiedziała, było słuszne, to dość dziwne, że został poddany pod głosowanie.

Nie należy używać bezpośrednio danych wyjściowych generowanych przez kompilator AOT Mono.

Kompilacja AOT Mono jest procesem, który buforuje wyjście kompilacji JIT i pozostawia je w bibliotece współdzielonej, która jest ładowana przez środowisko wykonawcze Mono na żądanie. Wygenerowany plik .so zawiera wstępnie skompilowany kod i metadane niezbędne do wykorzystania przez środowisko wykonawcze.

Aby użyć pliku AOT, wystarczy powołać swój program tak:

mono program.exe

Mono załaduje metadane z program.exe i sondy do istnienia program.exe. aby uniknąć kompilowania w czasie rzeczywistym, a zamiast tego użyj kodu z pliku .so. Ten sam proces jest stosowany do wszystkich przywoływanych bibliotek.

Nawet pełna kompilacja Mono generuje kod, który wymaga oryginalnego pliku .exe.

Jeśli chcesz osiągnąć natywny plik wykonywalny, możesz wypróbować komendę mkbundle, która pakuje środowisko wykonawcze Mono i twój program do jednego pliku wykonywalnego.

1

Jakie jest Twoje środowisko i wersja Mono?

Funkcja AOT działa tylko w systemach x86, x86-64 i ARM, a tylko w systemie Linux i może na Macu.

Jeśli korzystasz z jednej z tych platform i najnowszej wersji Mono (2.6), brzmi to jak błąd, który prawdopodobnie powinien zostać zgłoszony na http://www.mono-project.com/Bugs.

5

Nie należy uruchamiać wyjściowego pliku .so, wystarczy uruchomić mono na oryginalnym zarządzanym pliku .exe, aby automatycznie pobrać plik AOT.

Powiązane problemy