Skocz do zawartości
Alfer

VS 2017 debugowanie dll w C++

Rekomendowane odpowiedzi

Uszanowanie

 

Jest tak. Mam bibliotekę w C++. Jakimś cudem po dwóch dniach udało mi się ją skompilować do debugowania pod VS 2017.

Ustawiłem aplikację nadrzędna którą wywołuje ową bibliotekę.

Ustawiłem sobie punkt zatrzymania.

Uruchamiam debugowanie.

Oczywiście nie zatrzymuje się na punkcie zatrzymania.

Kropka przy tym punkcie zmieniała się z wypełnionej na pusty okrąg z wykrzyknikiem i wielce mówiącym komunikatem

 

"Punkt przerwania nie zostanie teraz trafiony. Nie załadowano symboli dla tego dokumentu"

 

Mnie za to jednak zaraz coś trafi. To niech załaduje te symbole, chyba to logiczne, że skoro ustawiam punkt zatrzymania to skoro są potrzebne jakieś symbole to niech je sobie załaduje.

 

Pytanie:

 

Gdzie trzeba coś ustawić żeby owe mityczne symbole się załadowały?

 

-alfer

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Powinno automatyczne czytać symbole gdy pdb jest obok dll.

 

Otwórz sobie widok modułów, prawoklik na dll i wybierz ładowanie symboli.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

ale debugujesz i kompilujesz w trybie "debug"

nie wiadomo czy masz włączone generowanie symboli

 

a tak na marginesie to co to za biblioteka? cos open source?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Powinno automatyczne czytać symbole gdy pdb jest obok dll.

 

Otwórz sobie widok modułów, prawoklik na dll i wybierz ładowanie symboli.

 

Nie wiem co to widok modułów … ale ...

 

zlokalizowałem pdb i tu sie okazało, że sobie ustawiłem wyjściowy plik na s2.dll a ten wynalazek zrobił z tego s2.dll.dll, s2.dll.pdb, …. zmieniłem, teraz jest s2 i mam s2.dll i s2.pdb no i jest poprawa bo nie czepia się, że symbole niezaładowane, natomiast jakoś do punktu zatrzymania (pierwszy wiersz funkcji nie dochodzi). Ale najpierw zbadam exe'ka jak to tam wygląda. Mam jeszcze wątpliwości np. do tego jak powinienem wyrównywać zmienne.

 

dzięki za wsparcie … i jak szybko

-alfer

 

ale debugujesz i kompilujesz w trybie "debug"

nie wiadomo czy masz włączone generowanie symboli

 

a tak na marginesie to co to za biblioteka? cos open source?

 

Tak tryb debug.

 

Biblioteka to dzieło mojego kolegi.

 

-mh

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie wiem co to widok modułów … ale ...

 

zlokalizowałem pdb i tu sie okazało, że sobie ustawiłem wyjściowy plik na s2.dll a ten wynalazek zrobił z tego s2.dll.dll, s2.dll.pdb, …. zmieniłem, teraz jest s2 i mam s2.dll i s2.pdb no i jest poprawa bo nie czepia się, że symbole niezaładowane, natomiast jakoś do punktu zatrzymania (pierwszy wiersz funkcji nie dochodzi). Ale najpierw zbadam exe'ka jak to tam wygląda. Mam jeszcze wątpliwości np. do tego jak powinienem wyrównywać zmienne.

nazwę i rozszerzenie można definiować oddzielnie

pading lepiej zostaw taki jak ustawia kompilator, no chyba że chcesz go się całkowicie pozbyć

"wynalazek"?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dręczę temat dalej

 

Wyszło mi, że nie eksportuje funkcji ale sprawdzam dumpbin i funkcje są ale mają podkreślenie na początku a zadeklarowane są jak niżej i nie widzę, tam, żadnego podkreślenia w nazwach funkcji. Ja rozumiem, że VS 2017 wie o wiele lepiej niż ja, jak się powinna nazywać moja funkcja, ale bardzo chciałbym się pozbyć tego podkreślenia.

 

Z góry dziękuję za sugestie

-alfer

 

 

extern "C" __declspec (dllexport) void __stdcall evDefExt_Ctrl( void )

{

} ;

 

// ------------------------------------------------------------------

// Wywolanie procedury 1 (glonej)

 

extern "C" __declspec (dllexport) void __stdcall evDefExt_Run(

tsDefExt_G const * zcqG ) // Struktura glowna

 

