【问题标题】:Include pdbs in installer?在安装程序中包含 pdbs?
【发布时间】:2010-05-28 00:55:05
【问题描述】:

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

【问题讨论】:

  • IIRC,有一种方法可以让 Windows 记录客户可以发送给您的故障转储文件,然后您所做的就是在 Visual Studio 中打开它,然后它直接进入源代码堆栈跟踪和一切。没有部署 .pdb。不过,我不记得我在哪里看到的。

标签: c++ symbols


【解决方案1】:

两个可能的缺点:

  • PDB 文件可能使某人更容易对您的应用程序进行逆向工程。
  • 由于前面的原因,有人可能会期望能够在您的 DLL 中调用未记录的函数。

如果这些不打扰您,我看不出有任何不利之处。请注意,您实际上并不需要这个。正如 John Seigel 所说,您应该能够从故障转储中重建堆栈跟踪。

【讨论】:

  • 我也抓取转储,但我有一些可以处理的“未处理的异常”。我有一个顶级循环,其中迭代是完全独立的。因此,完全有可能一次迭代被炸毁,而所有其他迭代都提供出色的信息。在那种情况下,我不想抓住一个小型转储,以防所有数百次迭代都崩溃,但我仍然需要一种获取信息的方法。感谢您的建议。
【解决方案2】:

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

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

【讨论】:

  • 这并没有给你导致问题的途径,只有问题的位置。我正在处理的特定部分有 15-20 种可能的方法。只有其中一些会导致问题。可悲的是,这些问题似乎出现在客户网站上。我确实在异常信息中使用了这些宏,但是
  • 你用过“StackWalk64”吗?我认为它不需要 PDB 文件:msdn.microsoft.com/en-us/library/ms680650(VS.85).aspx
  • 我使用的是 stackwalk64,但是如果你想要函数名称、地址和行号,你需要 pdbs。否则你只会得到执行指令的地址
【解决方案3】:

您的错误处理代码可以创建小型转储,而不是发送 PDB 文件。见功能MiniDumpWriteDump。 Minidump 非常小,可以通过电子邮件轻松发送。 如果您从客户那里获得转储文件,则只需要 PDB 文件。

恕我直言,在您的应用程序中捕获断言或意外错误、自动创建一个小型转储并让您的应用程序将此转储发送给您是一个非常好的主意。如果您真的很喜欢,您可以自己构建一个自动错误跟踪数据库,其中存储了这些小型转储。然后,您可以找出哪些错误最常见并且需要首先修复。无意中,您会发现很多关于您的应用程序运行环境的信息。哪些操作系统版本最常见,哪些病毒扫描程序会挂接到您的应用程序等。

显然,这需要您的用户同意,因为小型转储可能包含私人信息(但堆栈上的信息很少)。实现一个可以捕获例如堆栈溢出异常的工作错误处理程序并非易事。

【讨论】:

    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多