【问题标题】:exception ToString(): debug versus release mode异常 ToString():调试与发布模式
【发布时间】:2011-01-23 03:14:08
【问题描述】:

关于调试和发布模式下的堆栈跟踪深度。我得出以下结论(调用exception.ToString()):

在调试模式下,您会在发布模式下获得带有行号(几帧)的完整堆栈跟踪,而不是在完整的堆栈跟踪中,您只能在带有行号的 try 块(单帧)中获得 throwing 方法

-是真的吗? - 有没有办法在发布模式下获得完整的堆栈跟踪?

【问题讨论】:

    标签: c#


    【解决方案1】:

    如果您有与您的程序集关联的 PDB 文件,您将在堆栈跟踪中获得行号。即使在发布版本中,您也可以让编译器生成 PDB 文件并将它们与您的程序集一起发布。您可以在编译应用程序时使用csc /debug:pdbonly。在 Visual Studio 2010 中,您可以使用 Project Properties -> Build -> Advanced -> Debug Info = pdb-only 来实现相同的功能。

    更新(堆栈跟踪深度):

    您可以在发布版本中获得完整的堆栈跟踪。但是,编译器可能会内联方法并优化尾调用,从而使堆栈跟踪有所不同。

    【讨论】:

    • 我问的是堆栈跟踪深度(堆栈上的帧数),而不是行号
    • +1 指出可以在发布模式下生成 pdb 文件
    • @pumiki 哦,我明白了。更新了答案。
    【解决方案2】:

    当您在调试模式下运行时,您的应用程序会附带一个调试器,它在 .pdb(程序调试数据库)文件的帮助下获取堆栈跟踪。在发布模式下,我们没有 pdb 或调试器,因此无法获取带有行号的堆栈跟踪。

    程序的调试配置是使用完整的符号调试信息编译的,没有优化。优化使调试复杂化,因为源代码和生成的指令之间的关系更加复杂。

    您的程序的发布配置不包含符号调试信息,并且已完全优化。调试信息可以在程序数据库文件 (C++) 中生成,具体取决于所使用的编译器选项。如果您以后必须调试发布版本,创建 PDB 文件会非常有用。

    【讨论】:

      【解决方案3】:

      在调试模式下编译将包括 Debug 语句以及生成一个 *.pdb 文件,该文件实际上“保存调试和项目状态信息,允许增量链接程序的调试配置”。链接的深度取决于生成的 pdb 文件的深度。

      http://msdn.microsoft.com/en-us/library/ms241903.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-18
        • 1970-01-01
        • 2011-04-02
        • 2013-05-15
        • 1970-01-01
        • 2011-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多