问题标签 [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 回答
2023 浏览

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

我最近开始用 c 编码,在编码过程中遇到了这个运行时错误,我找不到解决方案。它要么显示此运行时错误,要么scanf在找到客户的情况下停止,您选择要编辑的内容,然后输入新信息。

例子:

  • 输入 ID:322993
  • 成立
  • 按 [1] 编辑 ID
  • 输入新身份证
  • 程序卡住了

这是代码:

为什么会这样?

0 投票
1 回答
338 浏览

c - FORTRAN 和 C 互操作性 - REAL(4) 可以太小吗?

我们在一些英特尔 FORTRAN 代码中遇到了一些奇怪的崩溃,我最终追踪到:

其中 -L_B2*L_BETASQ*L_DS 项评估为大约 -230。碰巧,EXP(-230) 的计算结果约为 1e-100。在所有其他已知情况下,L_DS 小得多,导致 EXP 的最小(已知)返回值约为 1e-50,这不会导致错误。

一旦 FORTRAN 计算子句 EXP(-230),你就会得到:

但没有其他信息。

异常 157 通常与互操作性有关,您无法在 FORTRAN 中调试 EXP,因为它找不到特定的 .c 文件——这可能意味着 EXP 是用 C 实现的(我觉得这很奇怪)。

我的假设是 FORTRAN 在 C 中实现了 EXP,但接口无法将小于 1e-100 的浮点数转换为 REAL(4)s。由于我之前认为浮点数和 REAL(4) 在字节方面是相同的,所以我无法支持这个假设——而且我在任何地方都找不到任何关于它的信息。

在我关闭这个错误之前,任何人都可以确认或否认我的假设 - 或者为我提供另一个假设吗?

此致,

麦克风

编辑: 我将把这个问题标记为已回答,因为高性能标记已经回答了直接问题。

不幸的是,我的假设是不正确的——我试图解决这个问题:

不幸的是,现在(显然)异常发生在 L_ARG .GT 中。230.0 条款。这要么意味着发布模式下的调试比我想象的要糟糕,要么是某种“存储”的浮点错误(在将浮点数输入到字符串流时,请参阅“浮点无效操作”)。

0 投票
3 回答
99 浏览

c++ - 是否可以直接识别覆盖整个堆栈的错误代码?

很简单地说,如果 C++ 程序执行以下函数(例如,在 Windows 7 上,使用任何 VS 版本编译),然后随后崩溃并且您使用 WER 附加调试器,或者让 WER 生成故障转储并稍后分析此故障转储.

是否可以从dump中的信息直接推断出这个函数被执行了,也就是说,找到执行它的线程的踪迹,就知道这个函数被执行了。

或者当我破坏整个堆栈时,所有执行痕迹都消失了吗?

0 投票
1 回答
2823 浏览

gcc - 带有 gcc 的 STM32F4 上的 FreeRTOS 堆栈损坏

我试图让 FreeRTOS 在我的 stm32f4discovery 板上运行。我已经安装了召唤臂工具链并创建了一个 Makefile 来编译我的代码。这是生成文件:

我修改了 FreeRTOS 演示项目的文件夹 CORTEX_M4F_STM32F407ZG-SK 中的项目(删除现有任务并创建我自己的)。这是主要功能:

我在 FreeRTOSConfig.h 中将 configMINIMAL_STACK_SIZE 配置为 4096,并且代码运行良好,因为任务计划程序启动并调用了我的 SampleTask0 函数。下面是任务代码:

任务 1 的功能与任务 0 几乎相同,只是它打印不同的信息。这些代码可以编译,并且在我将二进制文件写入我的开发板后,SampleTask0 无法按预期工作。通过 USART3 发送字符的 DebugPrintf 函数只打印“Tas”,然后一切都停止。我用gdb跟踪代码并逐步执行代码,打印了“Task 0 running”,但是当它返回到任务函数时(在“while(delay){delay--;}”之前)发生错误:

无法访问地址 0xa5a5a5a5 的内存

在 main.c 中的 SampleTask0 (pvParameters=0x0)...

根据 FreeRTOS文档,每个任务的堆栈在创建时填充 0xa5 字节。我认为堆栈可能有问题。我已将 configCHECK_FOR_STACK_OVERFLOW 设置为 2 以启用堆栈溢出检测,但发生这种情况时尚未调用我的钩子函数。

CORTEX_M4F_STM32F407ZG-SK 中的 startup_stm32f4xx.s 是为 EWARM 工具链创建的,我将其替换为我从 ST 网站下载的 STM32F4-Discovery_FW_V1.1.0 中的启动文件。所以它可能会破坏堆栈,但我不确定这一点。有人对此有想法吗?

0 投票
1 回答
198 浏览

c - 堆栈周围的变量损坏

它因调试错误而崩溃,并说变量“代码”周围的堆栈已损坏。这是我正在做的汉明代码实验室的代码。输入文件只是同一行上的一堆 1 和 0。为什么会崩溃?

0 投票
1 回答
1781 浏览

c# - 将字符串数组从 C# 传递给 C++ DLL 函数并将其填充到 DLL 中并返回

我正在编写一个 C# 应用程序,它将大小为 30 的空字符串数组传递给 C++ DLL。此字符串数组需要填充到 DLL 中并返回给 C# 应用程序。

在我的代码中,我在 DLL 函数调用结束时观察到内存损坏。

我的 C++ DLL 代码如下:

我的 C# 代码是

0 投票
1 回答
933 浏览

c - 在 OSX 上使用 GDB 检测堆栈损坏(在金丝雀值上设置观察点)

__stack_chk_fail我的程序通过OSX Mountain Lion在函数结束时中止。显然__stack_chk_fail是在检测到金丝雀值发生变化时调用。我想按照此处概述的类似过程来检测堆栈损坏的位置。但是 OSX 上的汇编代码不同,所以我不知道金丝雀值的设置位置。

有谁知道如何在 OSX 上解决这个问题?

我确实尝试了 valgrind (3.9.0),但它没有检测到任何错误。

该函数的gdb给出的汇编代码为:

0 投票
1 回答
7673 浏览

c++ - 调试堆栈值损坏的好方法

什么是调试堆栈值损坏的好方法。在我的程序中,有时 this 指针的地址会在方法返回后更改,该方法对文件描述符执行关闭操作。我调试程序几个小时,但我找不到问题。

找出什么改变了 this 指针的地址的好方法是什么?当我在 this 指针上手动添加手表时,不会发生错误。当我尽可能地剥离我的代码时,错误仍然存​​在。我尝试了 Valgrind,但它没有发现任何早期的堆栈损坏。

我设法检测到错误何时发生,我以 64 位模式编译了代码。这个地址从 0xxxxxxx 变成了 0x1000000xxxxxxx。我在发生错误的方法中检查了这个地址,当地址发生变化时我发现了这个地址(参见第一段)。

有没有其他方法可以找出这个问题的原因?

0 投票
1 回答
893 浏览

c++ - 使用 sscanf 的堆栈损坏

我有以下代码将 2 个十六进制数字转换为字节值:

运行它时,我得到一个运行时异常,说

变量 temp 周围的堆栈已损坏

我究竟做错了什么?AFAIK2hhx应该将两个字节转换为一个......

0 投票
1 回答
956 浏览

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

我得到运行时异常;

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

对于以下代码。

在移出sql::SQLString pwd = m_loginInfo.userPwd;try 块之前,它曾经抛出

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

任何想法为什么?我正在使用 mysql 库并试图捕获connect调用时发生的 SQLException。

编辑

将每个 CString 类型转换为 LPCTSTR 后的输出窗口:

MyApp.exe 中 0x75B61D4D 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x0493F8C0 处的 sql::SQLException。
MyApp.exe 中 0x75B61D4D 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x0493F8C0 处的 sql::SQLException。
MyApp.exe 中 0x005E18A5 处未处理的异常:堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出。