问题标签 [stack-corruption]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
15170 浏览

android - 由于“检测到堆栈损坏:已中止”而导致崩溃

我最近收到一位用户的投诉,说我的应用程序崩溃了。我从用户的错误日志中提取了以下内容,并且能够看到为什么会出现问题:

检测到堆栈损坏。太好了,那么我该如何找出发生这种情况的原因?

我认为这个问题正在这个特定的类中发生,因为我在它死之前期望它有更多的日志输出。此类使用套接字下载播放列表并对其进行解析。我怎么会破坏堆栈?我已经处理了 C/C++ 中的堆栈溢出,但是如何在 Java 中处理它?

谢谢你的帮助!

0 投票
2 回答
350 浏览

c++ - MSVC++ 表示变量周围的堆栈已损坏,但程序可以运行

对不起,如果这听起来像“它编译,所以它必须工作!” 问题,但我想了解为什么会发生某些事情(或没有发生,视情况而定)。

在项目设置中,我设置Basic Runtime ChecksBoth. 调试器告诉我:

运行时检查失败 #2 - 变量“beg”周围的堆栈已损坏。

但是如果我将它设置为默认值,即无,程序运行并正常完成,不会抛出异常并且不会导致错误。

我的问题是,我可以放心地忽略这一点(因为 MSVC++ 可能有某种错误)还是这是一个真正的问题?当堆栈被搞砸时,我看不到程序如何成功继续。


编辑:

导致此错误的函数如下所示:

fun递增和操作beg,当它返回时,beg == end,当 MSVC++ 中断时,它指向关闭的}.


编辑2:

我已经隔离了这个问题。在某些情况下,从谁拥有它迭代的项目fun中删除一些元素。list这就是导致错误的原因。

0 投票
1 回答
2773 浏览

c++ - “this”指针在堆栈跟踪中损坏

我见过这个线程。我的情况略有不同,我正在努力弄清楚"this"指针是如何损坏的。

