Определить где и когда нарушается память

Тема в разделе "WASM.LANGS", создана пользователем Llirik, 16 июл 2024.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Код более пяти тысяч строк. LocalFree вылетает с кодом 0xC0000374 (STATUS_HEAP_CORRUPTION), хотя при вызове LocalFree данные по указателю выглядят неповреждёнными. Прошёлся отладчиком по подозрительным местам, но так ничего и не удалось найти, код слишком большой и сложный... Подскажите, пожалуйста, как можно вычислить данную ошибку. Разделить код не предлагать) Это невозможно. Уберёшь хоть одну строчку и работа всех пяти тысяч строк нарушится.
    P.S. LocalFree вылетает только при очень сложных вычислениях. При относительно простых работает нормально
     
  2. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    155
    Сделай обертки для функций работы с памятью по примеру
    https://github.com/babasuck/baselib/blob/main/src/antileak/antileak.c
    Код (Text):
    1.     #define malloc(n) antileak_malloc(n, __FILE__, __LINE__)
    2.     #define realloc(p, n) realloc_free(p, n, __FILE__, __LINE__)
    3.     #define free(p) antileak_free(p, __FILE__, __LINE__)
     
    alex_dz, Rel и Mikl___ нравится это.
  3. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    443
    проверка на 0/NULL в free - точно надо печатать?

    it is perfectly safe to pass a NULL pointer to the free() function in C. According to the C standard, if the pointer passed to free() is NULL, no action is taken
    This means you don't need to check if the pointer is NULL before calling free();
    doing so would just add unnecessary code.
    --- Сообщение объединено, 16 июл 2024 ---
    и еще вопрос - как насчет поддетжки МТ?
    глобально
    int malloc_sum = 0, free_sum = 0;
    не есть айс...
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    На твои данные системе пофиг. Сообщение "куча повреждена" выводится, когда портятся служебные данные перед или после выделенного тобой блока. Переполнение буфера у тебя, короче, перепроверяй расчеты размеров при выделениях памяти (вангую, где-то +1 к длине забыл добавить для строки).
     
  5. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.455
    Адрес:
    Россия, Нижний Новгород
  6. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    да, хоть мульОН строк - под отладчиком bt (backtrace) и будет Тебе счастье :)
     
  7. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Так я использую структуры и обращаюсь только к её членам так, что простое переполнение буфера исключено.
    И что?:) Я знаю что повреждается, я даже выяснил, когда примерно это происходит, но я не могу понять как и почему.
    Ладно.... Мои отладочные кода обнаружили ошибку в другом месте моей формулы. Исправлю пока её. Может та сама пройдёт:) Хотя вряд ли..... Тогда воспользуюсь некоторыми советами. озвученными тут.
     
  8. Win32Api

    Win32Api Member

    Публикаций:
    0
    Регистрация:
    16 окт 2022
    Сообщения:
    109
    Где то здесь и надо +1 к удлинению члена
    Очень сложный код походу
     
    Последнее редактирование: 17 июл 2024
  9. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    443
    mantissa

    VS еще маркеров добавляет впереди и сзади и потом из чекает
    аля

    вместо
    Код (C++):
    1. typedef struct MemoryBlock {
    2.     size_t size;
    3.     char data[];
    4. } MemoryBlock;
    Код (C++):
    1. typedef struct MemoryBlock {
    2.     uint32_t  marker_before;
    3.     size_t size;
    4.     char data[];
    5.    uint32_t  marker_after
    6. } MemoryBlock;
     
  10. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Может такое быть что где-то по ошибке вместо sizeof(struct) написал sizeof(struct*)
     
  11. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    155
    Служебные данные в размер size_t size не входят, поэтому пофиг + fam data[] должен быть последним членом структуры.
     
  12. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    да, челу предлагали его тут показать, но он не хочет нас травмировать своей гениальностью :)
     
  13. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Оказывается пишется в уже освобождённую память. Даже умудрилось миновать это:
    Код (Text):
    1. VOID LocalFreeStopWrite(HLOCAL hMem)
    2. {
    3. PVOID Mem;
    4. _asm{ mov rax, hMem
    5.     mov rcx, qword ptr [rax]
    6.     mov Mem, rcx
    7.     mov qword ptr [rax], 0
    8.    }
    9. }
    :)
    Теперь осталось понять, где именно не убирается в двухсвязном списке указатель на освобождённую память, но это уже дело техники:)
     
    Mikl___ и Win32Api нравится это.