C# 在调试版本与发布版本中获取违规代码的行号

C# 在调试版本与发布版本中获取违规代码的行号,c#,release,windbg,debug-symbols,sos,C#,Release,Windbg,Debug Symbols,Sos,我的理解是,通过调试构建的崩溃转储,您可以获得堆栈跟踪的行号,而发布构建不会发生这种情况。为了尝试这一点,我创建了一个非常简单的崩溃应用程序 class Program { static void Main(string[] args) { Console.WriteLine("Press any key to continue"); Console.ReadKey(); TestMe(null);

我的理解是,通过调试构建的崩溃转储,您可以获得堆栈跟踪的行号,而发布构建不会发生这种情况。为了尝试这一点,我创建了一个非常简单的崩溃应用程序

class Program  
{  
    static void Main(string[] args)  
    {  
        Console.WriteLine("Press any key to continue");  
        Console.ReadKey();  
        TestMe(null);  
    }  


    static void TestMe(MyClass c)  
    {  
        Console.WriteLine(c.Field);  
    }  
}  

class MyClass  
{  
    public string Field { get; set; }  
}  
我创建了一个调试版本和一个发布版本。通过ADPlus运行这两个和catpured崩溃转储。下面是每个构建的堆栈跟踪。正如你所看到的,我在两个版本中都得到了行号。明显的区别在于,在发布版本中,它并没有报告对TestMe方法的调用。你知道为什么吗?在这两种情况下,我是否需要向应用程序pdb文件添加符号路径

调试生成

0:000> !CLRStack  
OS Thread Id: 0x2398 (0)  
Child SP IP       Call Site  
001eee74 003400db ConsoleApplication1.Program.TestMe(ConsoleApplication1.MyClass)*** WARNING: Unable to verify checksum for ConsoleApplication1.exe  
 [c:\ConsoleApplication1\ConsoleApplication1\Program.cs @ 20]  
001eee84 003400a5 ConsoleApplication1.Program.Main(System.String[]) [c:\ConsoleApplication1\ConsoleApplication1\Program.cs @ 14]  
001ef0c8 6ccb21bb [GCFrame: 001ef0c8] 
发布版本

0:000> !CLRStack  
OS Thread Id: 0x2e40 (0)  
Child SP IP       Call Site  
003bf5f8 772af8c1 [GCFrame: 003bf5f8] Unknown  
003bf3b4 002b0098 ConsoleApplication1.Program.Main(System.String[])*** WARNING: Unable to verify checksum for ConsoleApplication1.exe  
 [c:\ConsoleApplication1\ConsoleApplication1\Program.cs @ 14]  
003bf5f8 6ccb21bb [GCFrame: 003bf5f8]   

在发布版本中,JIT编译器无疑是在内联方法调用-这就是行号不同的原因。

那么发布版本也会在堆栈跟踪中报告行号吗?我认为这只发生在调试版本中。@palmsnow:我相信调试版本中的调试信息比发布版本中的要多,而且显然您仍然需要pdb文件可用,但如果它给您行号,那就很有帮助:)(在许多使用版本构建的地方,PDB没有发货,这可能会导致混淆。)虽然JIT编译器将内联调用可能是对的,但最顶端的堆栈帧位于完全不同的地址,因此我怀疑这与内联有任何关系。我认为地址指向SEH代码。@Jon,当你说debug build有更多的调试信息时,你能提供一些具体的示例(或链接)吗在调试版本中,我到底可以得到哪些在发布版本中无法得到的内容?@palmsnow:调试版本没有发布版本优化得那么积极,因此您可以轻松找到局部变量和参数。此外,内联调用使发布版本的堆栈跟踪读起来更加复杂。可能存在重复的