2009-12-16 4 views
10

Visual C#을 사용하여 대형 C# 프로젝트를 디버깅하고 있습니다. 이 프로젝트는 매우 커서 일부 pdbs 만 직접 빌드됩니다. 모든 pdb를 만들 수 있지만 시간이 많이 걸립니다. 백 트레이스를 디버깅하고 있지만 트레이스의 일부는 [외부 코드]로 표시되어 있습니다. 일부 pdb가 누락되었음을 알고 있지만, 외부 코드가 상주하는 DLL을 어떻게 알 수 있습니까? C에서 나는 EIP가 어디서 EIP가 살고 있는지를 결정하기 위해 프로세스 맵핑을 볼 수있다. 그러나 이것이 닷넷 환경에서 어떻게 이루어질 수 있는가?Visual C# 백 트레이스 : [외부 코드]가있는 위치를 확인하는 방법?

답변

23

도구로 이동 | 옵션 | 디버깅 | 일반 및 의 "내 코드 만 사용"확인란의 선택을 취소하십시오. 이제 Visual Studio에서 전체 호출 스택을 표시합니다 (적어도 관리 코드의 경우 "기본에서 관리되는 전환"까지 볼 수 있음).

+0

네 오, 그것은 보여줍니다? –

+0

관리되지 않는 코드에 대한 기호 (PDB)가 없으면 가능하지 않다고 생각합니다. 관리되는 어셈블리에는 메타 데이터가 포함되어 있기 때문에 VS는 스택 추적의 관리되는 부분에 대해이를 수행 할 수 있지만 관리되지 않는 코드에는 동일한 메타 데이터가 없으므로 VS가 메서드 호출을 다시 구성 할 수 없습니다. 그러나 모듈 창이나 "소스를 사용할 수없는 경우 디스 어셈블리 표시"옵션을 사용하여 비트를 약간 고정시킬 수는 있습니다. 그러나이 작업을 수행 한 경험이 없습니다. 미안합니다. – itowlson

+0

감사합니다. 전에 리눅스에서했던 일은 EIP (0x800453c)를 얻은 다음 동적 DLL 맵의 맵을 얻은 다음 EIP가 빠지는 DLL을 얻을 수 있습니다. 그것은 Visual C#에서 할 수 있습니까? –

1

그래서 프로젝트가 정말 크다면 모든 클래스가 네임 스페이스에 잘 공유되어 있고 모든 어셈블리의 이름이 네임 스페이스의 이름을 따서 명명된다는 것보다 훨씬 낫습니다. 따라서 외부 코드가 시작되는 곳 (또는 끝나는 곳)을 살펴보면 호출이 어디에서 발생했는지 (또는 끝까지) 찾아야하며 누락 된 어셈블리 pdb를 결정해야합니다. 가 \t [관리 전환 네이티브]를 \t \t이 \t [기본 전환에 관리] 그러나 전환이 간다 어디 얻을 수 있습니다 :

+0

실제로 생각하는 것처럼 쉽지는 않습니다 ... –

+0

하지만 솔루션, 프로젝트, 어셈블리, 네임 스페이스, 클래스 계층 구조. 회고로 고치는 것은 지루하고 비싸다. 따라서 다음 프로젝트를 배우고 처음에는 좋은 구조를 구현하십시오. – Oliver

+0

지금은 방금 모든 pdbs (어쩌면 밤새)를 만들었습니다. 이것은 며칠 동안 (아마도 존재하지 않을 수도있는) 솔루션을 검색하는 것보다 빠를 것입니다. – Oliver

관련 문제