Warum funktioniert mein Interop-code throw "Stack-cookie instrumentation code erkannt, dass eine stack-basierte Pufferüberlauf -" Ausnahme?

Da ich Durcheinander ein wenig um mit dem Speicher zu Lesen etc etc. Und ich habe die byte [] - arrays mit 1000000 Elementen, so dass Sie Speicher 1 MB Daten jedes. Ich aufgewickelt mit rund 750-isch von diesen 1000000 element array, welches ich Hinzugefügt eins nach dem anderen, wenn ich die abgerufenen Daten, wie zB: get MB Speicher, zur Liste hinzufügen, erhalten Sie im nächsten MB. Aber es ist einfach nicht mit einem overflow-exception. So gibt es eine tatsächliche Grenze, wie viel Elemente, die eine Liste enthalten kann, oder gibt es einen "data" - limit auf der Liste? Wenn ich nicht über diese Grenze, was verursacht haben könnte dieses problem auftreten?

EDIT: Screenshot der Ausnahme
Warum funktioniert mein Interop-code throw

EDIT2: ich rufe eine Funktion in einer c++ - dll, die liest die nächste 1MB und gibt einen Zeiger auf das array

EDIT3:
C# - Teil

    private static void FetchNextBuffer()
    {
        IntPtr pRaw = Wrapper.GetNextMB();
        byte[] buff = new byte[1000000];
        Marshal.Copy(buff, 0, pRaw, 1000000);
        RawDataFetch.Add(buff);
    }

wrapper

[DllImport("Dumper.dll")]
public static extern IntPtr GetNextMB();

c++ - Teil
.cpp-Datei, die

extern byte * __cdecl GetNextMB()
{
    if (!VarsSet) SetVars();
    byte buffer[1000000];
    ReadProcessMemory(pHandle, (void*)Address, &buffer, sizeof(buffer), 0);
    Address = Address + sizeof(buffer);
    return buffer;
}

.h-Datei

extern "C"
{
    __declspec(dllexport) DWORD __cdecl GetPID();
    __declspec(dllexport)  byte * __cdecl GetNextMB();
}

EDIT4: vielen Dank für die vielen Einblicke und die schnelle Antwort Jungs (und Mädchen, wenn Sie draußen sind :S)

EDIT5: alle jetzt behoben und das Programm läuft
[![enter Bild Beschreibung hier][2]][2]

Könnten Sie die post-code und die genaue exception-Typ?
Die List<byte[]> Objekt ist nicht das problem hier - es werden die Speicher du bist die Zuteilung für alle die einzelnen byte-arrays. Und ja, wenn Sie run out of memory, schließlich erhalten Sie eine Ausnahme...
Was machst du genau? Das ist nicht die Art von Ausnahme, die Sie jemals sehen sollte, die in verwaltetem code. Sind Sie mit unsicheren code? Oder P/Aufruft?
Diese Ausnahme ist nicht durch die out-of-memory-Probleme, es ist, weil der stack-Korruption problem. Sind Sie dem Aufruf nicht verwalteter code?
NÖ, keine Begrenzung der verwalteten Seite. Du bist wahrscheinlich tun etwas schrecklich unsicher und schließlich überschreiben Sie etwas, was Sie nicht sollte. Vielleicht bist du mit dem falschen Aufruf-Konventionen beim Aufruf des C++ - Funktion, oder du bist übergabe von Zeigern, die nicht fixiert, oder Sie erwarten, dass der Anruf übergeben Sie einen Verweis auf Ihre byte[] (es ist nicht - es kopiert das array über) - Aufruf nativer code ist alles andere als einfach. Pflege um Ihren code und die definition der Zuordnung Funktion in C# und C++?

InformationsquelleAutor | 2015-08-05

Schreibe einen Kommentar