获取调试版本和发布版本中有问题代码的行号

本文关键字:版本 有问题 代码 调试 布版本 获取 | 更新日期: 2023-09-27 18:19:16

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

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捕获了崩溃转储。下面是每个构建的堆栈跟踪。正如您所看到的,我在两个版本中都得到了行号。明显的区别是,在发布版本中,它没有报告对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编译器无疑内联了方法调用——这就是为什么行号不同的原因。