【问题标题】:Unable to debug some code ? Strange stack with MSVC?无法调试某些代码? MSVC 的奇怪堆栈?
【发布时间】:2011-02-22 10:19:05
【问题描述】:

有时我的应用程序崩溃并出现以下堆栈跟踪:

  atiocl.dll!0f6c463a()
  [Frames below may be incorrect and/or missing, no symbols loaded for atiocl.dll]
  atiocl.dll!0f2ed724()
  atiocl.dll!0f2ed82c()
  atiocl.dll!0f2ad8cb()
  OpenCL.dll!000a172c()
  pureStudio.exe!__fseeki64()  + 0xdec0 bytes C++
  pureStudio.exe!__fseeki64()  + 0x9b6f bytes C++
  pureStudio.exe!__fseeki64()  + 0x1f027 bytes C++
  msvcr90d.dll!5af8327f()
  ntdll.dll!77bb041d()
  ntdll.dll!77b79d45()

这是内存访问冲突! 不幸的是我不知道这个问题......

有关信息,我使用 VS 2008 + QT + BOOST + OpenCL

奇怪的是我知道问题发生在“哪里”......我只需要删除特定的代码行......并且没有更多错误(但是软件没有做它应该做的事情:-P )

调用是在“我的代码”上,但这次我没有在堆栈中看到我的方法!!!! (我能够追踪其他代码,之前的其他崩溃......)

我只能在我看到我的方法的地方显示“反汇编”,而不是 C++ 代码和上下文!!!但为什么呢?

如果有人有想法帮我调试这个?

感谢您的帮助

【问题讨论】:

  • 为您的代码调试符号?看起来它没有任何符号,因为它只显示函数的地址......
  • 奇怪的是我有“调试符号”!我能够毫无问题地跟踪和调试我的代码,即使当我显示“模块”窗口时,我看到“符号已加载”!嗯......堆栈上的东西太大了......可能......但我没有参数,我启动/停止同一个线程很多时间。我还分配了一个 160 字节的缓冲区...很多次...但是在新分配之前我删除了前一个!

标签: debugging visual-c++ boost fseek


【解决方案1】:

每次我得到这种堆栈并删除代码使其工作时,那是因为我做了一个... stack-overflow :)

很可能你的堆栈中有太大的东西。

检查您在函数的某处没有太大的对象,通常在 main() 函数中。确保总是在堆上分配大对象(管理器或类似的东西)。

【讨论】:

  • 您是否尝试查看堆栈上是否没有任何大对象?我几乎可以肯定这是确切的问题,但这是根据经验:只有您可以验证或使我的答案无效...
  • 1.查看删除它时使其工作的代码,看看是否有一个对象在那里实例化但不在堆上(不使用 new 或 malloc)可能具有大小很大的类型。 2. 如果没有什么明显的,请尝试二分法搜索,将代码分成两部分并查看运行的哪一部分,直到您看到哪个对象破坏了代码。
  • 3.如果找不到,请尝试确保在堆上分配非基本类型对象(可能使用诸如 scoped_ptr 之类的智能指针),以确保不是问题所在。 4.您也可以简单地查看您的项目设置什么是堆栈内存大小,然后添加一些代码以在日志中显示错误代码中每种类型的大小。
  • 我什么都没发现...最后我认为我的堆栈已损坏,可能是由于错误的“内存”操作...但是如何检测到呢?
  • 我什至用“BoundsChecker”测试了软件,但是一旦它崩溃了......为时已晚!这个工具无法找到我的内存问题!这真的让我发疯了!
猜你喜欢
  • 1970-01-01
  • 2017-02-09
  • 2017-10-09
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
相关资源
最近更新 更多