Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.02.27;
Скачать: [xml.tar.bz2];

Вниз

Отладка 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
1-87465
Владимир
2003-02-18 19:49
2003.02.27
DBGrid


1-87506
littlelove
2003-02-15 22:44
2003.02.27
ToolBar ->ToolWindow


14-87617
Журналист
2003-02-09 11:34
2003.02.27
Опрос


1-87448
Yrtimd
2003-02-18 18:06
2003.02.27
Проблемы с EhLib


14-87691
Maximator Vetera
2003-02-10 18:27
2003.02.27
Ручка Паркер или ее аналоги.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский