Как отладить dll delphi

Обновлено: 04.07.2024

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

Для локализации и исправления таких ошибок необходимо использовать отладчик. Отладка приложения позволяет выявить место возникновения ошибки и принять меры по ее исправлению.

Средства отладки в Delphi

Точки останова на код

Установка безусловных точек останова

Устанавливать точки останова можно различными методами. Можно установить безусловный BP простым кликом по полоске в редакторе кода, левее требуемой инструкции (рис. 1). Строка, на которую был поставлен BP окрасится в другой цвет, а на месте клика появится красная точка, которая символизирует точку останова. Другим способом установки безусловного BP является нажатие клавиши F5, будучи на той инструкции, на которой планируется останавливать отладчик.

Установка breakpoint

Установка условных точек останова

Диалог установки точки прерывания на код

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

Точки останова на адрес и данные

Диалог установки бряка на запись данных

Собственно, ничего в них интересного нет. Срабатывают тогда, когда подгружаются различные модули. Например BPL, DLL, EXE или OCX. Устанавливаются из главного меню Run | Breakpoint | Module load breakpoint. В диалоговом окне нужно указать (или выбрать) тот модуль, на загрузку которого вы хотите поставить точку останова.

Установка BP програмно

Мы так же можем установить точку останова программно. Для этого необходимо перед инструкцией, на которой вы хотите остановиться, вставить код вызывающий обработчик 3 прерывания. Например:

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

Какие вещи необходимы для создания файла DLL в debug и последующего запуска отладки в Delphi?

3 ответа

может ли кто-нибудь, пожалуйста, помочь мне, как сделать удаленную отладку DLL (просто dll), которая не зависит от exe. dll-это служба, которая будет работать на серверной машине, а исходный код DLL-на клиентской. Теперь, когда эта служба работает на серверной машине, я хочу отладить код delphi.

С помощью Delphi я написал DLL, который можно вызвать из Java через JNA (Java Native Access) . Методы в этом DLL - это просто простые операции, но для дальнейшего использования и более сложных вызовов я хотел бы знать, как я могу использовать отладчик Delphi, если DLL вызывается непосредственно из.

В Delphi 7 вы бы сделали это:

Проект | Параметры | Компилятор | Отладка | Отладочная информация (проверьте)

Затем перейдите в раздел Run | Parameters | Host Application и введите имя вашего exe.

Добавьте несколько точек останова в код DLL и нажмите кнопку Выполнить. Ваш exe будет загружен, и вы сможете отладить DLL частей в Delphi IDE.

Если ваш exe уже запущен, нажмите кнопку Выполнить | Присоединить к процессу

-- Я проверил это и обнаружил, что мне также нужно проверить "Include remote debug symbols" на странице компоновщика параметров проекта в Delphi 7.

Я смог получить точку останова, чтобы попасть в нее, используя методы Run | Parameters, а также Run | Attach to process. Тест DLL, который я создал, имел одну функцию stdcall и был динамически загружен консольным приложением Visual C++.

Мы используем это довольно часто (используя Delphi).

  1. Включите все параметры отладки для всех проектов (DLL файлов). И отключить оптимизацию.
  2. Обязательно установите хост-приложение в нужный файл EXE.
  3. Файл(ы) сборки DLL.

Теперь вы можете поместить точки останова как в dll, так и в exe. И запустите файл DLL из файла IDE. Он запускает файл EXE и останавливается в запрошенных точках останова.

Он даже работает, когда файлы DLL динамически связаны (если они выгружены, синие точки исчезают).

Метод, предложенный Gamecat, я уже использовал раньше.

Другой способ: у меня есть проект DLL, но я также создаю проект "test bench". Проект "test bench" имеет одну форму, которая может непосредственно выполнять код, который обычно используется в DLL.

Похожие вопросы:

Допустим у меня есть EXE по имени А, который загружает DLL по имени Б, который в свою очередь загружает еще DLL имени C. Все эти три написаны в Delphi. У меня есть источник для всех трех. Если я.

Я пытаюсь отладить COM dll (TAutoObject) в Delphi, и моя точка останова не зеленая. Я поставил свой вариант так : ведущий: c:\Program Files\Internet Explorer\iexplore.exe парам.

Я пытаюсь отладить COM+ DLL в Delphi 7 в среде Win7. Как я могу это сделать?

может ли кто-нибудь, пожалуйста, помочь мне, как сделать удаленную отладку DLL (просто dll), которая не зависит от exe. dll-это служба, которая будет работать на серверной машине, а исходный код.

С помощью Delphi я написал DLL, который можно вызвать из Java через JNA (Java Native Access) . Методы в этом DLL - это просто простые операции, но для дальнейшего использования и более сложных.

