Что за ошибка 1309

Тема в разделе "WASM.BEGINNERS", создана пользователем strange2007, 11 окт 2011.

  1. strange2007

    strange2007 New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2010
    Сообщения:
    126
    Добрый день, спецы асма. Столкнулся с проблемой и не могу решить. Есть освобождение памяти:
    push edi
    call GlobalFree
    call GetLastError
    Если после этого опять выделить память, то вываливается все в ошибку. В edi хэндл памяти, проверял. GetLastError показывает ошибку 1309 "Предпринята попытка использования элемента олицетворения потоком команд, который в данное время не олицетворяет клиента." Не могу понять смысла ошибки. Что они хотели этим сказать?
    Может кто сталкивался? Подскажите, пожалуйста?

    Спасибо
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    1) GetLastError IMHO выдает не ошибку в последнем вызове, а в последнем вызове, где была ошибка.
    2) По приведенному исходнику ничего непонятно. На какой вызов выдается 1309?

    А экстрасенсы из гугла мне подсказали : возможно ты пытаешься освободить залоченный или чужой "элемент".
     
  3. strange2007

    strange2007 New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2010
    Сообщения:
    126
    Я выделяю память, с ней работаю, потом пытаюсь освободить. В edi дескриптор памяти. Создаю память вот так
    push 32
    push GMEM_FIXED or GMEM_ZEROINIT
    call GlobalAlloc
    потом пытаюсь освободить
    push edi ; дескриптор памяти
    call GlobalFree
    и вот если после этого опять выделяю память, то система уходит в ошибку, при чем ту, которую сама не может обработать. Т.е. вызываю очередной GlobalAlloc и обратно управление не передается. Методом научного тыка я нашел, что убрав последнее освобождение исчезает ошибка. Поэтому вставил после освобождения GetLastError
    Может как-то по другому искать? Дело в том, что у меня много мест, где идет освобождение, но именно это не правильное. В edi дескриптор, сам проверил несколько раз. Уже не знаю куда копать.
    Может знаете как можно залочить дескриптор?
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    edi после возврата из GlobalAlloc до вызова GlobalFree не меняется?
     
  5. strange2007

    strange2007 New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2010
    Сообщения:
    126
    Нет. Оно в памяти сохраняется.
    Скажите, а такое возможно, если подменено? Правда? Если да, тогда полез анализировать свой код
     
  6. strange2007

    strange2007 New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2010
    Сообщения:
    126
    Нашел. Спасибо всем. Что было:
    После освобождения памяти, я обнулял ячейку памяти способом
    mov dword ptr [edi], 0
    Т.е. присваивал 0000 в не мою память. Вот же какая засада то...
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
  8. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    strange2007
    Вот поэтому надо осваивать отладчик. Он бы тебе показал место ошибки...
     
  9. strange2007

    strange2007 New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2010
    Сообщения:
    126
    Я отладчиками пользуюсь. Честно. Оля и софтайс для разных случаев. Другой вопрос подобный баг трудно найти, у меня сложная иерархия дескрипторов в виде деревьев и списков.
    Отладчик показал, что не может выйти из системного вызова. А где он и почему не смог выйти я не знаю, это для меня пока темный лес
     
  10. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    valterg
    ИМХО, любой успешный вызов ф-ии, которая использует GetLastError устанавливает код ошибки ERROR_SUCCES
     
  11. takerZ

    takerZ New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2008
    Сообщения:
    18
    банальное повреждение кучи. ищите переполнения и все похожее выше по коду.
     
  12. strange2007

    strange2007 New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2010
    Сообщения:
    126
    Спасибо всем, я нашел причину. Запутался в алгоритме (плохо разрисовал его на схемах) и писал ноль в освобожденную память, а надо было просто обнулить мою переменную