{

 

….

 

 

 

Dump of file s2.dll

 

File Type: DLL

 

Section contains the following exports for szklo.dll

 

00000000 characteristics

FFFFFFFF time date stamp

0.00 version

1 ordinal base

2 number of functions

2 number of names

 

ordinal hint RVA name

 

1 0 0001128A _evDefExt_Ctrl@0 = @ILT+645(_evDefExt_Ctrl@0)

2 1 00011483 _evDefExt_Run@4 = @ILT+1150(_evDefExt_Run@4)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

mój drogi to nie ma nic wspólnego z Visual C++

pewnie jeszcze byś chciał pozbyć się @0 z końca symbolu :P

to jest dekorowanie nazw standardowe dla języka C

jak zobaczysz kiedyś dekoracje nazw dla C++ w GCC lub VC to dopiero się zdziwisz :D

 

 

czy w prototypach funkcji używanych w "exe'ku" jest extern "C" i __stdcall (__declspec (dllimport))

Import into an application using __declspec(dllimport)

 

ignorancja w tym temacie poraża ;)

 

Create and use your own Dynamic Link Library (C++)

DLL

 

a w ogóle to linkujesz te funkcje statycznie czy dynamicznie (LoadLibrary)?

 

tak na marginesie to kolega Ci utrudnił zadanie maksymalnie jak mógł :P

Edytowane przez Namonaki

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

mój drogi to nie ma nic wspólnego z Visual C++

pewnie jeszcze byś chciał pozbyć się @0 z końca symbolu :P

to jest dekorowanie nazw standardowe dla języka C

jak zobaczysz kiedyś dekoracje nazw dla C++ w GCC lub VC to dopiero się zdziwisz :D

 

 

czy w prototypach funkcji używanych w "exe'ku" jest extern "C" i __stdcall (__declspec (dllimport))

https://docs.microsoft.com/pl-pl/cpp/build/importing-into-an-application-using-declspec-dllimport?view=vs-2019

 

ignorancja w tym temacie poraża ;)

 

Ha! Gdyby EXE był w C++ to może i by było tylko, że EXE jest w Delphi … tak żeby było łatwiej.

 

a tam jest:

 

LocStr := 'S2.DLL';

FDllHandle := LoadLibrary(PChar(LocStr));

if FDllHandle <> 0 then

begin

@evDefExt_Ctrl := GetProcAddress(FDllHandle, 'evDefExt_Ctrl');

@evDefExt_Run_ := GetProcAddress(FDllHandle, 'evDefExt_Run');

end

 

zadeklarowane jako:

 

TevDefExt_Ctrl = procedure; stdcall;

TevDefExt_Run_ = procedure(ADefExt_G_: psDefExt_G); stdcall;

 

 

co prawda w Delphi już też zaczynają wprowadzać "dekoracje". "Lepsze jest wrogiem dobrego" ale jak rozumiem wszystko to jest dla mojego dobra.

 

 

Zmieniłem na nazwy an te z podkreśleniami i małpami i zadziałało

 

Ale czy przypadkiem w wersji release coś się nie zmienia?

 

-alfer

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

nic nie powiedziałeś że to jest Object Pascal :P

 

co prawda ostatni raz jak pisałem cos w Delphi jeszcze za czasów rozdawania darmowych licencji Borlanda (po co Oni to sprzedali ?) ale przynajmniej FPC przy definiowaniu unitu pozwala na extern'owanie funkcji z pod dowolnej nazwy

 

generalnie to da się pozbyć podkreśl-inka za pomocą "Pliku definicji modułu (.Def)" https://docs.microsoft.com/pl-pl/cpp/build/reference/module-definition-dot-def-files?view=vs-2019

EXPORTS
  _LoadLibrary=LoadLibrary

 

https://docs.microsoft.com/pl-pl/cpp/build/reference/exports?view=vs-2019

 

ale @ i cyferki po niej są częścią konwencji wywołań stdcall (__stdcall) [nomen omen zwane pascal call] wiec należało by powrócić do cdecl (__cdecl)

na marginesie to Embarcadero rozdaje darmowe licencje uczelniom czy firma płaci są IDE?

Edytowane przez Namonaki

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nic nie powiedziałeś że to jest Object Pascal :P

 

na marginesie to Embarcadero rozdaje darmowe licencje uczelniom czy firma płaci są IDE?

 

Jeśli pytanie brzmi "Czy firma płaci za IDE?" to odpowiedź brzmi "Firma płaci jak za zboże".

 

Nie wiem czy teraz jeszcze tak jest, ale można było pobrać za darmo całe środowisko i robić co się chce nawet komercyjnie byle nie przekroczyć $1000 przychodu z tego tytułu. (Wziąłem to z głowy czyli z niczego).

 

Czasami jednak mnie obezwładniają. Ostatnio spreparowałem serwer REST, niby działa tylko od czasu do czasu się wysypie … no kurcze takie coś do komercyjnych zastosowań odpada … szkoda, bo to dla nich też kupa roboty, skoro już ludzie za to płacą to mogłoby jednak funkcjonować. I tak teraz myślę, co z tym zrobić? Testy są trudne bo błąd pojawia się raz na dwa tygodnie i nie potrafię go skojarzyć z czymkolwiek.

 

-alfer

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...