【问题标题】:getting line numbers of offending code in debug vs release builds在调试与发布版本中获取违规代码的行号
【发布时间】:2012-02-01 18:40:43
【问题描述】:

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

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]   

【问题讨论】:

标签: c# release windbg debug-symbols sos


【解决方案1】:

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

【讨论】:

  • 所以发布版本还报告堆栈跟踪中的行号?我认为它只发生在调试版本中。
  • @palmsnow:我相信调试版本中的调试信息比发布版本要多,显然你仍然需要 pdb 文件可用,但如果它给你行号,那么这很有帮助 :) (在许多使用发布版本的地方,PDB没有发货,这可能会导致混乱。)
  • 虽然 JIT 编译器将内联调用可能是对的,但最顶层的堆栈帧位于完全不同的地址,所以我怀疑这与内联有什么关系。我认为该地址指向 SEH 代码。
  • @Jon,当你说调试版本有更多的调试信息时,你能否提供一些具体的例子(或链接),说明我在调试版本中究竟可以获得什么,而我在发布版本中无法获得?
  • @palmsnow:调试版本的优化不如发布版本那么积极,因此您可以轻松找到本地变量和参数。此外,内联调用使堆栈跟踪对于发布版本的读取更加复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 2010-10-27
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多