1

我们有一个跨不同客户运行的 Windows 窗体应用程序,当他们遇到错误时,我们登录到数据库并使用记录的堆栈信息,我们纠正了问题。

但是,有些问题仅在生产中出现,例如堆栈显示

CalculateTotals(方法名称):NullReferenceException:对象引用未设置为对象的实例。

CalculateTotals 是一个方法名称,它有很多子方法调用和更多行,我无法获得它失败的代码的确切行号。

我的应用程序的 PDB 文件没有发送给客户(当他们安装时),

我如何保留该 .PDB 文件的副本(可能位于远程位置,而不是使其成为安装的一部分)并使用它来调试错误并获取确切的行?

4

2 回答 2

2

如果需要,可以在发布中包含 pdb 文件,但也可以使用IntelliTrace在 Visual Studio 中调试生产数据。

简而言之,IntelliTrace:

IntelliTrace 的作用类似于飞机中的黑匣子。它跟踪程序执行中的重要点,并允许您稍后回放在这些点发生的事情。

看看这些博客文章:

当然,您可以搜索网络并找到有关 IntelliTrace 的更多信息。

于 2012-11-07T19:11:08.360 回答
1

只有当 CLR 可以在运行时找到 PDB 文件时,您才会在异常的堆栈跟踪中获得行号信息。您想从远程位置执行此操作使这变得困难,但这并非不可能。CLR 使用的底层 API 是 DIA(调试接口访问),它反过来使用调试 API。

您必须以与设置调试会话相同的方式设置机器,以使调试器使用符号服务器。要求是您首先设置一个可以通过 Internet 访问的符号服务器,类似于 Microsoft 符号服务器。然后设置 _NT_SYMBOL_PATH 环境以引用该服务器。描述此内容的核心 MSDN 库页面位于此处。请注意,如果它不起作用,则不容易进行故障排除。

一种完全不同的方法是从崩溃的进程创建一个小型转储。您需要调用 MiniDumpWriteDump()。请注意,.NET 进程的良好小型转储不是非常小型,您需要管道来拥有足够的存储空间并以某种方式将其传输到您的计算机上。

于 2012-11-07T19:29:11.037 回答