У меня есть приложение, написанное на Delphi 7, которое использует c++ dll, написанное на BCB 5. Я хочу отладить этот dll от Delphi IDE возможно ли это? Если это возможно, какие шаги нужно выполнить.

У меня есть EXE и 2 DLL, используемые этим EXE. Все двоичные файлы были скомпилированы Delphi XE2. Как отладить 2 DLL за один раз при запуске EXE? Второй IDE не может присоединить к процессу то, что.

У меня есть проект COM DLL, и я могу отлаживать его (останавливать в точках останова) в Delphi 2007 и XE8. Однако, похоже, что IDE не может остановиться в точках останова в Delphi 10 Сиэтле или 10.1.

Хотя у меня есть многолетний опыт Delphi, это мое первое знакомство с Com+. У моего клиента есть приложение Com+, которое я должен поддерживать. В мире конечных пользователей DLL запускается.

Сканер и Buffer Reader больше не используются, так как Java предоставляет лучший способ достичь того же результата с меньшим количеством кода. Я вижу по крайней мере три возможных подхода для решения вашей проблемы:

подход 1 : если вы можете использовать хотя бы Java 8, то я бы предложил использовать java.nio .file библиотеки в читают файл как поток строк :

Затем, в зависимости от того, что вам нужно сделать, вы можете использовать либо forEach [115 ], который будет зацикливаться на каждой строке потока:

или Java Collectors для выполнения необходимых вычислений. Хороший учебник о коллекционерах можно найти здесь здесь . Вы также можете использовать коллекторы для разделения вашей строки и т. Д .

подход 2 : вы можете использовать библиотеки Apache Commons для достижения той же цели. В частности, вы можете использовать FileUtils и StringUtils . Например:

подход 3 : используйте Джексона, чтобы преобразовать ваш файл в объект json или java, который вы затем сможете использовать для своих собственных преобразований. Здесь приведен пример, объясняющий, как преобразовать CSV в JSON. Немного покопавшись в документации Джексона, вы можете применить ее к своему делу.

3 ответа

В Delphi 7 Вы сделали бы это:

Проект | Опции | Компилятор | Отладка | Отладочная информация (проверка)

Затем перейдите к Выполненному | Параметры | Хост-приложение и введите имя своего exe.

Добавьте некоторые точки останова в своем коде DLL и затем нажмите выполненный. Ваш exe будет загружен, и можно отладить части DLL в Delphi IDE.

Если Ваш exe уже работает, нажмите Run | Присоединение к процессу

- Я протестировал это и нашел, что также должен был проверить, "Включают удаленные отладочные символы" на странице Linker опций проекта в Delphi 7.

Я смог заставить точку останова поражать использование Выполнения | Параметры, а также Выполнение | Присоединение для обработки методов. Тест DLL, который я создал, имел единственный stdcall, функционирует, и был динамично загружен консольным приложением Visual C++.

Мы используем это довольно часто (использующий Delphi).

  1. Включите все параметры отладки на всех проектах (файл (файлы) DLL). И отключите оптимизацию.
  2. Обязательно установите хост-приложение на правильный EXE-файл.
  3. Создайте файл (файлы) DLL.

Можно теперь поместить точки останова и в dll и в exe. И выполненный файл DLL от IDE. Это запускает EXE-файл и остановки в требуемых точках останова.

Это даже работает, когда файлы DLL динамично связаны (если они разгружены, синие точки исчезают).

DLL - Dynamic Link Library иначе динамически подключаемая библиотека, которая позволяет многократно применять одни и те же функции в разных программах. На самом деле довольно удобное средство, тем более что однажды написанная библиотека может использоваться во многих программах. В сегодняшнем уроке мы научимся работать с dll и конечно же создавать их!
Ну что ж начнём!

Для начала создадим нашу первую Dynamic Link Library! Отправляемся в Delphi и сразу же лезем в меню File -> New ->Other.
Перед нами появляется вот такое окошко:

Delphi dll библиотека

Выбираем в списке Dynamic-Link Library (в версиях младше 2009 Delphi пункт называется DLL Wizard).

dll delphi библиотека

В результате у нас появляется лишь окно с кодом, заметьте никакой формы у нас здесь нет !
Теперь начинается самое интересное. Напишем наши первые процедуры в библиотеке.

library Project2;
//Вы, наверное уже заметили, что вместо program
//при создании dll используется слово library.
//Означающее библиотека.
uses
SysUtils, dialogs,
Classes; // Внимание ! Не забудьте указать эти модули,
// иначе код работать не будет

Exports FirstCall, DoubleCall;
//В Exports содержится список экспортируемых элементов.
//Которые в дальнейшем будут импортироваться какой-нибудь программой.
begin
End.

