c # — Почему мой код Interop выбрасывает & quot; Инструментальный код cookie стека обнаружил переполнение буфера на основе стека & quot; исключение?

Так как я немного возился с чтением памяти и т. Д. И т. Д. И я сделал массивы byte [] с 1000000 элементами, чтобы они хранили по 1 МБ данных каждый. Я использовал около 750 элементов из этого массива 1000000 элементов, который добавлял один за другим, когда извлекал данные, например: получить МБ памяти, добавить в список, получить следующий МБ. Но это просто не удалось с исключением переполнения. Итак, существует ли фактическое ограничение на количество элементов, которое может содержать Список, или существует ли ограничение на «данные» для Списка? Если бы я не перешагнул этот предел, что могло вызвать возникновение этой проблемы?

РЕДАКТИРОВАТЬ: Скриншот исключения
введите описание изображения здесь

EDIT2: я вызываю функцию из dll c ++, которая читает следующие 1 МБ и возвращает указатель на этот массив

EDIT3:
Часть C #

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

обертка

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

часть C ++
файл .cpp

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

.ч файл

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

EDIT4: Спасибо за все идеи и быстрые ответы, ребята (и девушки, если они там: S)

EDIT5: все исправлено и программа запущена
[! [введите описание изображения здесь] [2]] [2]

1

Решение

Хорошо, код делает это очевидным.

Вы размещаете локальный массив на стороне C ++ и возвращаете указатель на это. Это должно уже прозвучать, если вы привыкли работать с собственным кодом — вы не возвращаете указатели местным жителям!

И тогда вы убиваете его с помощью Marshal.Copy неправильно — вместо копирования из данных, которые вы получаете из кода C ++ (который, возможно, искажен, потому что вы возвращаете указатель на локальный …), вы копируете байтовый массив C # в указатель, полученный из C ++ функция — перезапись стека C ++. Boom.

Тем не менее, я не понимаю, почему вы используете библиотеку C ++ только для вызова ReadProcessMemory — почему бы просто не ссылаться на это напрямую? Я делаю это в моем маленьком инструменте в https://github.com/Luaancz/AutoPoke.

2

Другие решения

Да, но это определяется тем, сколько у вас памяти.

Если у вас достаточно памяти, чтобы добавить Int32.MaxValue значения, которые это сломало бы List<T> учебный класс.

Это может быть причиной OverflowException.

Если у вас заканчивается память, я ожидаю OutOfMemoryException.


Ошибка, которую вы получаете, является не исключением C #, а скорее исключением C ++, исследован в этом вопросе.

Либо вы сделали что-то не так в своем коде C ++, либо неправильно назвали это из C #. Обратите внимание, это очень отличается от первоначального вопроса, на который, я думаю, я ответил.

1

По вопросам рекламы [email protected]