Почему делфи не запускает программу

. when altering one’s mind becomes as easy as programming a computer, what does it mean to be human.

22 мая 2017 г.

Дело о зависании Delphi 7

Очередное детективное расследование. В этот раз мы разбираемся, почему Delphi 7 наглухо виснет при старте.

К нам (в техподдержку EurekaLog) поступил очередной запрос, который касался Delphi 7. Для его решения мне требовалось запустить проект клиента в Delphi 7. Однако, когда я запустил Delphi 7 в нашей тестовой виртуальной машине (на Windows 10 Creators Update) — она зависла при старте. Висит сплэш-скрин, грузится процессор, ничего не происходит.

Таким образом, прежде чем решать проблему с клиентом, нужно решить проблему с самой Delphi 7.

Я проверил, что Delphi 6 и Delphi 2005 (ближайшие смежные соседи Delphi 7) запускаются отлично. Не так давно система Windows 10 на тестовой виртуальной машине была обновлена до Creators Update, что (в очередной раз) сломало регистрацию Delphi 6 (похоже, она привязывается к сборке ОС?). Возможно, что что-то случилось и с Delphi 7?

Настройка драйвера устройства Delphi DS150e, Autocom CDP+

Быстрое гугление по симптомам (Delphi 7 hangs on Windows 10 Creators Update) не принесло результатов. Похоже, что с проблемой никто не сталкивался. Что-ж, программисты мы или где?

Полная загрузка процессора говорит о том, что у нас не зависание (deadlock), а live lock. Если бы у нас было зависание — мы могли бы воспользоваться уже известными трюками. Но у нас нет зависания, Delphi 7 чем-то занята. Поэтому трюки из статьи по ссылке нам не очень-то помогут (но вам никто не запрещает попробовать).

Итак, запускаем целевое приложение (Delphi 7) и даём ему повиснуть. Запускаем лучшую IDE всех времён и народов (Delphi XE) и вызываем команду Attach to process:

Выбираем наше зависшее приложение и не забываем установить галочку «Pause after attach»:

Примечание: если вы собираетесь отлаживать проблему в той же IDE, которой вы хотите производить отладку, то вы можете идентифицировать целевой процесс по PID-у (Process ID), предварительно проверив его через менеджер процессов типа Process Explorer.

IDE подключится к целевому процессу и встанет на паузу. Вы должны увидеть что-то такое:

Примечание: поскольку мы отлаживаем Delphi 7, которая не имеет отладочной информации, то мы сможем работать только с машинным CPU-отладчиком, а стек вызова сможет показывать только подпрограммы из системных DLL и BPL-пакетов (по экспорту). Если же вы отлаживаете современную IDE или свою собственную программу, то отладочная информация у вас будет — или из .jdbg файлов для IDE или из .dcu для вашей программы. Тогда вы сможете использовать и обычный высокоуровневый отладчик (включая анализ переменных, их имена, имена подпрограмм в стеке вызовов и т.п.).

✅ Не запускается уже установленный Autocom 2020.23 ошибки запуска автоком

Итак, перед вами — служебный поток отладчика IDE, который тот внедрил в целевую программу, чтобы остановить её. Этот служебный код не отражает никакой реальной работы самой целевой программы. Чтобы начать работу с самой программой, вам нужно сначала переключиться в какой-либо из её рабочих потоков. Для этого посмотрите на окно Threads:

В программе уже запущена куча потоков. Последний поток — служебный, от отладчика вашей IDE. Как я уже сказал, его можно игнорировать. Первый поток (как правило) — главный. Остальные потоки — какие-то фоновые рабочие потоки целевой программы.

Чтобы нам было проще ориентироваться — мы можем назначить (произвольное) имя каждому потоку. Для этого щёлкните правой по потоку и выберите Name thread:

Введите какое-нибудь понятное вам описание потока. Например, «Debugger Thread» или даже «Главный поток».

Далее, дважды щёлкните по следующему потоку. В моём случае следующие четыре потока были одинаковы:

Можно догадаться, что это — служебные фоновые потоки системы, вероятнее всего, обслуживающие системный пул потоков или что-то аналогичное. Иными словами, мы можем их игнорировать.

Первый по счёту поток — главный, что также видно по его (большому) стеку:

Наконец, последний поток:

