【问题标题】:Visual Studio 2008 show FULL stack trace after stack overflowVisual Studio 2008 在堆栈溢出后显示完整的堆栈跟踪
【发布时间】:2012-08-10 05:53:32
【问题描述】:

我有一个正在运行的 C++ 项目,当我在 IDE 中的调试器下运行它时发生堆栈溢出。

Visual Studio 2008 已自行截断溢出线程的堆栈跟踪(好吧,如果我们要这样做,为什么还要检查溢出?)。

是否有一些查看选项或调试选项可以显示该线程调用的根?

所以本质上,除了向我提供堆栈跟踪可能被破坏的原因等(我是否应该禁用我的 AV 并同时运行 memtest86 ?)有没有人有关于在 Visual Studio 2008 中截断堆栈跟踪的实际信息?

【问题讨论】:

  • 也许当你溢出堆栈时,你覆盖了一些重要的东西,所以调试器根本无法再追溯堆栈。
  • 我同意这种损坏可能会发生,但是堆栈溢出的全部意义在于在我们丢失某些东西之前停止执行。不仅如此,无论堆栈中可能有什么垃圾,它仍然存在于内存中。
  • 检查所有记忆功能和循环..
  • 调试器是你的朋友!在崩溃之前添加一个断点,然后逐步检查您的代码,直到它发生。这很乏味并且可能需要很多时间,但可能是必要的。除非你当然找到你经过的地方,例如指向局部变量的指针或覆盖数组等。
  • “但是堆栈溢出的全部意义在于在我们丢失某些东西之前停止执行” -> 我不认为调试器是这样工作的

标签: c++ visual-studio stack-overflow


【解决方案1】:

简单的解决方案是从一开始就使堆栈保持足够小,以便堆栈溢出更早发生。反正你不想要一兆字节的重复函数。

【讨论】:

    【解决方案2】:

    如果您想拥有一个大堆栈并避免由于一些简单的递归错误而导致堆栈溢出,请使用 TLS:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686749(v=vs.85).aspx

    在进程启动时分配一个槽,然后使用 TlsGetValue 和 TlsSetValue 增加槽的值,然后检查它是否超出,然后进入调试器或在您所谓的错误函数中执行一些其他“暂停”。

    它不适用于没有 hack 的 3rd 方代码,但它对我来说很好地解决了限制并且非常轻巧。

    【讨论】:

      猜你喜欢
      • 2010-12-07
      • 2016-10-05
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多