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
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]
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Okay, der code macht es offensichtlich.
Zuordnung eines lokalen Arrays auf der C++ Seite, und gibt einen Zeiger auf das. Das sollte schon alle Alarmglocken Klingeln, wenn Sie gewohnt sind zu arbeiten mit native - code-Sie müssen nicht wieder von Zeigern von den einheimischen!
Und dann töten Sie es mit
Marshal.Copy
falsch - anstelle von kopieren der Daten, die Sie von der C++ - code (die möglicherweise fehlerhaft ist, weil Sie die Rückgabe einen Zeiger auf eine lokale...), kopieren Sie die C# - byte-array über den Zeiger, die Sie von der C++ - Funktion - überschreiben Sie die C++ - stack. Boom.Aber ich sehe nicht ein, warum Sie verwenden würden, eine C++ - Bibliothek, die nur zu nennen
ReadProcessMemory
- warum nicht einfach darauf berufen, dass direkt? Ich bin gerade dabei in mein kleines tool an https://github.com/Luaancz/AutoPoke.O okay, danke für die Klärung, was diesen Fehler verursacht hat
Ich hatte die Antwort geschrieben, bevor Hyun gepostet der code, ich wartete nur, um sicher zu sein 😀 Es schien mir zu offensichtlich ein Fehler...
Die
return
gar nicht sooo schockierend... Wenn Sie wollen schockieren, schauen, was gemacht wird, mitAddress
!Weil ich am üben macht-code-interop
InformationsquelleAutor Luaan
Ja, aber Ihr definiert, wie viel Speicher Sie haben.
Wenn Sie genügend Arbeitsspeicher haben, fügen Sie über
Int32.MaxValue
Werte, die brechen würde, dass dieList<T>
Klasse.Kann dies die Ursache einer
OverflowException
.Wenn Sie laufen aus dem Gedächtnis würde ich erwarten, dass ein
OutOfMemoryException
.Die Fehlermeldung, die Sie bekommen ist nicht ein C# Ausnahme, sondern eine C++ - Ausnahme, untersucht diese Frage.
Entweder du hast etwas falsch gemacht in Ihrem C++ - code oder Sie haben nannte es falsch von C#. Beachten Sie, dies ist sehr Verschieden von der ursprünglichen Frage, die ich beantwortet habe.
entweder du hast gebrochen, die CLR-oder Sie haben etwas getan, nicht.
InformationsquelleAutor Jodrell