참조 된 DLL을 디버깅하는 방법 (pdb 사용)


132

내 작업 공간에는 A와 B의 두 가지 솔루션이 있습니다.

솔루션 A는 얼마 전에 코딩을 마친 오래된 프로젝트입니다. 솔루션 B에서는 솔루션 A의 일부 클래스를 사용해야합니다. 그렇게하려면 솔루션 A의 프로젝트 중 하나의 dll에 대한 참조를 추가합니다.

문제는 디버깅하려고 할 때입니다. A의 코드로 들어갈 수 있기를 원합니다. Visual Studio는 이러한 클래스에 대한 코드를로드 할 수 없으며 ( "현재 위치에 사용할 수있는 소스 코드가 없습니다.") 분해 만 볼 수 있으므로 유용하지 않습니다.

솔루션 A에서 클래스를 디버깅하는 유일한 방법은 솔루션 B를 실행하고 모든 프로세스를 분리하고 (디버그 메뉴 항목에서) 솔루션 A에서 프로세스를 연결하는 것입니다.

그러나 이것은 매우 불편하며 한 번에 A OR B 만 디버깅 할 수 있습니다.

참조 된 dll 코드로 스테핑 할 수있는 방법이 있습니까 (소스 코드가 있습니까)?


솔루션 : 실수는 프로젝트가 단일 솔루션의 일부일 수 있다고 생각했습니다. 실제로 프로젝트는 여러 솔루션의 일부가 될 수 있습니다.
이전 프로젝트를 참조해야 할 경우 간단히 프로젝트를 솔루션에 추가해야합니다. 솔루션 탐색기> 추가> 기존 프로젝트에서 새 솔루션을 마우스 오른쪽 버튼으로 클릭하면됩니다.
그런 다음 프로젝트 참조를 추가 할 수 있습니다. 다른 사람들이 작성한 것처럼 자신의 코드 (또는 변경하고 디버그 해야하는 다른 코드)에 대한 dll 참조를 사용하지 않아야합니다.

솔루션 디자인 방법에 대한 아주 좋은 참고 자료는 MSDN 에서 찾을 수 있습니다 .


MSDN 링크는 .net 개발자가 반드시 읽어야합니다 (사용하는 소스 제어에 관계없이). 일찍 보지 못해서 놀랐습니다. 감사!
Pat

프로젝트 참조에 대해 이미 알고 있고 옵션이 아닌 경우 (예 : NuGet 패키지를 디버깅해야 함)
새로운 응답자

답변:


113

프로젝트 참조 가 있으면 즉시 작동합니다.

그것은 경우 파일 (DLL) 참조, 당신은 디버깅 심볼 (이하 "PDB"파일)이 dll을 같은 폴더에 있어야합니다. 프로젝트가 디버그 기호를 생성하는지 확인하십시오 (프로젝트 속성 => 빌드 => 고급 => 출력 / 디버그 정보 = 전체). 그리고 dll 을 복사 했다면 pdb를 넣으십시오.

파일을 복사하지 않으려는 경우 IDE에서 직접 기호를로드 할 수도 있지만 더 효과적입니다.

가장 쉬운 옵션은 프로젝트 참조를 사용하는 것입니다!


3
불행히도, 다른 솔루션에서 프로젝트에 프로젝트 참조를 추가 할 수 없다고 생각합니다 (잘못되면 수정하십시오!).
Elad

7
@Elad 방금 이렇게했습니다. 먼저 "기존 프로젝트"를 솔루션에 추가하십시오. 그런 다음 프로젝트 참조 추가를 클릭하여 프로젝트에 대한 참조를 추가하십시오. 기존 프로젝트 파일에서 중단 점을 설정할 수 있습니다. 파일이 복사되지 않기 때문에 좋습니다.
user420667

3
DLL 프로젝트를 프로젝트 참조로 사용하지만 중단 점은 무시됩니다.
Slav

