Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在没有pdb的情况下,如何在堆栈跟踪中包括行号?_C#_.net_Debugging_Deployment_Pdb Files - Fatal编程技术网

C# 在没有pdb的情况下,如何在堆栈跟踪中包括行号?

C# 在没有pdb的情况下,如何在堆栈跟踪中包括行号?,c#,.net,debugging,deployment,pdb-files,C#,.net,Debugging,Deployment,Pdb Files,我们目前正在分发一个没有.pdb文件的WinForms应用程序,以节省客户端计算机上的空间和下载带宽。当我们得到堆栈跟踪时,我们得到的是方法名,而不是行号。有没有办法在不分发.pdb文件的情况下获取行号?没有。行号是调试信息的一部分,仅存储在pdb文件中。这就是PDB文件首先存在的原因。不,没有。将IL行映射到原始源文件和行号所需的所有信息都存储在PDB中。如果没有PDB,就不可能在堆栈跟踪中获得这些信息。这不是您问题的正确答案,但我有一个建议。您可以合并一个日志机制,并将这些日志文件与堆栈跟踪

我们目前正在分发一个没有.pdb文件的WinForms应用程序,以节省客户端计算机上的空间和下载带宽。当我们得到堆栈跟踪时,我们得到的是方法名,而不是行号。有没有办法在不分发.pdb文件的情况下获取行号?

没有。行号是调试信息的一部分,仅存储在pdb文件中。这就是PDB文件首先存在的原因。

不,没有。将IL行映射到原始源文件和行号所需的所有信息都存储在PDB中。如果没有PDB,就不可能在堆栈跟踪中获得这些信息。

这不是您问题的正确答案,但我有一个建议。您可以合并一个日志机制,并将这些日志文件与堆栈跟踪一起获取。如果在日志消息中包含行号,则可以手动将日志信息与堆栈跟踪合并

如果不想占用太多空间,可以使用大小有限的日志文件,这样只保留最新的日志消息


我们使用log4net库来满足我们的日志记录需求,我建议您查看一下。

除非您捆绑PDB,否则无法直接从应用程序中获取带有行号的堆栈跟踪。但是,如果您拥有与交付给客户的应用程序相同版本的PDB文件,并且您不介意编写一些简单的脚本,那么您可以将.NET堆栈跟踪和IL偏移重新转换为行号


在您的构建过程中,使用、分发作为其卓越的一部分,并将它们存储在安全的地方(例如,源代码管理)。当从客户端获得堆栈跟踪时,可以从XML数据查询IL偏移量以确定相关行号。如果您的堆栈跟踪被提交到网站,您甚至可以自动进行转换,这样开发人员就可以在案例到达其收件箱时获得完整详细的堆栈跟踪。

您不必发送PDB文件就可以获得PDB文件。只要在构建时将其隐藏在某个地方,就可以在获得堆栈跟踪时引用它。看,是的,这是真的。但是你必须有PDB文件才能获得这些信息——因为编译器就是在那里存储这些信息的。你或者其他人能把Pdb2Xml.exe放在网上的某个地方吗?我想它也适用于非托管代码,而且我没有c#编译器。但我只找到了来源。似乎是一个很好的工具。你可以在github上找到这个项目。为了方便您,我还编译了它,您可以在(7Zip解压缩)下载。至于用法:目标程序集的所有依赖项都需要可访问。我只是简单地将所有内容复制到pdb2xml文件夹中。我非常确定,我可以将IL偏移量的一个小得多的版本写入行号,而不会出现在PDB文件中。