我正在使用 Qt 4.6.2 框架,将它们QTreeView与我自己的模型一起使用。我得到的回溯(86 帧长,有很多递归,这就是为什么我没有把整个东西粘贴进去,它在这个pastebin中只涉及他们的代码。

它最终在 QBasicAtomicInt::deref 中的一些汇编程序上出现了段错误,但很明显它已经死得更远了,这三个框架证明了这一点:

在第 17 帧中,this0x942bb0。在第 16 帧中,this应该是相同的,因为在第 17 帧中它正在调用其祖先的相同方法的实现。但是this变成0x4。

有趣的是,在第 15 帧(同样,第 16 帧调用了其祖先对同一函数的实现),“this”指针恢复为0x942bba0.

如果您查看完整回溯的 pastebin,您可能会看到一些“优化值”。我在优化的情况下编译了应用程序;我现在将 gcc 设置为,-g3 -O0所以下次发生时我可能会有更多的东西。但当然现在我不能让它崩溃——这是一个相当难以发生的错误(但修复非常重要)所以我不认为这太可疑了。

鉴于优化,这是this pointer=0x4不寻常的还是绝对错误的?奇怪的是,这些 viewportEvent 框架中都没有真正的代码——它们只是对事件的类型进行切换,它通过 switch 语句,并返回其祖先的实现。

Valgrind 似乎没有抛出任何问题,尽管我还没有让它在 Valgrind 中崩溃。

有没有人见过这种行为?可能是什么原因造成的?

0 投票
3 回答
11741 浏览

c++ - 调试堆栈损坏

现在我正在调试一个有堆栈损坏的大型项目:应用程序失败。

我想知道如何使用 Visual Studio 2010 查找(调试)此类堆栈损坏代码?

这是导致堆栈问题的一些代码示例,我如何找到这种类型的损坏不太明显的情况?

更新

请注意,这只是一个示例。我需要在当前项目中找到这样糟糕的代码。

0 投票
4 回答
566 浏览

c++ - 什么可能导致初始化顺序破坏堆栈?

问题在下面以粗体显示:

这工作正常:

但是,这会导致断言失败:

现在我知道这个问题不是收缩包装的,所以我将我的问题限制在这个:什么条件会导致这样的问题?具体来说:变量初始化损坏取决于堆栈帧中的出现顺序。我的代码中没有 malloc 或 free,也没有 strcpy、memcpy 等不安全的函数……它是现代 c++。使用的编译器:gcc 和 clang。

为简洁起见,这里是类型的

ps,我绝不是说编译器有问题,可能是我的代码。但是由于我正在模板化我很久以前编写的一些代码,这个问题让我完全难住了,我不知道在哪里可以找到问题所在。

编辑

遵循 nim 的建议并经历了以下循环

  1. 将代码收缩包装到我在这里显示的内容,编译和测试,没问题。
  2. #if 0 #endif收缩包装主程序。
  3. 删除标题,直到它以收缩包装的形式编译。
  4. 删除库链接,直到以收缩包装形式编译。

解决方案:删除到协议缓冲区的链接可以解决问题

0 投票
3 回答
1343 浏览

c++ - 将大向量存储在堆栈中是一个坏主意吗?

我一直在研究一堆图像处理程序..没什么花哨的,主要是快速而肮脏的实验。图像数据存储在堆栈上声明的向量中(当我不需要传递数据时,我尽量避免使用指针)。我注意到尽管进行了无数次的调试和单步调试,我的一些函数的行为仍然非常奇怪。有时调试器会给我一个错误,它不能评估某个变量等等。事情通常是没有意义的,过去的经验告诉我,当这种情况发生时,这意味着发生了某种溢出或内存损坏。首先想到的是,这可能是由于我将大量图像数据存储到向量中。

然而,我的印象是向量将它们的实际数据存储在堆中,所以我认为在堆栈中放置一些这样的大向量并没有什么坏处。我这样想错了吗?我应该分配我的向量并将它们存储在堆而不是堆栈中吗?

谢谢,

0 投票
1 回答
1580 浏览

c++ - 为什么在循环中调用 ReadConsole 会破坏堆栈?

我使用以下代码禁用了行输入:

然后我在一个循环中调用 ReadConsole ......在一个循环中:

如果我运行程序并立即按 0,它就干净地存在。
但是如果我按一堆键,然后按 0,当程序存在时它会崩溃:

运行时检查失败 #2 - 变量“cBuf”周围的堆栈已损坏。

为什么这会导致堆栈损坏?代码很简单,所以我不知道出了什么问题。

我可以重现问题的小程序:

你必须在你运行它之后把你的键盘捣碎,然后按 0,它会因堆栈损坏而崩溃。

我也无法每次都重现该问题,需要尝试几次。
在创建一个新的空控制台项目并添加一个包含该代码的文件之后,我在 Visual Studio 2010 下运行它。

0 投票
2 回答
806 浏览

c - K&R:C - 检测到堆栈粉碎

我的代码是这样的:

getline像这样:

当我使用gcc -Wall -O2 -g a.c -o a.out和执行a.out -x -n 111<find_test时,find_test我的测试数据在哪里:

我收到错误消息:

但如果我使用gcc -Wall -O2 -g -fno-stack-protector a.c -o a.out并执行a.out -x -n 111<find_test一切都可以。我找不到原因。任何人都可以帮忙吗?

0 投票
1 回答
2946 浏览

c++ - 变量周围的堆栈已损坏

我知道这个主题有很多问题,但它们似乎都特定于代码。

我有这个功能-

它在返回语句上给我一个错误,说“运行时检查失败 #2 - 变量‘结果’周围的堆栈已损坏。”

我看不出该功能有什么问题。Matrix3x3 的数组只是 -

Point2的数组是

Matrix3x3 和 Point2 类都有这个代码 -

这段代码是给我的,我之前有过一些关于点、矩阵和向量的算术作业。我的代码通过了所有测试,所以我假设我的 Point2 ITCS4120::operator* (const Matrix3x3& m, const Point2& p) 代码是正确的。但也许我需要以不同的方式使用 [] 运算符?

0 投票
1 回答
654 浏览

c++ - Lua:避免重载 pcall 和 Lua 调用栈

我有一个程序可以使用lua_pcall. 似乎如果程序调用 lua 脚本的速度太快,事情就会出错并在最随机的地方导致访问冲突。

我尝试过互斥锁,甚至使用 try/catch 启用 SEH 异常都无济于事。错误函数已经到位,我正在检查所有适当的返回代码;问题是 pcall 深处的实际访问冲突,而不是安全处理的 Lua 错误。

很多时候中断发生在luaV_execute,但有时它发生在其他随机的地方。我已经检查以确保推送到堆栈的所有参数都是有效的。

有没有办法强制 Lua 在返回之前完成调用,或者有什么方法可以确保调用堆栈不会损坏?