Linux 中的单个 C 程序出现不同类型的错误

问题描述 投票:0回答:1

我正在开发一个嵌入式Linux(kernel-5.10.24),现在我正在运行一个C程序来进行有关文件复制的压力测试。 代码使用

stdio
来读写文件,如下,

#include <stdio.h>
#include <stdlib.h> // For exit()
#include <unistd.h>
#include <string.h>

#ifndef BUF_SIZE        /* Allow "cc -D" to override definition */
#define BUF_SIZE 1024
#endif

static unsigned char buf[BUF_SIZE];
static char *infname = "/tmp/src_file.bin";
static char *ofname  = "/tmp/dst_file.bin";

static int create_dest_file(const char *fname)
{
    FILE *fp = fopen(fname, "w");
    if (fp == NULL) {
        printf("Failed to create/truncate %s\n", fname);
        return 1;
    }
    fclose(fp);
    return 0;
}

static int copy_file(const char *src, const char *dest)
{
    FILE *fp, *fp2;
    int rlen = 0, wlen = 0, rc = 0;

    // Open one file for reading
    fp = fopen(src, "r");
    if (fp == NULL)
    {
        printf("Cannot open file %s\n", src);
        return 1;
    }

    fp2 = fopen(dest, "ab");
    if (fp2 == NULL) {
        fclose(fp);
        return 1;
    }

    while (1) {
        rlen = fread(buf, 1, sizeof(buf), fp);
        if (rlen > 0) {
            wlen = fwrite(buf, 1, rlen, fp2);
            if (wlen != rlen) {
                printf("Wrote len: %d, read len: %d\n", wlen, rlen);
                rc = 1;
                break;
            }
        } else {
            break;
        }
    }
    fclose(fp);
    fclose(fp2);
    return rc;
}

int main(int argc, char **argv)
{
    int i = 0, rc = 0;
    int us = 500000;

    if (argc != 4) {
        printf("Usage: %s srcfile dstfile delay_in_us\n", argv[0]);
        return 1;
    }

    infname = argv[1];
    ofname  = argv[2];
    us = atoi(argv[3]);

    printf("Copying %s to %s\n", infname, ofname);
    for (i = 0; i < 1000; i++) {
        create_dest_file(ofname);
        rc = copy_file(infname, ofname);
        printf("XXXXXXXXXXX %d, rc: %d\n", i, rc);
        usleep(us);
    }

    return 0;
}

编译并使用

./filecopy /root/16MB_src.bin /root/dest.bin 250000
运行它后,我会收到几种不同类型的错误,例如
Segmentation fault
Bus error
Illegal instruction
等等。

我安装了GDB来运行

filecopy
,并出现以下错误。

XXXXXXXXXXX 45, rc: 0
XXXXXXXXXXX 46, rc: 0
Fatal error: glibc detected an invalid stdio handle

Program received signal SIGABRT, Aborted.
0x77cdfd44 in ?? () from /lib/libc.so.6
(gdb) bt
#0  0x77cdfd44 in ?? () from /lib/libc.so.6
#1  0x77c964ac in raise () from /lib/libc.so.6
#2  0x77c97ae4 in abort () from /lib/libc.so.6
warning: GDB can't find the start of the function at 0x77cd0c97.
#3  0x77cd0c98 in ?? () from /lib/libc.so.6
(gdb)

我检查了代码并请其他同事检查了代码,没有发现错误:-(。

从错误类型来看,代码触发了相同的随机故障,但我找不到根本原因。
我正在使用 GLIBC2.38。

c linux file gdb glibc
1个回答
0
投票

你的程序似乎没有任何问题,你的问题可能出在其他地方。

我会遇到几种不同类型的错误,例如分段错误、总线错误、非法指令等等。

所有这些都可能是记忆不良的结果(读回之前写入的值以外的值)。

我建议运行内存检查程序来确认或排除这种可能性。

© www.soinside.com 2019 - 2024. All rights reserved.