Вопрос знатокам Delphi и/или ассемблера - EAccessViolation read of address FFFFFFFA

программирование Delphi делфи assembler ассемблер

Программа (довольно большая) в одно и то же время, после одного и того же действия выдает эту ошибку: http://plasmon.rghost.ru/52923701/image.png

Ошибка возникает на последней строчке одной большой функции. Не зависимо, что это за строчка. При отладке, когда выполняю программу по шагам это выглядит так - за 3 строчки до конца функции все идеально, за 2 все идеально, на последней строчке перед "end;" тоже все идеально, на следующем шаге ошибка.

Меня в ошибке смущает адрес FFFFFFFA - может там что-то где-то упирается в потолок памяти? Как это проверить и отладить, исправить? Из-за чего вообще эта ошибка возникает? Я гуглил - не помогло.


Werewolf_, прошелся в окне cpu, но так и не понял, в чем там проблема. Ошибка вылетает при вызове блока LStrClr. Я так понимаю это значит, что программа пытается освободить динамическую память. Вот как выглядит строчка на которой возникает ошибка
http://rghost.ru/52936734/image.png
А вот на какой строчке ошибка в самой процедуре LStrClr
http://rghost.ru/52936738/image.png


Я так понимаю, в регистр еах записывается адрес переменной, память которой надо освободить с помощью LStrClr, но непонятно, как мне из этой информации понять, что это за проблемная переменная...

Примечание:
tch74, да смысл в коде? В проекте тысячи, а может и десятки тысяч строк, в данной процедуре больше тысячи строк, а ошибка возникает после последней строчке процедуры. Вне зависимости от того, что это за строка - я вставлял разные другие строчки в конец процедуры и всегда ошибка на последней инструкции в процедуре, какой бы эта инструкция не было.

>>Ищите в своем коде указатель, который вместо адреса строки содержит мусор.

Да я бы с радостью, если бы не тысячи строк и переменных. Есть ли какие-то подсказки или способы, чтобы сузить круг поисков?
Ответы:
mov ecx, [edx+$08] - это обращение к неинициализированной памяти, судя по всему это массив с началом по адресу хранящемуся в регистре edx, цифра - это смещение от начала участка памяти. Ищите в своем коде указатель, который вместо адреса строки содержит мусор.
Собственно в таких случаях выкладывается код на ЯВУ, потому как из куска ассемблерного кода можно только лишь заключить, что в коде ошибка - обращение к неинициализорованному участку памяти (но это вы и так знаете).
ответил по ссылке


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.