关于调试和释放模式下的堆栈跟踪深度。我得出以下结论(调用exception.ToString()):
在调试模式下,您可以在发布模式下获得带有行号(几帧)的完整堆栈跟踪,而不是完整的堆栈跟踪,只能获得带有行号的try块(单帧)中的抛出方法
- 这是真的吗? - 有没有办法在发布模式下获得完整的堆栈跟踪?
答案 0 :(得分:8)
如果PDB文件与程序集关联,则会在堆栈跟踪中获取行号。即使在Release版本中,您也可以让编译器生成PDB文件并将它们与程序集一起发送。您在编译应用程序时可以使用csc /debug:pdbonly
。在Visual Studio 2010中,您可以使用项目属性 - >构建 - >高级 - > Debug Info = pdb-only来实现同样的目的。
您可以在发布版本中获得完整的堆栈跟踪。但是,编译器可以内联方法并优化尾调用,使堆栈跟踪不同。
答案 1 :(得分:0)
在调试模式下编译将包括Debug语句以及生成* .pdb文件,该文件实际上“保存调试和项目状态信息,允许增量链接程序的调试配置”。链接的深度取决于生成的pdb文件的深度。
答案 2 :(得分:0)
当您在调试模式下运行时,您的应用程序附带了一个调试器,它在.pdb(程序调试数据库)文件的帮助下获取堆栈跟踪。在发布模式中,我们没有pdb或调试器,因此无法获得带有行号的堆栈跟踪。
程序的Debug配置使用完整的符号调试信息进行编译,无需优化。优化使调试变得复杂,因为源代码和生成的指令之间的关系更复杂。
程序的Release配置不包含符号调试信息,并且已完全优化。可以在程序数据库文件(C ++)中生成调试信息,具体取决于所使用的编译器选项。如果以后必须调试发行版本,则创建PDB文件非常有用。