Jak debugować bibliotekę DLL, do której istnieje odwołanie (mając PDB)


134

Mam dwa rozwiązania w moim obszarze roboczym, powiedzmy A i B.

Rozwiązanie A to starszy projekt, którego kodowanie zakończyłem jakiś czas temu. W rozwiązaniu B potrzebuję niektórych klas z rozwiązania A. Aby to zrobić, dodaję odwołanie do biblioteki dll jednego z projektów w rozwiązaniu A.

Problem pojawia się, gdy próbuję debugować. Chcę mieć również możliwość wejścia do kodu A. Visual Studio nie jest w stanie załadować kodu dla tych klas („Brak kodu źródłowego dla bieżącej lokalizacji”) i mogę tylko wyświetlić dezasemblację, która nie jest przydatna.

Jedynym sposobem, w jaki znam, aby debugować klasy z rozwiązania A, jest uruchomienie rozwiązania B, odłączenie wszystkich procesów (w pozycji menu Debugowanie) i dołączenie procesu do rozwiązania A.

Jest to jednak bardzo niewygodne i mogę jednocześnie debugować tylko A LUB B.

Czy istnieje sposób, aby zezwolić na przejście do kodu bibliotek DLL, do których istnieją odwołania (dla których mam kod źródłowy)?


Rozwiązanie: Mój błąd polegał na tym, że myślałem, że projekt może być tylko częścią jednego rozwiązania. W rzeczywistości projekt może być częścią dowolnej liczby rozwiązań.
Gdy potrzebujesz odwołać się do starego projektu, po prostu dodaj projekt do rozwiązania. Odbywa się to, klikając prawym przyciskiem myszy nowe rozwiązanie w Eksploratorze rozwiązań> Dodaj> istniejący projekt.
Następnie będziesz mógł dodać odwołanie do projektu. Jak napisali inni, prawdopodobnie powinieneś całkowicie unikać używania odwołań dll do własnego kodu (lub innego kodu, który możesz potrzebować zmienić i debugować).

Bardzo dobre odniesienie do tego, jak należy projektować rozwiązania, można znaleźć w witrynie MSDN .


To łącze MSDN jest obowiązkowe dla programistów .net (niezależnie od używanej kontroli źródła). Dziwię się, że wcześniej tego nie widziałem. Dzięki!
Pat

Nowi gracze, jeśli już wiesz o odwołaniach do projektów, a to nie jest opcja (np. Musisz debugować pakiet NuGet), zignoruj ​​zaakceptowaną odpowiedź i przejdź od razu do tej: stackoverflow.com/a/26029208/398630
BrainSlugs83

Odpowiedzi:


116

Jeśli masz odniesienie do projektu , powinno działać natychmiast.

Jeśli jest to odwołanie do pliku (dll), symbole debugowania (plik „pdb”) muszą znajdować się w tym samym folderze, co dll. Sprawdź, czy Twoje projekty generują symbole debugowania (właściwości projektu => Build => Advanced => Output / Debug Info = full); a jeśli skopiowałeś dll, umieść z nim pdb.

Możesz także ładować symbole bezpośrednio w IDE, jeśli nie chcesz kopiować żadnych plików, ale wymaga to więcej pracy.

Najłatwiej jest skorzystać z referencji do projektów!


3
Niestety, myślę, że nie jest możliwe dodanie odniesienia projektu do projektu z innego rozwiązania (popraw mnie, jeśli się mylę!).
Elad

7
@Elad Właśnie to zrobiłem. Najpierw dodaj „istniejący projekt” do rozwiązania. Następnie dodaj odniesienie do projektu, klikając dodaj odniesienie do projektu. Możesz ustawić punkty przerwania w istniejących plikach projektu. To miłe, ponieważ pliki nie są kopiowane.
user420667

3
Mam projekt DLL jako odniesienie do projektu, ale punkt przerwania w ramach są ignorowane.
Slaus

1
Właściwie udało mi się dzisiaj debugować zestaw (wydanie), który został dodany jako odniesienie do pliku. To dobrze dla mnie, ale jak to się stało? MSVC2010, C #, (ASP) .NET 4.0, przywoływany zestaw istnieje jako wersja debugowania + (ale tylko plik wydania dodany do projektu). Naprawdę chciałbym to wyjaśnić.
Tobias81