Судя по всему, это фоновый парсер, который выполняет разбор кода в редакторе кода и, возможно, его подсветку. Наличие такого потока говорит нам о том, что среда загрузилась довольно далеко, прежде чем зависнуть. Мы также можем увидеть, что в настоящее время поток спит ( Sleep / ZwDelayExecution на вершине стека) — вероятнее всего, в ожидании ввода пользователя. Таким образом, мы также можем его игнорировать.

Из всех этих потоков нас пока интересует только главный поток. Начнём его препарировать. Нам известно, что в целевой программе произошло какое-то зацикливание (live lock). Для начала нам нужно определить примерное место. Для этого можно установить точку останова в каком-либо «подозрительном» месте стека вызова. Например:

В данном случае на стеке виден цикл обработки сообщений от Application.ProcessMessages . Я установил точку останова на первую строчку в целевой программе, не относящуюся к системе ( user32 ) или пакетам RTL/VCL. Ставить точку останова нужно сразу же после вызова ( call ) подпрограммы.

Читайте также:
Что когда качать программы

Снимаем программу с паузы ( Run / Run ) и. ничего не происходит. Точка останова не срабатывает. Следовательно, проблема не в обмене оконными сообщениями. Мы никак не можем выйти из обработки единственного оконного сообщения.

Заходим с другой стороны:

Ставим программу на паузу, переключаемся в главный поток, ставим кучу точек останова вдоль по стеку и запускам программу снова.

Выяснилось, что программа останавливается в единственном месте — тут:

Это единственное место, и оно находится на самой вершине стека. Это говорит нам о том, что зацикливание, вероятно, связано с, буквально, бесконечным локальным циклом, а не какой-то высокоуровневой ошибкой логики.

Пройдёмся немного по шагам (через «Step Over»), увидим вот это:

Выполнив эту строчку, получим:

Т.е. в конце стоит безусловный переход на начало этого же блока кода. Что это напоминает? Конечно же, цикл вида:

while True do begin // . if Condition then Break; // . end;

Иными словами, что-то пошло не так и условие выхода из цикла никогда не выполняется, цикл крутится бесконечно (ну или пока целевая программа не вылетит с ошибкой типа нехватки памяти, чтения/записи недопустимой памяти и т.п.).

Кстати, в этот момент нам наконец-то станет известно точное имя подпрограммы, где находится этот цикл:

В этот момент мы можем схитрить и просто открыть файл Controls.pas из папки Source установленной Delphi 7, чтобы найти там метод TDockTree.LoadFromStream . Но это не спортивно и мне не удастся показать несколько приёмов отладки.

Поэтому вместо этого мы продолжаем сессию отладки. Идея следующая: мы искусственно выходим из цикла и смотрим, что при этом произойдёт.

Для этого, нам сначала нужно установить точку останова также и на вызывающем:

Таким образом, как только мы успешно выйдем из цикла — мы встанем на этой точке останова, что и скажет нам о том, что мы успешно продолжили выполнение.

Чтобы не нарушить естественных ход кода программы, нам нужно найти конец цикла и условие, по которому мы могли бы выйти. В данном случае:

Как можно заметить, непосредственно перед переходом на начало цикла стоит вызов какой-то подпрограммы и проверка её результата. В одном случае (как это происходит) — мы продолжим выполнение (и перейдём на начало цикла), в другом случае (который мы хотим запустить сами) — оператор безусловного перехода на начало цикла пропускается и выполнение идёт дальше — с инструкции, непосредственно следующей за оператором безусловного перехода.

Также отметим, что условие заключается в проверке регистра EAX на ноль. Таким образом, чтобы переключиться на другую ветку, нам необходимо изменить значение регистра EAX на отличное от нуля непосредственно до выполнения проверки (но после вызова функции):

(Хотя в данном случае было бы быстрее просто использовать команду «Increment Register»)

Выполним команду проверки регистра EAX и увидим, что переход станет активным:

Что ж, запустим программу снова и. остановимся на ровно той же точке останова. Это говорит нам о том, что мы, вероятно, неверно определили конец цикла. Иными словами:

while True do begin // . if Condition1 then // — переключили это условие Continue; // . if Condition2 then // — а надо было — это Break; // . end;

Чтобы найти нужную границу, лучше всего начать с конца метода и найти пути, ведущие к его выходу. Затем переключить все условия, стоящие на этом пути.

