Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.27;
Скачать: CL | DM;

Вниз

Отладка DLL   Найти похожие ветки 

 
passm ©   (2003-02-11 10:04) [0]

Указал Host Application, при команде Run приложение запускается, но на BreakPoint"е в DLL останавливаться не желает :(
DLL загружаю динамически (LoadLibrary)
Кстати, еще синдром, DLL-файл при команде Compile создается, но если его удалить, и сделать Run, то просто запускается Host Application без создания DLL-файла.
Может, кто уже сталкивался.
Help, plz.


 
stone ©   (2003-02-11 10:14) [1]

DLL и Host Application у меня находятся в одной Project Group, и отладка происходит бес проблем.


 
Digitman ©   (2003-02-11 10:17) [2]


> приложение запускается, но на BreakPoint"е в DLL останавливаться
> не желает


Значит код, на котором брейкпойнт установлен, не вызывается из хост-процесса. Чудес не бывает.


> Кстати, еще синдром


А что в этом удивительного ? Делфи знать не знает ничего о том, что DLL-файл удален тобой. Строить его заново (перед запуском хост-приложения) Делфи будет лишь в том случае, если исх.текст изменен.


 
passm ©   (2003-02-11 10:32) [3]

stone © (11.02.03 10:14)> Пробовал - не помогает :(
Digitman © (11.02.03 10:17)>
> Значит код, на котором брейкпойнт установлен, не вызывается
> из хост-процесса.

В данном случае возможен вызов из др. процесса?

> Чудес не бывает.

Хочется верить :)

>> Кстати, еще синдром

В самом деле. Проверки на существование файла при Run нет. Учту.


 
Digitman ©   (2003-02-11 10:47) [4]


> В данном случае возможен вызов из др. процесса?


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


 
Kudatsky   (2003-02-11 11:04) [5]

У меня такое было, причём из-за глупой ошибки. Dll писалась в одну директорию, а вызывалась из другой...


 
passm ©   (2003-02-11 11:25) [6]

Kudatsky (11.02.03 11:04)> Вроде нет. У всех проектов указал один Output Directory.
Стучу в бубен... :-\


 
Digitman ©   (2003-02-11 11:31) [7]

А в каком состоянии находится опция "Use Debug DCUs" ?
Куда смотрит Debug DCU Path ?
И почему бы не проверить факт заведомо достоверной загрузки хост-процессом трассируемой DLL, установив брейкпойнт, скажем, в DllProc() ? Или - между begin..end в DPR ?


 
passm ©   (2003-02-11 11:51) [8]

Digitman © (11.02.03 11:31)>
> И почему бы не проверить факт заведомо достоверной загрузки
> хост-процессом трассируемой DLL, установив брейкпойнт, скажем,
> в DllProc() ? Или - между begin..end в DPR ?

Между begin..end остановки нет.

> Куда смотрит Debug DCU Path ?

Есть Debug Source Path - пуст.


 
REA ©   (2003-02-11 12:05) [9]

1) Путь к DLL в Project Options должен быть прописан целиком без ./ и ../
2) Отладочная информация включена, а оптимизация выключена


 
Digitman ©   (2003-02-11 12:08) [10]

Покажи исх.код загрузки твоей DLL и код вызова трассируемой ее ф-ции в тексте хост-приложения


Покажи объявление и код трассируемой ф-ции в отлаживаемой DLL


 
passm ©   (2003-02-11 12:22) [11]

Digitman © (11.02.03 12:08)> Ok.
Загрузка DLL и вызов ее методов:

