2010-05-28 93 views
1

是否有任何理由不在安装程序中包含pdb文件?我有C++日志记录功能,可以浏览堆栈并报告行号和文件名。如果我的客户可以向我发送包含此信息的日志,那将是非常好的。但是,他们需要pdb文件。是否有任何缺点(安装程序包大小除外)来部署它们?在安装程序中包含pdbs?

+1

IIRC,有一种让Windows记录客户可以发送给您的崩溃转储文件的方法,然后您只需在Visual Studio中打开它,然后直接转到带有堆栈跟踪和所有内容的源代码。没有部署.pdb的。不过,我不记得我在哪里看到了。 – 2010-05-28 01:08:34

回答

3

两种可能的缺点:

  • PDB文件可能会使人更容易进行逆向工程应用程序。
  • 由于以前的结果,有人可能会期望能够在您的DLL中调用未公开的函数。

如果那些不打扰你,我看不出任何缺点。请注意,你并不需要这个。正如John Seigel所说,你应该能够从崩溃转储中重建堆栈跟踪。

+0

我也抓取垃圾箱,但我有一些可处理的“未处理的消息”。我有一个顶级循环,迭代是完全独立的。所以它完全有可能一次迭代爆炸,并且所有其他迭代都可以提供出色的信息。在这种情况下,我不想抓取一个小型转储器,以防上百次迭代都爆炸,但我仍然需要一种获取信息的方法。感谢您的建议。 – Steve 2010-05-28 12:04:19

2

您应该可以在没有PDB文件的情况下实现“行号和文件名”。尝试使用_FUNCTION_,_LINE_和_FILE_。在这里阅读更多:

http://msdn.microsoft.com/en-us/library/b0084kay.aspx

+0

那不会给你造成问题的途径,只有问题的位置。我正在处理15-20种可能的方法。只有其中一些会导致问题。可悲的是,这些问题似乎在客户端出现。我在异常信息中使用这些宏,但是 – Steve 2010-05-28 12:01:31

+0

您是否使用过“StackWalk64”?我不认为它需要PDB文件: http://msdn.microsoft.com/en-us/library/ms680650(VS.85).aspx – 2010-05-28 16:43:15

+0

我使用stackwalk64,但如果你想要func名称,地址和行号你需要的PDB。否则,您只需获取已执行指令的地址 – Steve 2010-05-29 06:06:32

0

相反出货PDB文件,你的错误处理代码可以创建小型转储。请参阅功能MiniDumpWriteDump。 Minidumps非常小,可以通过电子邮件轻松发送。 如果您从客户处获得转储文件,则只需要PDB文件。恕我直言,在你的应用程序中捕获断言或意外错误是一个非常好的主意,自动创建一个小型转储并让你的应用程序发送这个转储给你。如果你真的很喜欢,你建立一个自动化的错误跟踪数据库,其中存储这些小型转储。然后,您可以找出哪些错误是最常见的,需要先修复。无意中,您会发现很多关于您的应用程序运行的环境。哪些操作系统版本是最常见的,哪些病毒扫描程序挂钩到您的应用程序等。

显然,这需要您的用户的同意,因为小型转储可能包含私人信息(但是堆栈中的信息很少)。实现可捕获堆栈溢出异常的工作错误处理程序并不是微不足道的。