c - 如何使用GDB检测C程序中的 "out of bound error"?

标签 c arrays debugging gdb

我用 C 语言编写了这个程序,故意添加了一个错误。

程序计算用户输入的 5 个数字的总和,并将结果显示在屏幕上。

我用“gcc -Wall -Wextra -Werror -ansi -pedantic -g”编译它并且工作正常。

但是有一个错误。

在循环的最后一次重复中,程序计算 a[N],该值未定义!

我想知道如何使用 GDB 发现此类错误

当我使用“设置检查范围”时,我收到此消息“警告:当前范围检查设置与语言不匹配。”但什么也没发生...

这是要调试的代码:

#define N 5
#include <stdio.h>


void read(float*);


int main(void) {

    float a[N], s;

    int i;

    printf("Enter %d numbers: ", N);
    read(a);

    i = -1; 
    s = 0;

    while (i != N) {
        i = i + 1;
        s = s+a[i];
    }

    printf("The sum is : %.2f \n", s);

    return 0;
}


void read(float*a) {

    int n = 0;

    while (n!=N) { 
        scanf("%f",&a[n]);
        n++;
    }

}

最佳答案

我认为这是你的问题:

while (i != N) {
    i = i + 1;
    s = s+a[i];
}

N定义为5 ,所以当 i为 4,则条件为真。 i然后增加到 5,并且 s += a[i];被执行。只需使用 for改为循环,或使用 do {} while :

for (i=0;i<N;++i)
    s += a[i];
//or
i = 0;
do {
   s += a[i];
} while (++i != N);

无论哪种方式。就我个人而言,我发现for循环更具可读性

<小时/>

回答您的问题(使用 gdb):

  • 您已使用 -g 标志进行编译,因此运行 `gdb generated_file_name
  • 在 gdb 中,在 while 设置断点循环(b <line-nr> [condition])
  • 启动程序 ( run )
  • 使用stepnext单步执行代码
  • 使用p i检查 i 的值每次您点击 while条件,以及每次使用 i作为偏移量 ( a[i] )

了解更多详情,docs for gdb可用。这需要一些时间,但非常值得。 gdb 是一个优秀的调试器

关于c - 如何使用GDB检测C程序中的 "out of bound error"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27064935/

相关文章:

c - 是否可以使用 C11 的 _Generic 实现 GNU C 的 typeof(x)?

c - 尝试在 C 中打印值时出现段错误

java - 循环遍历字节数组中的十六进制数字

javascript - 从 JS 发布表单值数组

python - 有没有办法用 PyCharm 捕获单元测试异常?

c - 链接非常简单的 MQTT 客户端(Azure IOT Hub SDK)时出现问题

c - Malloc 返回归零内存作为输出

c - 致命运行时错误 - C 函数

python - 有没有开源工具可以找到python程序的流程?

debugging - 显示foreach/eval/call扩展的结果