На этом мы пока остановимся т.к. для простого примера этого будет вполне достаточно. Сейчас сохраняем наш проект, лично я сохранил его под именем Project2.dll и нажимаем комбинацию клавиш CTRL+F9 для компиляции библиотеки. В папке, куда вы сохранили dpr файл обязан появится файл с расширением dll, эта и есть наша только что созданная библиотека. У меня она называется Project2.dll

Займёмся теперь вызовом процедур из данной библиотеки. Создаём по стандартной схеме новое приложение. Перед нами ничего необычного просто форма. Сохраняем новое приложение в какую-нибудь папку. И в эту же папку копируем только что созданную dll библиотеку. Т.е. в данном примере Project2.dll

Теперь вам предстоит выбирать, каким способом вызывать функции из библиотеки. Всего существует два метода вызова.

Способ № 1
Пожалуй, это самый простой метод вызова процедур находящихся в библиотеке.
Идеально подходит для работы только с одной библиотекой.

Ну что поехали.
После ключевого слова implementation прописываем следующий код:

Procedure FirstCall; stdcall; external 'Project2.dll' ;
// Вместо Project2.dll может быть любое имя библиотеки
Procedure DoubleCall; stdcall; external 'Project2.dll' ;

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

Теперь для того, что бы вызвать данные процедуры нам необходимо лишь вставить их названия в любое место кода, что мы сейчас и сделаем. Кидаем на форму 2 компонента Button с закладки Standart и создаем на каждой обработчик событий OnClick

OnClick первой кнопки:

Procedure TForm1.Button1Click(Sender: TObject);
Begin
FirstCall; // Имя процедуры, которая находится в dll
End;

OnClick второй кнопки:

Procedure TForm1.Button2Click(Sender: TObject);
Begin
DoubleCall; // Имя процедуры, которая находится в dll
End;

Способ № 2:
Сложнее чем первый, но у него есть свои плюсы, а самое главное, что он идеально подходит для плагинов.
Для применения данного метода, первым делом объявляем несколько глобальных переменных:

Var
LibHandle: HModule; //Ссылка на модуль библиотеки
FirstCall: procedure; stdcall;
//Имена наших процедур лежащих в библиотеке.
DoubleCall: procedure; stdcall;

Затем после ключевого слова implementation напишем процедуру которая будет загружать нашу библиотеку:

Procedure LoadMyLibrary(FileName: String);
Begin
LibHandle:= LoadLibrary(PWideChar(FileName));
//Загружаем библиотеку!
// Внимание ! PChar для версий ниже 2009 Delphi
If LibHandle = 0 then begin
MessageBox(0,' Невозможно загрузить библиотеку ',0,0);
Exit;
End;
FirstCall:= GetProcAddress(LibHandle,' FirstCall ');
//Получаем указатель на объект
//1-ий параметр ссылка на модуль библиотеки
//2-ой параметр имя объекта в dll
DoubleCall:= GetProcAddress(LibHandle,' DoubleCall ');
If @FirstCall = nil then begin
//Проверяем на наличие этой функции в библиотеке.
MessageBox(0,' Невозможно загрузить библиотеку ',0,0);
Exit;
End;
If @DoubleCall = nil then begin
//Проверяем на наличие этой функции в библиотеке.
MessageBox(0,' Невозможно загрузить библиотеку ',0,0);
Exit;
End; End;

После чего на форме создаем, обработчик событий OnCreate, в котором с помощью только что созданной процедуры мы загрузим нашу библиотеку

Procedure TForm1.FormCreate(Sender: TObject);
Begin
LoadMyLibrary(' Project2.dll ');
End;

Теперь опять же, для того, что бы вызвать необходимые процедуры из нашей библиотеки нам необходимо лишь вставить их названия в любое место кода. Для этого кидаем на форму 2 компонента Button с закладки Standart и создаем на каждой обработчик событий OnClick

OnClick первой кнопки:

Procedure TForm1.Button1Click(Sender: TObject);
Begin
FirstCall; // Имя процедуры, которая находится в dll
End;

OnClick второй кнопки:

Procedure TForm1.Button2Click(Sender: TObject);
Begin
DoubleCall; // Имя процедуры, которая находится в dll
End;

Ну и напоследок создаем обработчик событий OnDestroy на форме, в котором выгружаем dll библиотеку из памяти

Procedure TForm1.FormDestroy(Sender: TObject);
Begin
FreeLibrary(LibHandle);
//Выгружаем библиотеку из памяти.
End;

Вот и все ! Второй способ получился довольно громоздкий, но его плюс в уточнении хранящегося объекта в библиотеке.

Читайте также: