【问题标题】:Debugging without Debugging Symbols不使用调试符号进行调试
【发布时间】:2013-10-11 15:24:46
【问题描述】:

我有一个 c++ 项目,其中调试和发布模式的行为不同。例如。在发布模式下,我得到了错误的分配错误,而在调试模式下,一切都运行良好。也许这种差异来自不同的运行速度。

您有什么提示和提示如何在没有标准调试器(如 gdb)的情况下调试程序?我可以尝试在关键区域进行很多操作,但这似乎不是最聪明的方法......也许有一种方法可以在不使用调试符号的情况下获取有关某些错误位置的一些信息?有什么工具吗?

【问题讨论】:

  • 您确定差异是由调试符号引起的吗?生成调试/发布二进制文件的编译命令是什么?
  • 您可以在发布版本中使用调试符号,它根本不应该改变程序的行为。如果您在调试/发布版本之间遇到问题,那么很可能您有一些未定义的行为或未初始化的变量导致问题。
  • 错误的分配错误是异常吗?您可以使用堆栈跟踪捕获并记录异常吗?每个版本实际使用了多少内存?
  • 仅仅添加-g 来发布构建的标志不应该改变执行流程中的任何事情。如果是这样 - 这件事需要调试。同时,您可以尝试使用单独的调试符号映射文件,gdb 支持。
  • 有点相关的问题:stackoverflow.com/questions/4386291/…

标签: c++ debugging


【解决方案1】:

如果您可以从崩溃中获取堆栈跟踪,您可以稍后对其进行符号化。例如,在 MacOS 上有工具 atos,根据 man 页面:

将数字地址转换为其符号等价物。

这将允许您在没有符号的情况下运行,但稍后使用它们。

【讨论】:

  • 对于 GNU 工具链,等效为 addr2line。然而,这仅与问题部分相关。
猜你喜欢
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
相关资源
最近更新 更多