2013-11-25 20 views
0

我試圖在運行時獲取堆棧跟蹤信息。當從另一個文件夾加載PDB時StackTrace中缺少源文件信息

我用下面的代碼,這個工作在默認的項目配置罰款:

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

不過,我試圖來構建解決方案被配置爲把二進制文件和PDBS到單獨的文件夾:

<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中的Modules窗口中看到PDB已加載。但是,frame變量不包含有關源文件(文件名,行和列)的信息。如果我將.pdb和.exe複製到同一個文件夾,則輸出再次正確。

因此,據我的理解:

  • PDB是正確的(包含必要的信息),因爲它的工作原理,當我把文件複製到同一文件夾
  • Visual Studio是能夠加載PDB,這樣的搜索路徑也應該是正確的

我已經在網上搜索(包括http://msdn.microsoft.com/en-us/library/ee416588.aspxDisplay lines number in Stack Trace for .NET assembly in Release mode),但所有的文章主要集中在從正確位置加載PDBS(而據我而言,這不是 案件)。我不明白的是爲什麼沒有獲得源文件/行信息,雖然PDB被加載。

所以,問題是:當從不同位置加載.pdb時,是否可以獲取包含源文件信息的Stack Trace?如果不是,爲什麼?

+0

哪個版本的Visual Studio和哪個版本的.Net? – OmegaMan

+0

我使用的VS2012和目標。淨4.0 – nevermind

回答

2

您只是給CLR一個難以定位PDB的位置。您在調試器的「模塊」窗口中看到的信息不相關,只對調試器很重要。 CLR有自己的機制來定位和閱讀PDB。必須如此,這仍然需要在用戶的機器上沒有調試器的情況下工作。

通過設置環境變量,在技術上可以告訴CLR在哪裏查看。說你存儲在一個名爲的子目錄PDB文件「PDBS」,那麼你可以把這個代碼在您的Main()方法:

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); 

或者只是不給它一個困難時期,並把它們放在同一個目錄作爲你的EXE。

+0

感謝您的詳細解釋。不知道CLR使用不同的算法來定位PDB。設置_NT_SYMBOL_PATH工作完美!但是,爲了完全理解,CLR在PDB查找過程中是否還有其他文件夾(例如<模塊目錄>,<_NT_SYMBOL_PATH>,...其他?)。不幸的是,我找不到任何與CLR機制有關的東西。 – nevermind

1

當從不同位置加載.pdb時,是否可以獲取包含有關 源文件的信息的Stack Trace?

是的,但是如果它不在當前目錄中,你需要告訴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

相關問題