Конец метода можно опознать по команде ret , а также по finally -блоку от try (набор pop и mov fs:[eax],edx ). Как правило, «волшебные» finally -блоки стоят в строке с end в конце метода, чтобы освободить ресурсы под локальные переменные с автоматическим временем жизни, либо как явный finally -блок в коде программы перед end .

В данном случае:

Горизонтальными линиями я отметил границы цикла while , а также условие с break , которое перебросит нас за цикл while , в конец метода.

Посмотрим, что же это за условие. Остановимся на команде сравнения и посмотрим, с чем сравнивается значение регистра EAX . Для этого воспользуемся окном Memory и командой Goto Address:

Сразу же обратим внимание, что идёт сравнение с памятью, адрес которой записан непосредственно в коде (т.е. он фиксирован). Т.е. это не локальная и не динамическая переменная. Иными словами, это — глобальная константа или переменная.

Чтобы не запутаться в little/big-endian — удобно переключить отображение на размер, соответствующий нашим данным. В этом случае — 4 байта (a.k.a. DWORD):

Окей, идёт сравнение с $FFFFFFFF — что есть -1 для знакового целочисленного типа. Мы уже выяснили, что это — что-то глобальное (константа или переменная). Поскольку константы целочисленных типов сохраняются непосредственно в коде (на них не производится ссылка через адрес), то у нас, скорее всего, идёт сравнение с глобальной переменной. Ну или с таким:

const SomeConst: Integer = -1;

Но скорее всего — глобальная переменная. Т.е. возможны два варианта: либо в переменную записали что-то не то, либо в данных для цикла отсутствует ожидаемое значение.

В любом случае, мы установили, что для выхода из цикла необходимо, чтобы EAX был равен $FFFFFFFF (вместо его текущего значения: нуля). Окей, остановимся непосредственно перед выполнением проверки и изменим значение EAX :

Читайте также:
Программа для авто регистраций

(Опять же, в данном случае было бы быстрее просто использовать команду Decrement Register)

Запускаем программу на выполнение — и программа останавливается на точке останова в вызывающем. Окей, из цикла мы вышли. Продолжаем выполнение — программа снова останавливается на нашей первой точке остановка (в LoadFromStream ). Т.е. проблемный метод вызывается несколько раз. Повторим действия по искусственному выходу из цикла while . В итоге целевая программа всё же запускается:

Как вы можете видеть, есть артефакты панелей IDE (что, видимо, также вызвало Access Violation). Но, главное, что мы узнали — при старте IDE открывает какой-то старый проект и стопорится при загрузке настроек расположения окон и панелей. Вероятно, эти настройки повреждены. И есть ненулевая вероятность, что эти настройки хранятся в настройках проекта.

Удаляем старый проект, запускаем Delphi 7 — ура! Работает!

Но в чём же была проблема? Давайте посмотрим исходный код. Открываем Controls.pas из Delphi 7 (не Delphi XE):

Ищем в нём TDockTree.LoadFromStream :

А вот, похоже, и наша глобальная переменная из проверки, которую мы меняли, чтобы выйти из цикла while . Как мы можем видеть, -1 — это значение по умолчанию и, следовательно, не является ошибочным значением. Т.е. с переменной всё в порядке, проблема была только в данных.

Смотрим текст метода:

Я выделил границы цикла while и условие выхода из него (которое мы меняли).

Упражнение/домашнее задание: видите ли вы баг в TDockTree.LoadFromStream , который привёл к зацикливанию?

Подсказка: этот пост помечен тэгом «обработка ошибок».

(Этот баг исправлен в RAD Studio 10.2 Tokyo, но мне лень смотреть, в какой именно версии Delphi он был исправлен.)

Источник: www.gunsmoker.ru

Почему делфи не запускает программу

На компьютере, на котором установлен сам Дельфи (7) все программы стартуют нормально.
На других компах — не все. Как определить, чего не хватает им для запуска.
Я — не программист, но программки для себя пишу, они мне очень нужны — в осном проблемы с программами, использующими звук. Многое из Дельфи я понять просто не в состоянии.
В старых версиях Дельфи было очень просто — просто вручную дописывались компоненты (они были в отдельных файлах), которые не входили в модуль System — просто в ту же папку, что и сама программа.

Вот выводит Windows сообщение о том, что произошла ошибка при запуске программы. Вот такие данные (это начало):

Exeption information
Code: 0x0eedfade Flags: 0x00000001
Record: 0x0000000000000000 Address: 0x000000007c81eb33