procedure GetData(const ApplicationHandle: HWND;
const PackDescriptionPath: string;
const ToAffiliate: Integer;
const Database: TDatabase);
const
LibraryName = "ExchData.dll";
GetApplicationHandleProc = "GetApplicationHandle";
SetApplicationHandleProc = "SetApplicationHandle";
GetDataProc = "GetData";
type
TGetApplicationHandleMethod = function: HWND; stdcall;
TSetApplicationHandleMethod = procedure(const Handle: HWND); stdcall;
TGetDataMethod = procedure(const DBHandle: HDBIDB;
const PackDescriptionPath: PChar; const ToAffiliate: Integer); stdcall;
var
Hl: THandle;
Ha: HWND;
GetApplicationHandleMethod: TGetApplicationHandleMethod;
SetApplicationHandleMethod: TSetApplicationHandleMethod;
GetDataMethod: TGetDataMethod;
begin
Hl:= LoadLibrary(LibraryName);
if Hl <> 0 then
begin
GetApplicationHandleMethod:= GetProcAddress(Hl, GetApplicationHandleProc);
SetApplicationHandleMethod:= GetProcAddress(Hl, SetApplicationHandleProc);
GetDataMethod:= GetProcAddress(Hl, GetDataProc);
Ha:= 0;
try
if Assigned(GetApplicationHandleMethod) then
Ha:= GetApplicationHandleMethod;
if Assigned(SetApplicationHandleMethod) then
SetApplicationHandleMethod(ApplicationHandle);
if Assigned(GetDataMethod) then
GetDataMethod(Database.Handle, PChar(PackDescriptionPath), ToAffiliate)
finally
try
if Assigned(SetApplicationHandleMethod) then
SetApplicationHandleMethod(Ha)
finally
FreeLibrary(Hl)
end
end
end
end;

DLL привести полностью не могу - кода много.

library ExchData;

uses
SysUtils,
Classes,
FileUtil,
DataExch in "DataExch.pas",
DatMod in "DatMod.pas" {dm: TDataModule},
SendData in "SendData.pas" {SendDataForm},
BDE,
DB,
Forms,
Windows,
SendDataTh in "SendDataTh.pas",
GetData in "GetData.pas" {GetDataForm},
LogMemo in "LogMemo.pas" {LogMemoForm},
GetDataThread in "GetDataThread.pas",
PacksConst in "PacksConst.pas",
PackApi_h in "PackApi_h.pas",
Defs in "..\Manager_1\Defs.pas",
AddedFuncs in "..\Manager_1\AddedFuncs.pas";

function GetApplicationHandle: HWND; stdcall;
begin
Result:= Application.Handle
end;

procedure SetApplicationHandle(const Handle: HWND); stdcall;
begin
Application.Handle:= Handle
end;

procedure SetParam(const ParamName: PChar; const Field: TField); stdcall;
begin
DataExch.SetParam(string(ParamName), Field)
end;

procedure SendData(const DBHandle: HDBIDB; const PackFileName: PChar; const ToAffiliate: Integer); stdcall;
begin
if FileExists(string(PackFileName)) then
begin
dm:= Tdm.Create(nil);
dm.Database1.Handle:= DBHandle;
try
DataExch.SendData(string(PackFileName), ToAffiliate)
finally
dm.Free;
dm:= nil
end
end else
MessageBox(Application.Handle, PChar("Path not found " + string(PackFileName)), "Error",
MB_ICONERROR + MB_OK)
end;

procedure GetData(const DBHandle: HDBIDB; const GetDataPath: PChar; const ToAffiliate: Integer;
const PackDescriptionPath); stdcall;
begin
if DirExists(string(GetDataPath)) then
begin
dm:= Tdm.Create(nil);
dm.Database1.Handle:= DBHandle;
try
DataExch.GetData(string(GetDataPath), ToAffiliate)
finally
dm.Free;
dm:= nil
end
end else
MessageBox(Application.Handle, PChar("Path not found " + string(GetDataPath)), "Error",
MB_ICONERROR + MB_OK)
end;

exports
GetApplicationHandle index 1,
SetApplicationHandle index 2,
SetParam index 3,
SendData index 4,
ExchData.GetData index 5;

begin
end.

Но, в принципе функции в DLL можно сделать пустыми. В данном случае не важно что они делают.

PS: <Digitman © > Огромное спасибо за внимание.


 
Digitman ©   (2003-02-11 12:36) [12]

1. Хост-приложение - многопоточное ? В каких код.потоках в хост-процессе вызывается процедура GetData() ?

2. Покажи, где ставишь точки останова


 
passm ©   (2003-02-11 12:44) [13]

