我正在开发一个嵌入式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。
你的程序似乎没有任何问题,你的问题可能出在其他地方。
我会遇到几种不同类型的错误,例如分段错误、总线错误、非法指令等等。
所有这些都可能是记忆不良的结果(读回之前写入的值以外的值)。
我建议运行内存检查程序来确认或排除这种可能性。