【发布时间】:2011-01-23 03:14:08
【问题描述】:
关于调试和发布模式下的堆栈跟踪深度。我得出以下结论(调用exception.ToString()):
在调试模式下,您会在发布模式下获得带有行号(几帧)的完整堆栈跟踪,而不是在完整的堆栈跟踪中,您只能在带有行号的 try 块(单帧)中获得 throwing 方法
-是真的吗? - 有没有办法在发布模式下获得完整的堆栈跟踪?
【问题讨论】:
标签: c#
关于调试和发布模式下的堆栈跟踪深度。我得出以下结论(调用exception.ToString()):
在调试模式下,您会在发布模式下获得带有行号(几帧)的完整堆栈跟踪,而不是在完整的堆栈跟踪中,您只能在带有行号的 try 块(单帧)中获得 throwing 方法
-是真的吗? - 有没有办法在发布模式下获得完整的堆栈跟踪?
【问题讨论】:
标签: c#
如果您有与您的程序集关联的 PDB 文件,您将在堆栈跟踪中获得行号。即使在发布版本中,您也可以让编译器生成 PDB 文件并将它们与您的程序集一起发布。您可以在编译应用程序时使用csc /debug:pdbonly。在 Visual Studio 2010 中,您可以使用 Project Properties -> Build -> Advanced -> Debug Info = pdb-only 来实现相同的功能。
您可以在发布版本中获得完整的堆栈跟踪。但是,编译器可能会内联方法并优化尾调用,从而使堆栈跟踪有所不同。
【讨论】:
当您在调试模式下运行时,您的应用程序会附带一个调试器,它在 .pdb(程序调试数据库)文件的帮助下获取堆栈跟踪。在发布模式下,我们没有 pdb 或调试器,因此无法获取带有行号的堆栈跟踪。
程序的调试配置是使用完整的符号调试信息编译的,没有优化。优化使调试复杂化,因为源代码和生成的指令之间的关系更加复杂。
您的程序的发布配置不包含符号调试信息,并且已完全优化。调试信息可以在程序数据库文件 (C++) 中生成,具体取决于所使用的编译器选项。如果您以后必须调试发布版本,创建 PDB 文件会非常有用。
【讨论】:
在调试模式下编译将包括 Debug 语句以及生成一个 *.pdb 文件,该文件实际上“保存调试和项目状态信息,允许增量链接程序的调试配置”。链接的深度取决于生成的 pdb 文件的深度。
【讨论】: