Skocz do zawartości

[Delphi] debuger + dll


ktoś

Polecane posty

W sktórcie można powiedzieć, że debuger odmówił mi współpracy z biblioteką dll.

Dokładnie sytutacja wygląda następująco:
potrzebowałem kilku funkcji, któych delphi standartowo nie udostępnia ( bo i poco, jeżeli nie są to "typowe", potrzebne szerokiemu gronu programistów), więc napisałem je samemu. Wszystko było ok. Jednak potrzebowałem tych funkcji w różnych miejscach programu, i w różnych unitach. Postanowiłem wpakować je do biblioteki.
Zrobiłem ładowanie statyczne, bo najprościej.
Wszystko działało

potem stwierdziłem, że jedna z funkcji nie spełnia swojej funkcji...
ups... zakeciłem się trochę..
funkcja nie robi tego, czego się spodziewałem : zamiast przekształcić mi stringa do postaci pozwalającej się konwerterować do integera (a następnie wywołać strtoint), wywala mi EConvertError.

Gdy uruchamiam program, pokazuje mi komunikat, że błąd powstał w bibliotece.
Gdy uruchamiam bibliotekę pod kontrolą debugera program nadal wywala mi błąd w bibliotece, podczas gdy debuger milczy.

Nie wstrzymuje wykonywania kodu w bibliotece, nawet jak ustawiłem pułapki (Ctrl + F5) na inicjalizacji zmiennych we WSZYSTKICH funkcjach (mimo że wywołanie dotyczyło tlyko jednej z nich) wykonywanie kodu nie zostaje zatrzymane przez debuger.

Kilka godzin wcześniej wszystko działało dobrze, więc nie bardzo wiem co mogło się zestrać...
nie zmieniałem ani nazw funkcji, ani parametrów. Inicjalizacja zmiennych polega tylko na wyzerowaniu ich.

Może macie jakieś pomysły? Ostatecznie moge wpakować wszystko do jakiegoś unita i wywoływać przez interface... ale chciałem spróbować nowego (dla mnie) sposobu.
ps: bez obaw, ja nie biorę udziału w konkursie. Chociaż chętnie bym w coś pograł
Link do komentarza
Udostępnij na innych stronach

spoko mialem z tym kiedys problem

calosc wyglada tak ze:
1. musisz miec zrobione generowanie pliku map + informacji debugowych
2. dorzuc debug source path na pliki ktore sa wygenerowane do dll'ki, bazowo debugpath pokazuje na sources a te pliki z dll laduja w roznych miejscach, jak to zrobisz to powinno pomoc.

cos mi po glowie chodzi ze jeszcze cos bylo trzeba zrobic ale kurde ponad 6 mscy temy mialem ten problem i kurde nie pamietam co jeszcze trzeba zrobic. Tak czy siak problem polega na tym ze debuger nie widzi plikow z danymi potrzebnymi do debugowania, jak mu je [b]wskarzesz to wszystko ruszy.

Inna metoda to pogrzebac w load modules i ustawiac breakpointy na adresy ale to strasznie do dupy i nie polecam.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

aha... no to już coś
A które dane są potrzebne do debugowania?
I gdzie to trzeba wskazać?


ps: uruchomiłem jeszcze raz tak, że dll jest pod kontrolą delphi.
Wywołałem funkcje, i debuger wywalił komunikat o błędzie. Jednak miejsca wskazać nie potrafi...
Link do komentarza
Udostępnij na innych stronach

zrob taki myk, zeby dll'ka i wszystkie pliki o takej samej nazwie jak ona byly w katalogu z exekiem albo w pliku ze zrodlami. zerknij na to
http://www.micro-sys.dk/developer/articles...i-dll-debug.php
oraz na to
http://www.nsonic.de/Delphi/txt_WIS00637.htm
cos mi po dynce sie obja remote debug symbols albo cos w ten desen ale sa szanse ze majacze :)

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Popełniłeś duuuży błąd smile.gif. Nie wolno, zabrania się używania zmiennych typu string (problem z licznikiem referencji napisu) w parametrach procedur, parametrach i wyniku funkcji exportowanych z DLLki.

Istnieje oczywiście kilka technik obejścia tego problem.

a) Użyj wspólnego menagera pamięci dla EXE i DLL

W pliku dpr od EXE i DLL jako pierwszy moduł musisz wpisać ShareMem. Następnie załączyć jeden dll "BORLNDMM.DLL". Oczywiście możesz też napisać swój menager pamięci wink.gif.

cool.gif Zamiast string w parametrach funkcji użyj PCHAR

w DLL:

[code=Delphi] function MyStrToInt(const a: PCHAR): integer;
var
Code: [BY[B[
[ĘJK[JNB[Ś4(Ń4)4(5MŃQ%ĄA
!HĄ [/code]

Wydaje mi się że właśnie w tym leży Twój problem - używasz string tam gdzie nie wolno.

soon Delphi will be only for veterans and finally we all will die at the end…

delphi.dathox.com - nowinki z świata Delphi/Pascala

only programmers and drug dealers call their customers "users"

 

Oto cisza przed burzą, Chwile się dłużą.Z gór schodzi dużo chmur ku podnóżom.Ptaki milaczą, drogi suche jak wiór się kurzą, Ptaki milczą a drogi się kurzą.

Link do komentarza
Udostępnij na innych stronach

błąd tak, ale w poście:
Przekazuję SHORTstringa tongue.gif

Problem nie powinien leżeć tutaj, bo jak wklepałem stringa jako parametr, to kompilator się zbuntował, komentaż przeczytałem i chyba zrozumiałem o co w nicm chodzi (z angielskim sobie radzę, ale jakoś tak nie najlepiej jak [b]narazie), a na shortstringu wszystko działało. (tj. kompilacja i funkcje wykonywały sięOK. Tylko potem zacząłem kombinować, bo mi jedna albo dwie funkcje nie działały. Teraz mi wszystko nei działa)

Toster: wrzuciłem program i dll do jednego katalogu, i pułapka zadziałała
Zobaczymy co będzie dalej. tymczasem :pom: dla Ciebie

edit: już wiem co jest nie tak... funkcja nie przekształca stringa, tylko wykonuje kilka przebiegów pętli i każe konwerterować do integera ciąg znaków o treści:'' (nic)
[/url]

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...