2013-11-25 2 views
0

런타임시 스택 추적 정보를 가져 오려고합니다. 별도의 폴더에 바이너리와 PDB의를 넣어, 내가 구축을 위해 노력하고있어 솔루션이 구성되어 그러나다른 폴더에서 PDB를로드 할 때 StackTrace에 소스 파일 정보가 누락되었습니다.

StackTrace trace = new System.Diagnostics.StackTrace(true); 
    StackFrame frame = trace.GetFrame(0); 
    int line = frame.GetFileLineNumber(); 
    Console.WriteLine(line); 

:

나는 다음과 같은 코드를 사용하고,이 기본 프로젝트 구성에서 잘 작동

<PropertyGroup> 
    ... 
    <OutputPath>Binaries\$(Configuration)\bin\</OutputPath> 
    <IntermediateOutputPath>Binaries\$(Configuration)\obj\$(MSBuildProjectName)\</IntermediateOutputPath> 
    <PdbFile>Binaries\$(Configuration)\pdb\$(MSBuildProjectName).pdb</PdbFile> 
    <SkipCopyingSymbolsToOutputDirectory>true</SkipCopyingSymbolsToOutputDirectory> 
</PropertyGroup> 
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    <PlatformTarget>AnyCPU</PlatformTarget> 
    <DebugSymbols>true</DebugSymbols> 
    <DebugType>full</DebugType> 
    <Optimize>false</Optimize> 
    <DefineConstants>DEBUG;TRACE</DefineConstants> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
</PropertyGroup> 

나는 Visual Studio에서 PDB가로드 된 Modules 창에서 확인할 수 있습니다. 그러나 frame 변수에는 소스 파일 (파일 이름, 줄 및 열)에 대한 정보가 없습니다. .pdb와 .exe를 같은 폴더에 복사하면 출력이 다시 올바르게됩니다.

따라서, 지금까지의 내가 이해 :

케이스). 내가 이해할 수없는 것은 인데 왜인데 PDB가로드되었지만 소스 파일/라인 정보를 얻을 수 없다.

그래서 질문은입니다 : .pdb가 다른 위치에서로드되었을 때 소스 파일에 대한 정보가 들어있는 스택 추적을 얻을 수 있습니까? 그렇지 않다면, 왜?

+0

Visual Studio의 버전과 .Net의 버전은 무엇입니까? – OmegaMan

+0

VS2012 및 타겟팅 .Net 4.0을 사용하고 있습니다. – nevermind

답변

2

단지 CLR에게 PDB를 찾기가 힘듭니다. 디버거의 모듈 창에 표시되는 정보는 관련이 없으며 디버거에만 중요합니다. CLR에는 PDB를 찾고 읽는 자체 메커니즘이 있습니다. 필연적으로 이것은 여전히 ​​사용자의 컴퓨터에서 디버거없이 작동해야합니다.

CLR에 환경 변수 설정 위치를 알려주는 것이 기술적으로 가능합니다.

var appdir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); 
var pdbdir = System.IO.Path.Combine(appdir, "pdbs"); 
Environment.SetEnvironmentVariable("_NT_SYMBOL_PATH", pdbdir); 

을하거나 그것을 힘든 시간을주지 않고 같은 디렉토리에 넣어 :라는 이름의 서브 디렉토리에 PDB 파일을 저장 말 "PDB의는"당신은 당신의 main() 메소드에이 코드를 넣을 수 있습니다 EXE로

+0

자세한 설명을 주셔서 감사합니다. CLR이 PDB를 찾는 데 다른 알고리즘을 사용한다는 것을 몰랐습니다. '_NT_SYMBOL_PATH' 설정이 완벽하게 작동했습니다! 그러나 완전히 이해하기 위해 PDB 조회 (예 : , <_NT_SYMBOL_PATH>, ... 다른 것) 중에 CLR이 조사하는 다른 폴더가 있습니까? 불행히도 CLR의 메커니즘과 관련이있는 것은 없습니다. – nevermind

1

다른 위치에서 .pdb를로드 할 때 소스 파일에 대한 정보가 들어있는 스택 추적을 얻을 수 있습니까?

네,하지만 현재 위치에없는 경우 Visual Studio에 위치를 알려줘야합니다. 대체 PDB 폴더의 위치를 ​​추가하여 VS에서 Tools ->Options ->Symbols 위치를 지정하십시오.

자세한 내용은 Specify Symbol (.pdb) and Source Files in the Visual Studio Debugger의 심볼 위치 및로드 동작 지정 섹션을 참조하십시오.

+0

Visual Studio가 사용자 컴퓨터에 없을 것입니다.) –

+0

고마워요.하지만 도움이되지 않습니다. 질문에서 언급했듯이 VS가 이미로드 할 수 있기 때문입니다. 올바른 PDB (프로젝트가 내 컴퓨터에 구축 되었기 때문에) – nevermind

관련 문제