2011-09-27 6 views
11

Występuje uszkodzenie kopert w moim zarządzanym programie wielowątkowym. Wykonując niektóre testy stwierdziłem, że korupcja dzieje się tylko wtedy, gdy wątki tła są aktywne w programie (można je przełączać). W wątkach używane są składniki innych firm..NET 4: Czy sam kod zarządzany może spowodować uszkodzenie sterty?

Po zbadaniu kodu wątków i 3 elementów zewnętrznych (z .NET Reflector) Okazało się, że wszystkie one są zarządzane, to znaczy nr „niebezpieczne” lub „DllImportAttribute” lub „P/Invoke”. Wydaje się, że czysto zarządzany kod powoduje uszkodzenie sterty, czy to możliwe?

UPDATE

Oprócz korzystania klasy Marshal, możliwe jest uszkodzenie sterty z wątków nie są prawidłowo zsynchronizowane? Przykład byłby bardzo doceniany.

+2

Tylko dlatego, że są one wszystko zarządzane, nie oznacza, że ​​wszystko jest bezpieczne dla wątków. Czy upewniasz się, że kod wykonuje się w sposób bezpieczny dla wątków, używając zamków, itp. W razie potrzeby? –

+0

Istnieją również metody klasy Marshal, które mogą to zrobić. –

+2

@ChrisDunaway, czy mówisz, że niewłaściwe blokowanie lub wykonywanie wątków w sposób bezpieczny dla wątków może uszkodzić stertę nawet bez użycia klasy Marshal? Miałem odpowiedź, że nie jest to możliwe ([tutaj] (http://stackoverflow.com/questions/7471288/what-tools-are-available-to-detect-heap-corruption-in-net-c-program/ 7471468 # 7471468)). –

Odpowiedz

12

Zdecydowanie można uszkodzić stertę bez użycia niebezpiecznego kodu. Klasa Marszałek jest Twój przyjaciel/wróg tutaj

IntPtr ptr = new IntPtr(50000); // Random memory 
byte[] b = new byte[100]; 
Marshalp.Copy(b, 0, ptr, 100); 

To skutecznie kopiuje 100 kolejnych 0 na język hałdy pod adresem 50000.

Innym sposobem jest z wyraźnymi struct układów

[StructLayout(LayoutKind.Explicit)] 
struct S1 
{ 
    [FieldOffset(0)] 
    internal string str; 

    [FieldOffset(0)] 
    internal object obj; 
} 

S1 s = new S1(); 
s.obj = new Program(); 
s.str.Trim(); // Hope that works ... :) 
+0

Re. structs, common '[StructLayout (LayoutKind.Sequential)]' nie spowoduje uszkodzenia sterty, prawda? –

+0

@net_prog no, 'LayoutKind.Explicit' jest potrzebny do tego triku do pracy/awarii :) – JaredPar

+0

@net_prog w * ogólnym * nie jest możliwe, aby kod zarządzany mógł uszkodzić stertę. To tylko kilka ... skrajnych przypadków, które mogą spowodować. Jest * możliwe * jakkolwiek nieprawdopodobne, że trafiłeś błąd CLR. – JaredPar

Powiązane problemy