我们有一个运行于不同客户的Windows窗体应用程序,当他们收到错误时,我们会登录到数据库&使用记录的堆栈信息,我们纠正了问题。
但是,只有在生产中才会出现问题,例如,堆栈显示
CalculateTotals(方法名称):NullReferenceException:未将对象引用设置为对象的实例。
CalculateTotals是一个方法名称,它有很多子方法调用&更多行,我无法获得失败的代码的确切行#。
我的应用程序的PDB文件不会发送给客户(安装时),
如何保留该.PDB文件的副本(可能位于远程位置和 不要把它作为安装的一部分)并使用它 调试错误&得到确切的行?
答案 0 :(得分:2)
如果需要,可以在发行版中包含pdb文件,但也可以使用 IntelliTrace 从Visual Studio中的生产中调试数据。
简而言之,IntelliTrace:
IntelliTrace扮演的角色类似于飞机上的黑匣子。它会跟踪程序执行中的重要点,并允许您在以后回放这些点上发生的事情。
看一下这些博文:
当然,您可以搜索网络并找到有关IntelliTrace的更多信息。
答案 1 :(得分:1)
当CLR可以在运行时找到PDB文件时,您将只在异常的堆栈跟踪中获取行号信息。想要从远程位置做到这一点,你正在变得困难,但这并非不可能。 CLR使用的底层API是DIA(调试接口访问),后者又使用调试API。
您必须以与设置调试会话相同的方式设置计算机,以使调试器使用符号服务器。要求是您首先设置可以通过Internet访问的符号服务器,类似于Microsoft Symbol Server。然后设置_NT_SYMBOL_PATH环境以引用该服务器。描述此is here的核心MSDN Library页面。请注意,如果它不起作用, 很容易排除故障。
一种完全不同的方法是从崩溃的进程中创建一个minidump。你需要pinvoke MiniDumpWriteDump()。请注意,.NET进程的一个好的minidump不是很小,你需要管道才能有足够的存储空间,并以某种方式将它运送到你的机器上。