问题标签 [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.
c - 运行时检查失败 #2 - 变量“tempID”周围的堆栈已损坏
我最近开始用 c 编码,在编码过程中遇到了这个运行时错误,我找不到解决方案。它要么显示此运行时错误,要么scanf
在找到客户的情况下停止,您选择要编辑的内容,然后输入新信息。
例子:
- 输入 ID:322993
- 成立
- 按 [1] 编辑 ID
- 输入新身份证
- 程序卡住了
这是代码:
为什么会这样?
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 条款。这要么意味着发布模式下的调试比我想象的要糟糕,要么是某种“存储”的浮点错误(在将浮点数输入到字符串流时,请参阅“浮点无效操作”)。
c++ - 是否可以直接识别覆盖整个堆栈的错误代码?
很简单地说,如果 C++ 程序执行以下函数(例如,在 Windows 7 上,使用任何 VS 版本编译),然后随后崩溃并且您使用 WER 附加调试器,或者让 WER 生成故障转储并稍后分析此故障转储.
是否可以从dump中的信息,直接推断出这个函数被执行了,也就是说,找到执行它的线程的踪迹,就知道这个函数被执行了。
或者当我破坏整个堆栈时,所有执行痕迹都消失了吗?
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 中的启动文件。所以它可能会破坏堆栈,但我不确定这一点。有人对此有想法吗?
c - 堆栈周围的变量损坏
它因调试错误而崩溃,并说变量“代码”周围的堆栈已损坏。这是我正在做的汉明代码实验室的代码。输入文件只是同一行上的一堆 1 和 0。为什么会崩溃?
c# - 将字符串数组从 C# 传递给 C++ DLL 函数并将其填充到 DLL 中并返回
我正在编写一个 C# 应用程序,它将大小为 30 的空字符串数组传递给 C++ DLL。此字符串数组需要填充到 DLL 中并返回给 C# 应用程序。
在我的代码中,我在 DLL 函数调用结束时观察到内存损坏。
我的 C++ DLL 代码如下:
我的 C# 代码是
c - 在 OSX 上使用 GDB 检测堆栈损坏(在金丝雀值上设置观察点)
__stack_chk_fail
我的程序通过OSX Mountain Lion在函数结束时中止。显然__stack_chk_fail
是在检测到金丝雀值发生变化时调用。我想按照此处概述的类似过程来检测堆栈损坏的位置。但是 OSX 上的汇编代码不同,所以我不知道金丝雀值的设置位置。
有谁知道如何在 OSX 上解决这个问题?
我确实尝试了 valgrind (3.9.0),但它没有检测到任何错误。
该函数的gdb给出的汇编代码为:
c++ - 调试堆栈值损坏的好方法
什么是调试堆栈值损坏的好方法。在我的程序中,有时 this 指针的地址会在方法返回后更改,该方法对文件描述符执行关闭操作。我调试程序几个小时,但我找不到问题。
找出什么改变了 this 指针的地址的好方法是什么?当我在 this 指针上手动添加手表时,不会发生错误。当我尽可能地剥离我的代码时,错误仍然存在。我尝试了 Valgrind,但它没有发现任何早期的堆栈损坏。
我设法检测到错误何时发生,我以 64 位模式编译了代码。这个地址从 0xxxxxxx 变成了 0x1000000xxxxxxx。我在发生错误的方法中检查了这个地址,当地址发生变化时我发现了这个地址(参见第一段)。
有没有其他方法可以找出这个问题的原因?
c++ - 使用 sscanf 的堆栈损坏
我有以下代码将 2 个十六进制数字转换为字节值:
运行它时,我得到一个运行时异常,说
变量 temp 周围的堆栈已损坏
我究竟做错了什么?AFAIK2hhx
应该将两个字节转换为一个......
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 检测代码检测到基于堆栈的缓冲区溢出。