1
U mnie to działało jednego dnia, ale następnego dnia nie działało (mając biblioteki DLL i pliki PDB). Naciśnięcie przycisku „Opróżnij pamięć podręczną symboli” w menu Narzędzia> Opcje> Debugowanie> Symbole rozwiązało problem.
Paul

46

Miałem ten sam problem. On jest tym, co znalazłem:

1) upewnij się, że wszystkie projekty używają tej samej struktury (jest to kluczowe!)

2) w Narzędzia / Opcje> Debugowanie> Ogólne upewnij się, że opcja „Włącz tylko mój kod (tylko zarządzany) NIE jest zaznaczona”

3) w Narzędzia / Opcje> Debugowanie> Symbole wyczyść wszystkie zapisane w pamięci podręcznej symbole, odznacz i usuń wszystkie lokalizacje folderów w polu listy „Lokalizacje plików symboli (.pdb)” z wyjątkiem domyślnego „Serwery symboli firmy Microsoft”, ale nadal też odznacz je. Usuń także wszystkie ścieżki statyczne z pola tekstowego „Symbole pamięci podręcznej w tym katalogu”. Kliknij przycisk „Opróżnij pamięć podręczną symboli”. Na koniec upewnij się, że opcja „Tylko określone moduły” jest zaznaczona.

4) w menu Build / Configuration Manager dla wszystkich projektów upewnij się, że konfiguracja jest w trybie debugowania.


3
Mój problem polegał na tym, że moje dwa projekty korzystały z różnych .Net Framework: 4.0 i 4.5. Tx!
user627283

1) i 4) są kluczowe. Nie zapomnij zbudować w trybie debugowania i użyć tej samej struktury.
scott_f,

14

Kolejną kwestią, o której należy pamiętać, jest upewnienie się, że odnośne biblioteki DLL nie są zainstalowane w GAC. Po zakończeniu testów zainstalowałem moje biblioteki DLL w GAC, aby przeprowadzić testy na poziomie systemu. Później, gdy musiałem ponownie debugować kod, nie mogłem wejść do zestawów, do których się odwołujesz, dopóki nie usunąłem ich z GAC.


2
DZIĘKUJĘ CI! To był mój problem. Nie mogę uwierzyć, że tego nie rozgryzłem: - / Myślałem, że ustawienie odniesienia do projektu w jakiś sposób przesłoni to, co zostało zainstalowane w GAC.
SnookerC

Absolutnie! To jest BARDZO dobry punkt. Nawet jeśli masz tę samą wersję .NET Framework, jeśli masz kod w GAC, kiedy próbujesz debugować, nie osiągnie on punktu przerwania, jeśli plik .PDB w GAC jest inny niż ten w folderze projektu. Rozwiązaniem tego problemu jest Un-GAC DLL, skompilowanie, a następnie ponowne GAC zestawu.
DigiOz Multimedia,

8

Krok 1: Przejdź do Narzędzia -> Opcja -> Debugowanie

Krok 2: Odznacz opcję Włącz tylko mój kod

Krok 3: Odznacz opcję Wymagaj dokładnego dopasowania pliku źródłowego do wersji oryginalnej

Krok 4: Odznacz opcję Przejdź przez właściwości i operatory

Krok 5: Przejdź do właściwości projektu -> Debuguj

Krok 6: zaznacz opcję Włącz debugowanie kodu natywnego


4

Miałem *.pdbpliki w tym samym folderze i korzystałem z opcji Arindama , ale nadal nie działało. Okazuje się, że musiałem włączyć opcję Włącz debugowanie kodu natywnego które można znaleźć w sekcji Właściwości projektu> Debuguj .


1
ta informacja powinna być zawarta w zaakceptowanej odpowiedzi. właśnie tego szukałem. dzięki za udostępnienie! +1
Heriberto Lugo

2