1
실제로 파일 참조로 추가 된 오늘 (릴리스) 어셈블리를 디버깅 할 수있었습니다. 나에게는 좋지만 어떻게 된 일입니까? MSVC2010, C #, (ASP) .NET 4.0, 참조 된 어셈블리는 디버그 + 릴리스로 존재하지만 프로젝트에 릴리스 파일 만 추가됩니다. 이것을 명확히하고 싶습니다.
Tobias81

1
나를 위해 그것은 하루에 일하고 있었지만 그 다음 날에는 작동하지 않았습니다 (DLL 및 PDB 파일 사용). 도구> 옵션> 디버깅> 심볼에서 "빈 심볼 캐시"버튼을 누르면 문제가 해결되었습니다.
Paul

45

나는 같은 문제가 있었다. 그는 내가 찾은 것입니다 :

1) 모든 프로젝트가 동일한 프레임 워크를 사용하고 있는지 확인하십시오 (이것은 중요합니다!)

2) 도구 / 옵션> 디버깅> 일반에서 "내 코드 만 활성화 (관리 전용)가 선택되어 있지 않은지 확인하십시오.

3) 도구 / 옵션> 디버깅> 기호에서 캐시 된 기호를 지우고 기본 "Microsoft Symbol 서버"를 제외한 "기호 파일 (.pdb) 위치"목록 상자 아래의 모든 폴더 위치를 선택 취소하고 여전히 선택 해제하십시오. "이 디렉토리의 캐시 기호"텍스트 상자에서 정적 경로도 삭제하십시오. "빈 심볼 캐시"버튼을 클릭하십시오. 마지막으로 "지정된 모듈 만"라디오 버튼이 선택되어 있는지 확인하십시오.

4) 모든 프로젝트의 Build / Configuration Manager 메뉴에서 구성이 디버그 모드인지 확인하십시오.


3
내 문제는 내 두 프로젝트가 서로 다른 .Net Frameworks를 사용한다는 것입니다 : 4.0과 4.5. Tx!
user627283

1)과 4)가 중요합니다. 디버그 모드에서 빌드하고 동일한 프레임 워크를 사용하는 것을 잊지 마십시오.
scott_f

12

명심해야 할 또 다른 사항은 참조 된 dll이 GAC에 설치되어 있지 않은지 확인하십시오. 테스트 후 시스템 수준 테스트를 수행하기 위해 dll을 GAC에 설치했습니다. 나중에 코드를 다시 디버깅해야 할 때 GAC에서 삭제하기 전까지는 참조 된 어셈블리를 사용할 수 없었습니다.


2
감사합니다! 이것은 내 문제였다. 나는 이것을 이해하지 못했다는 것을 믿을 수 없다 :-/ 프로젝트 참조를 설정하면 GAC에 설치된 것을 무시할 것이라고 생각했다.
SnookerC

물론! 이것은 매우 좋은 지적입니다. 동일한 버전의 .NET Framework를 사용하더라도 디버깅을 시도 할 때 GAC에 코드가 있으면 GAC의 .PDB 파일이 프로젝트 폴더의 파일과 다르면 중단 점에 도달하지 않습니다. 이에 대한 해결책은 DLL을 Un-GAC하고 어셈블리를 빌드 한 다음 다시 GAC하는 것입니다.
DigiOz Multimedia

7

1 단계 : 로 이동 도구 -> 옵션 -> 디버깅

2 단계 : 내 코드 만 활성화를 선택 취소합니다

3 단계 : 원본 파일이 원본 버전과 정확히 일치해야 함을 선택 취소합니다

4 단계 : 속성 및 연산자에 대한 단계 해제를 선택 취소하십시오 .


3

나는 *.pdb같은 폴더에 파일을 가지고 있었고 Arindam 의 옵션을 사용 했지만 여전히 작동하지 않았습니다. 프로젝트 속성> 디버그 에서 찾을 수있는 네이티브 코드 디버깅 사용 을 활성화해야한다는 것이 밝혀졌습니다 .


1
이 정보는 허용 된 답변에 포함되어야합니다. 내가 구체적으로 찾고 있던 것. 공유해 주셔서 감사합니다! +1
Heriberto Lugo

2

