You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在运行C程序时检测memory error?附测试案例求助

如何在GCC编译的C程序中检测运行时内存错误

我知道GCC是编译器,检测运行时错误并非它的职责,但有没有办法能在运行时显示内存错误这类问题?这对调试工作帮助很大。

我试着用C语言模拟内存错误,写了一段无限循环打印数组元素的代码,本以为会触发相关错误,但程序仅打印若干0和随机数后便停止运行。

测试代码

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int arr[] = {1, 2, 3, 4, 5};
    printf("%llu elements in arr\n", sizeof(arr) / sizeof(int));
    int ix = 0;
    while (1)
    {
        printf("%d, ", arr[ix++]);
    }

    return 0;
}

编译与运行命令

gcc .\buggy.c -o buggy -Wall
.\buggy.exe

程序输出

5 elements in arr
1, 2, 3, 4, 5, 0, 8, 8, 946979856, 684, -308276498, 32759, 0, 0, -308252600, 32759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -308276218, 32759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1804065411, 32764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1768117672, 32764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1232, 1264, -1232, 1232, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

环境信息

gcc.exe (Rev2, Built by MSYS2 project) 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.

解决方案

1. 使用AddressSanitizer(ASan)

GCC支持AddressSanitizer,这是一款内存错误检测工具,能在运行时捕获数组越界、使用已释放内存等问题。在MSYS2的UCRT环境下,可通过以下命令编译:

gcc .\buggy.c -o buggy -Wall -fsanitize=address -g

运行编译后的程序,一旦发生数组越界访问,ASan会立即报错,输出包含越界位置、调用栈的详细信息,帮你快速定位问题。

2. 为什么你的代码未触发崩溃?

你写的代码访问的是栈上数组的越界区域,栈内存布局中,数组后方可能存在其他栈变量、返回地址或未使用的栈空间。读取这些区域只会得到垃圾值,不会立即触发崩溃。只有当访问地址超出进程内存空间(比如栈的保护页区域)时,操作系统才会触发访问违规,导致程序崩溃。而ASan会在第一次越界访问时就拦截报错,无需等到触发系统级内存保护。

3. 其他可选工具

  • Valgrind:虽在Windows上支持有限,但可在MSYS2环境尝试使用,能检测内存泄漏、越界访问等问题,不过运行速度较慢。
  • Windows自带调试工具:使用WinDbg或Visual Studio调试器运行程序,程序崩溃时可捕获错误信息,但需手动设置断点或等待崩溃发生。

内容的提问来源于stack exchange,提问作者Drfiting Away

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:44:53