Jeśli chcesz ustawić punkt przerwania w kodzie źródłowym biblioteki DLL, do której się odwołuje, najpierw upewnij się, że masz do niej dostępny plik pdb. Następnie możesz po prostu otworzyć powiązany plik kodu źródłowego i ustawić tam punkt przerwania. Plik źródłowy nie musi być częścią rozwiązania. Jak wyjaśniono w Jak mogę ustawić punkt przerwania w przywoływanym kodzie w programie Visual Studio?

Możesz przeglądać swoje punkty przerwania w oknie punktów przerwania, dostępnym poprzez Debugowanie -> Windows -> Punkty przerwania.

Takie podejście ma tę zaletę, że nie musisz dodawać istniejącego projektu do swojego rozwiązania tylko w celu debugowania, ponieważ pomijanie go zaoszczędziło mi dużo czasu na kompilację. Oczywiście zbudowanie rozwiązania zawierającego tylko jeden projekt jest znacznie szybsze niż zbudowanie rozwiązania zawierającego wiele takich projektów.


1
Działa to tylko wtedy, gdy zewnętrzny plik, w którym umieściłeś punkt przerwania, jest zgodny z dokładną ścieżką w PDB. (Np. Działa tylko jeśli zbudowałeś DLL na swoim komputerze.)
Josh M.

2

Upewnij się, że biblioteka DLL nie jest zarejestrowana w GAC. Program Visual Studio użyje wersji w GAC i prawdopodobnie nie będzie zawierał informacji o debugowaniu.


1

Nie chcę włączać projektu zewnętrznej biblioteki klas do niektórych moich rozwiązań, więc wchodzę do zestawów, które używam w inny sposób.

Moje rozwiązania mają katalog „Common Assemblies”, który zawiera moje własne biblioteki DLL z innych projektów. Biblioteki DLL, do których się odwołuję, mają również towarzyszące im pliki PDB do debugowania.

Aby debugować i ustawić punkty przerwania, ustawiam punkt przerwania w źródle używanej aplikacji, w którym wywołuję metodę lub konstruktor z zestawu, a następnie wykonuję INTO (F11) wywołanie metody / konstruktora.

Debuger załaduje plik źródłowy zestawu w programie VS i w tym momencie można ustawić nowe punkty przerwania w zestawie.

Nie jest to proste, ale działa, jeśli nie chcesz dołączać nowego odwołania do projektu i po prostu chcesz odwołać się do zestawu udostępnionego.


0

To musi działać. Kiedyś debugowałem plik .exe i dll w tym samym czasie! Proponuję: 1) Uwzględnij ścieżkę dll w swoim projekcie B, 2) Następnie skompiluj debugowanie projektu A 3) Sprawdź, czy ścieżka wskazuje na plik A dll i de pdb .... 4) Następnie zacznij od debugowania projektu B i jeśli wszystko jest w porządku, będziesz mógł debugować w obu projektach!


0

Najbardziej prostym sposobem, jaki znalazłem przy użyciu VisualStudio 2019 do debugowania biblioteki zewnętrznej, do której odwołujesz się w NuGet, jest wykonanie następujących kroków:

  1. Narzędzia> Opcje> Debugowanie> Ogólne> Odznacz „Włącz tylko mój kod”

  2. Przejdź do Eksplorator zestawu> Otwórz z pamięci podręcznej pakietów NuGet Element listy

  3. Wpisz nazwę pakietu NuGet, który chcesz debugować w polu wyszukiwania i kliknij przycisk „OK” wprowadź opis obrazu tutaj

  4. W Eksploratorze złożenia kliknij prawym przyciskiem myszy zaimportowany zespół i wybierz „Generuj Pdb” wprowadź opis obrazu tutaj

  5. Wybierz niestandardową ścieżkę, w której chcesz zapisać plik .PDB i strukturę, dla której chcesz go wygenerować

    wprowadź opis obrazu tutaj

  6. Skopiuj plik .PDB z folderu wygenerowanego do folderu Debug i możesz teraz ustawić punkty przerwania w kodzie biblioteki tego zestawu


Brzmi dobrze, ale nie mogę znaleźć żadnego Eksploratora Assembly; czy to nie jest część Resharper?
Robert Massa,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.