참조 된 dll의 소스 코드에 중단 점을 설정하려면 먼저 pdb 파일을 사용할 수 있는지 확인하십시오. 그런 다음 관련 소스 코드 파일을 열고 그 위에 중단 점을 설정할 수 있습니다. 소스 파일은 솔루션의 일부일 필요는 없습니다. Visual Studio에서 참조 코드에서 중단 점을 설정하는 방법에 설명 된대로

디버그-> Windows-> 중단 점을 통해 사용 가능한 중단 점 창을 통해 중단 점을 검토 할 수 있습니다.

이 접근법은 기존 프로젝트를 디버깅 목적으로 만 솔루션에 기존 프로젝트를 추가 할 필요가 없다는 이점이 있습니다. 분명히 하나의 프로젝트로 솔루션을 구축하는 것이 많은 솔루션을 구축하는 것보다 훨씬 빠릅니다.


1
중단 점을 배치 한 외부 파일이 PDB의 정확한 경로와 일치하는 경우에만 작동합니다. (예 : 컴퓨터에 DLL을 빌드 한 경우에만 작동합니다.)
Josh M.

2

DLL이 GAC에 등록되어 있지 않은지 확인하십시오. Visual Studio는 GAC의 버전을 사용하며 디버깅 정보가 없을 것입니다.


1

일부 솔루션에 외부 클래스 라이브러리 프로젝트를 포함하고 싶지 않으므로 다른 방식으로 소비하는 어셈블리를 시작합니다.

내 솔루션에는 다른 프로젝트의 내 DLL이 포함 된 "공통 어셈블리"디렉토리가 있습니다. 내가 참조하는 DLL에는 디버깅을 위해 동반되는 PDB 파일도 있습니다.

중단 점을 디버그하고 설정하기 위해 소비 애플리케이션의 소스에 중단 점을 설정하여 어셈블리에서 메소드 또는 생성자를 호출 한 다음 INTO (F11) 단계에서 메소드 / 생성자 호출을 수행합니다.

디버거는 어셈블리의 소스 파일을 VS에로드하고 해당 시점에서 어셈블리 내부의 새로운 중단 점을 설정할 수 있습니다.

간단하지는 않지만 새 프로젝트 참조를 포함하지 않고 단순히 공유 어셈블리를 참조하려는 경우 작동합니다.


0

작동해야합니다. .exe 파일과 dll을 동시에 디버깅하는 데 사용했습니다! 내가 제안하는 것은 1) B 프로젝트에 dll의 경로를 포함 시키십시오 .2) 그런 다음 A 프로젝트를 디버그로 컴파일하십시오 .3) 경로가 A dll 및 de pdb 파일의 경로를 가리 키도록 제어하십시오 .... 4) B 프로젝트 디버그에서 시작하고 모든 것이 정상이면 두 프로젝트 모두에서 디버그 할 수 있습니다!


0

NuGet에서 참조하는 외부 라이브러리를 디버깅하기 위해 VisualStudio 2019를 사용하여 찾은 가장 확실한 방법은 다음 단계를 수행하는 것입니다.

  1. 도구> 옵션> 디버깅> 일반> '내 코드 만 사용'을 선택 해제

  2. 어셈블리 탐색기로 이동> NuGet 패키지 캐시에서 열기 아이템 목록

  3. 검색 필드에 디버깅하려는 NuGet 패키지 이름을 입력하고 '확인'을 클릭하십시오 여기에 이미지 설명을 입력하십시오

  4. 어셈블리 탐색기에서 가져온 어셈블리를 마우스 오른쪽 단추로 클릭하고 'Pdb 생성'을 선택하십시오. 여기에 이미지 설명을 입력하십시오

  5. .PDB 파일을 저장할 사용자 정의 경로와이를 생성 할 프레임 워크를 선택하십시오.

    여기에 이미지 설명을 입력하십시오

  6. 생성 된 폴더에서 .PDB 파일을 디버그 폴더로 복사하면이 어셈블리의 라이브러리 코드에서 중단 점을 설정할 수 있습니다.


Assembly Explorer를 찾을 수 없다는 점을 제외하면 양호하게 들립니다. Resharper의이 부분이 아닙니까?
Robert Massa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.