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 .

Elad
źródło
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!

Marc Gravell
źródło
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.

scott_f
źródło
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.

KevinHou
źródło
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

Arindam Dhar
źródło
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 .

Roald
źródło
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.

Carl in 't Veld
źródło
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.

Guillermo Prandi
źródło
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.

Jeff LaFay
źródło
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!

Matthieu
źródło
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

magicode118
źródło
Brzmi dobrze, ale nie mogę znaleźć żadnego Eksploratora Assembly; czy to nie jest część Resharper?
Robert Massa,