Digitman © (11.02.03 12:36)> Нет. Хост-приложение не многопоточное. Точнее процедура вызова функции DLL не вызывается из отдельного потока.
Точку остановки ставлю на if DirExists...
IMHO, скорее всего надо копать где-то в настройках.


 
Digitman ©   (2003-02-11 13:02) [14]

далеко ты полез, однако)

начни с простейшей проверки

library ExchData;
...
begin
//если библиотека корректно загружена и инициализирована при
//вызове LoadLibrary() в хост-процессе, то следующая строчка

ShowMessage("DLL loaded & initialized"); // <-- здесь поставь BP

//должна безусловно получить управление еще ДО вызова любой из
//ф-ций этой библиотеки
end.


 
passm ©   (2003-02-11 13:11) [15]

Digitman © (11.02.03 13:02)> Вызывается, но не останавливается.


 
Digitman ©   (2003-02-11 13:16) [16]

все же немаловероятно, что существует более одного экз-ра DLL...


 
passm ©   (2003-02-11 13:25) [17]

Digitman © (11.02.03 13:16)> Это я уже проверял.


 
Digitman ©   (2003-02-11 13:30) [18]

Опция Integrated Debugging включена ?
С какими опциями отладки собран DLL-проект ?


 
passm ©   (2003-02-11 13:35) [19]

Digitman © (11.02.03 13:30)>
> Опция Integrated Debugging включена ?

Да

> С какими опциями отладки собран DLL-проект ?

Debug Information, Local Symbols, Reference Info, Assertions.


 
Юрий Зотов ©   (2003-02-11 13:38) [20]

Система - XP? Под ней такое чудо действительно случается, это известная проблема. По непонятной причине отладчик не подгружает таблицу символов DLL.

Сразу после LoadLibrary напишите какой-нибудь MessageBox, чтобы тормознуть программу. Когда диалог вывалится, переключитесь в Delphi и нажмите Ctrl+Alt+M - откроется список загруженных модулей. Найдите свою DLL, щелкните по ней правой кнопкой, выберите Reload Symbol Table и загрузите таблицу. После этого брейкпойнты в DLL заработают, осталось только вернуться в программу и в диалоге нажать ОК, чтобы продолжить ее работу.


 
Digitman ©   (2003-02-11 13:41) [21]

Если для отладки выполнить Attach to Host Process для предварительно уже запущенного "вручную" хост-приложения - та же картина ?


 
Юрий Зотов ©   (2003-02-11 13:55) [22]

> Digitman © (11.02.03 13:41)

Точно уже не помню, кажется, да. Я столкнулся с этим несколько месяцев назад, полазил по конференциям (кстати, здесь дали ссылку, спасибо) и прочитал, в чем дело. Поскольку грузить таблицу ручками при каждом старте было лень, сначала написал очень простой эксперт IDE (создает невидимое окно, программа с опцией DEBUG после LoadLibrary вызывает SendMessage и передает имя DLL, а эксперт, получив сообщение, загружает таблицу). Но потом все же снес XP и вернулся к 2K.


 
Digitman ©   (2003-02-11 14:10) [23]


> Юрий Зотов


По поводу XP - ничего не могу сказать, не работал с ХРенью)..
Но здесь еще, кстити, и Д4 фигурирует - в этой версии тоже багов немало... вероятно, и со встроенным дебагером проблемы имеются..

Да, наверно, следует посоветовать автору отказаться от такой комбинации в пользу Винтукея + Делфи (версии не ниже 5.x)



Страницы: 1 вся ветка

Текущий архив: 2003.02.27;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
14-87649
Тень
2003-01-22 15:40
2003.02.27
Как увидеть Win95-98 под ХР


1-87495
race1
2003-02-16 09:13
2003.02.27
font


1-87411
Guerrillero
2003-02-17 17:51
2003.02.27
Вывод текста в TreeView


1-87361
Alek_1
2003-02-16 21:01
2003.02.27
Image1


1-87515
Adolf
2003-02-16 21:07
2003.02.27
Таблица Символов