System information
Wundows NT 5.1. Build: 2600
CPU VEndor Code: 756E6547 — 49656E69 — 6C6746E
CPU Version: 0000066A CPY Feature Code: 0183F9FF
CPU AMD Feature Code 00B4E824

(и пошли дальше моодули).

Потом на экране остается еще сообщение:
Exeption EMCIDeviceError in module DictationVeryNew.exe at 0005B7F4. Данный файл не найден. Проверьте, что путь и имя файла указаны верно.

Где искать, какой файл не найден и чего не хватает?

15.01.2008, 00:24

Дело ясное что дело темное. Попробуй добавить в проект компонент типа MadExcept (http://www.madshi.net/madExceptDescription.htm)
по крайней мере увидешь стектрейс проблемы.

15.01.2008, 11:56
Открой бинарник DependenceViewer’ом и посмотри, что он использует
15.01.2008, 14:21
ЕМНИП это работа с малтимедия устройством. Посмотри, что за устройство открывается
Mirovingin19

16.01.2008, 16:12

Не уверен, но похоже, что это несовместимость ресурсов систем, где запускается прога, и той, где она была скомпилена.
EMCID — это медиа устройство, быстрее всего здесь — графического вывода. Может даже проблема с видеокартой или ее драйверами.
но это мне так кажется. надо смотреть.
Если хочешь — кинь сюда прогу — посмотрим — тогда что-то конкретное скажем

30.01.2008, 02:09

1)А в своей програмке ты случаем не пользуешь движок «говорящего помошника»?
2)При инициализации ММ устройства в программе ты не привязываешся к конкретному драйверу?

Dervish2008
05.02.2008, 11:33

— в осном проблемы с программами, использующими звук.
Где искать, какой файл не найден и чего не хватает?

Смотреть какие библиотеки используешь, какие им нужны файлы.

Или способ проще — все *.dll из windowssystem32 с машины где установлены дельфи копируешь на машину где нет и проверяешь.

07.02.2008, 06:20
Ставим в IDE MadExcept и смотрим на какой строке начинает «ругаться».
Skyggedans
14.02.2008, 12:23
Romeo4755, попробуй еще Remote Debugger заюзать.

19.02.2008, 17:25
А почему бы не поставить делфи на тестируемой машине и не пройтись дебагером?
26.02.2008, 01:41

Лично мне кажеться, что просто версия используемых программой библиотек разные. Procces Explorer-ом выясни, какие библиотеки она использует на исходном компьютере, и скопируй их в папку с программой, после чего перенеси на целевой компьютер. Проблема должны исчезнуть)

08.04.2008, 18:07

Если операционка отличается, то попробуй перекомпилить код на той же операционке. Незнаю почему, но у меня была такая же проблема. помогло

07.10.2008, 22:08

Господа, всем спасибо большое за ответы (жму Спасибо) — но я ни фига не понимаю, чего вы насоветовали.
Я же говорю: я не программист, у меня просто есть компьютер.
Вот из этих фраз «Открой бинарник DependenceViewer’ом», «Ставим в IDE MadExcept и смотрим на какой строке начинает «ругаться». — я понимаю только слова «открыть», «поставить » и «ругаться». 🙁

Читайте также:
Настройка программ на телевизоре LG

Программа показывает картинки, читает предложения (wav) и создает динамические массивы панелек со словами, которые надо перетаскивать мышкой. Никаких голосовых подсказок нету. Вот я беру компилирую программу, потом переношу ее на ноут с той же операционкой (икс пи), она не идет. Интересно: если на настольном компе, на котором обновляли систему и Дельфи еще не поставили, пытаться эту прогу запустить, она точно так же не пойдет. Не идет она и у соседей под Вистой.
В систему прямиком пакеджи я переписывала ( vclx70.bpl и др., на которые показал проект).
Также воспользовалась Инстолшилдом Экспрессом с тестированием Dependencies — один фиг, получаю сообщение
Exeption EMCIDeviceError in module vclx70.bpl at 00007с40. Данный файл не найден. Проверьте, что путь и имя файла указаны верно.

А почему бы не поставить делфи на тестируемой машине и не пройтись дебагером
Там места для Делфи не хватит — и сдает мне, что после установки Делфи программа начнет запускаться, как это было уже с десктопом.
Но мне надо, чтобы она запускалась на компах дома у студентов.

