ACCESS VIOLATION

Discussion in 'WASM.BEGINNERS' started by dgs, Feb 6, 2009.

  1. dgs

    dgs New Member

    Blog Posts:
    0
    Joined:
    Jun 23, 2008
    Messages:
    434
    Привет всем, собственно вопрос, из-за чего возникает эта ошибка и как предотвратить ACCESS VIOLATION в программе написанной на ассемблере при активной работе с динамическими массивами?
     
  2. Booster

    Booster New Member

    Blog Posts:
    0
    Joined:
    Nov 26, 2004
    Messages:
    4,860
    dgs
    Предотвратить можно просто поставив обработчик этого исключения. :)
     
  3. dgs

    dgs New Member

    Blog Posts:
    0
    Joined:
    Jun 23, 2008
    Messages:
    434
    Хм, этим я не закончу операцию которая обработает данные, зная причину ошибки можно её предотвратить и без SEH.
    Казалось бы простой код:
    Code (Text):
    1. proc CopyMemory dest, src, len
    2.    cld
    3.    mov   esi, [src]
    4.    mov   edi, [dest]
    5.    mov   ecx, [len]
    6.    rep    movsb
    7.    ret
    8. endp
    Парой дает сбой, если в цикле (rep movsb) адрес содержащийся в esi = адресу в edi, ведь тот же ACCESS VIOLATION.

    [add]
    И вот еще заметил что зачастую, эта гадость присущая Delphi заваливает asm программу в ntdll.dll, интересно ваше мнение по этой проблеме...
     
  4. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
    нужно установить права на чтение/запись на всю страницу))))
     
  5. int2e

    int2e New Member

    Blog Posts:
    0
    Joined:
    Jan 9, 2009
    Messages:
    169
    Предотвращается просто
    1. Устанавливаются права на чтение и запись через VirtualProtect
    2. Проверяется память на доступность чтения/записи через IsBadReadPtr/IsBadWritePtr
    3. Пользуйся отладчиком!!! Данный код при правильном использовании вообще не должен вызывать ошибок
     
  6. int2e

    int2e New Member

    Blog Posts:
    0
    Joined:
    Jan 9, 2009
    Messages:
    169
    Если бы делфи умело заливать шелкодесс в нтдлл - ему бы цены не было ))))

    Учи матчасть. В нтдлл срабатывают хардварные брекпоинты, поэтому твой отладчик сперва останавливается где-то в ее недрах
     
  7. agrischuk

    agrischuk New Member

    Blog Posts:
    0
    Joined:
    Jan 12, 2009
    Messages:
    47
    Проблема выше чем этот код. Нужно анализировать стек трейс (порядок вызовов функций и их параметры) совмесно с исходником. И вообще лучше добавь своей проргамме логи: где выделилась память, сколько и что ты с ней делаешь. С хорошими логами тебе отладчик не понадобиться :)
     
  8. dgs

    dgs New Member

    Blog Posts:
    0
    Joined:
    Jun 23, 2008
    Messages:
    434
    Вот это я и хотел узнать. Спасибоint2e.

    Вчера весь вечер просидел в оли, agrischuk прав, логи правда я как-то не заворачивался из проги, делал dump памяти...

    Всем огромное спасибо. Тема закрыта.