Если сможет кто — подскажите, пожалуста, как что делать поконкретнее. Библию Дельфи соотв. разделы я вроде прочитала, там таких подробностей нет.

все *.dll из windowssystem32 с машины где установлены дельфи копируешь на машину где нет и проверяешь
Меня интерфейс предупреждает, что среди них могут находиться файлы с драйверами — и тогда я перехерачу систему на второй машине.

При инициализации ММ устройства в программе ты не привязываешся к конкретному драйверу
А? Знать бы, где к нему привязываются. В свойсствах мдиаплеера в Обжект инспекторе для device type стоит Autoselect.

Если хочешь — кинь сюда прогу — посмотрим — тогда что-то конкретное скажем
Эх. упустила я свое счастье, постеснялась напрягать.
Теперь если найдется добрая душа посмотреть, прога теперь тут (http://narod.ru/disk/3050543000/DictatorVeryNew.zip.html)вместе с 4мя bpl-файлами, которые должны находиться в system32
Или вот сваянный в Инсталлшилде дистрибутив (http://narod.ru/disk/3069099000/setup.exe.html)

09.10.2008, 12:15

У меня вот еще какой вопрос: Дельфи работает с wavами. Для проигрывания их в программах Дельфи раньше надо было включать в Установке и удалении программ — Компонентах Windows — мульти — Сжатие аудиозаписей. Теперь такого в настройках Windows нет. Очевидно, Дльфи при установке прописывает какие-то драйверы для воспоизведения вавов.
Пробую запустить простейшую программу на старой, 98, операционке (на форме кнопка PLAY, которая проигывает 1 файл, причем файл попробовала разный с разными качесвами записи), — и старая операциока честно сообщает, что не может проиграть файл в таком формате. При этом те же самые файлы просто WindowsMediaPlayerом она проигрывает без проблем.

Нет ли в природе каких то драйверов для wav (как бывают пакеты кодаков)?

Источник: nowa.cc

Delphi 2015.r3 проблемы с установкой…

Появилась необходимость использовать Delphi
Попробовал накатить на свою систему программу и получил по началу
unknown error during init такую ошибку
а потом в добавок еще и такую
Directory preparation failed for : c:programdatadelphi133_cars2015.r3_4nwsty9albHIX6GAQzg85Q2cars 2015.r3data.
Please make sure that all applications that may use files and folders in that directory are terminated, then retry.

И они менялись одна на другую.

Ну дай думаю возьму чистый винт поставлю на него все авто программы и буду пользоваться по мере необходимости.
Поставил.
НИХРЕНА.
При всем при том что система чистая, свежая, антивирусники не стоят, и вроде все поставил
включая рекомендуемый Download Microsoft SQL Server Compact 3.5
После каждой попытки чистил папки
c:UsersAUTOzAppDataRoamingDelphi
c:ProgramDataDelphi
потом ccleaner

Нашел решение тут
Сразу скажу мне не помогло))
Инсталляции программ Autocom или Delphi в определенных случаях на 64-битной операционной системе Windows 7 происходит ошибка unknown error during init.

Для разрешения данного вопроса нам надо произвести несколько действий:
— деинсталлируем программный продукт Autocom или Delphi посредством файла Uninstall.exe;
— содержимое скрытой папки C:UsersИМЯ ПОЛЬЗОВАТЕЛЯAppDataRoamingAutocom подлежит удалению;
— содержимое скрытой папки C:ProgramDataAutocom также подлежит удалению;
— выполняем чистку реестра от сохранившихся ненужных записей программы посредством утилиты CCleaner;
— производим установку Microsoft SQL Server Compact 3.5;
Производим повторную инсталляцию программного продукта Autocom или Delphi.

Идем дальше
Подозрения были на то что все таки в процессе удаления старых программ зачищало что то не то.
Так и оказалось.
Нашел сайт
autocom.ucoz.com/down.html
Скачал Delphi
отключаем интернет
опять ставим doNET_4.6.1_install.exe
копируем в основную папку license.key
копируем два файла
Installation.xml
Resources.dll
из папки 2014R1 Activator LuisAndre
заменяем Main.exe
Запускаем, ну а дальше все по стандарту
Сохраняем FileActivation на рабочий стол, активируем его 2014R1 Activator LuisAndre.exe
И ВСЕ)))

И к этому я шел всего то пару часов ))) (не считая установки чистой системы)

Источник: www.drive2.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru