我遇到一个问题,当调用来自其他位置的相同参数的相同函数时,我会遇到分割错误。我试图在该功能中编程其他内容,并且不知道为什么我会遇到SEG错误。然后,我将其范围缩小到写入器功能,因此我删除了其他所有内容,并试图弄清楚为什么这给我带来了SEG错误,但我仍然不知道为什么。下面调用相同函数的示例,然后从另一个函数中调用它:
test[0] = '0';
test[1] = '0';
test[2] = '1';
test[3] = '0';
test[4] = '0';
test[5] = '4';
test[6] = '0';
test[7] = '0';
test[8] = '5';
test[9] = '0';
test[10] = '0';
test[11] = '5';
test[12] = '0';
test[13] = '0';
test[14] = '6';
test[15] = '9';
test[16] = '9';
test[17] = '9';
disk->writeSector(0, test);
disk->writeSector(10, test);
disk->writeSector(10, test);
disk->writeSector(10, test);
disk->writeSector(10, test);
generateRootDir(10); //Seg fault here.
该函数实际上调用与下面所示的代码相同的代码:
void FileSystem::generateRootDir(int rootBlock)
{
disk->writeSector(10, test);
}
写入器函数如下所示。
void BlockDisk::writeSector(int address, char* block)
{
if (address > blocks || address < 0)
{
std::cout << "[writeSector] ERROR: Sector " << address << " out of bounds!" << std::endl;
}
std::fstream diskWrite;
diskWrite.open(disk, std::ios::binary | std::ios::in | std::ios::out);
if (diskWrite)
{
diskWrite.seekp(address*BLOCKSIZE, diskWrite.beg);
diskWrite.write(block, BLOCKSIZE);
diskWrite.close();
} else {
printf("Error opening file to writen");
exit(-1);
}
}
我试图在GeneratoRootDir功能调用上方设置一个断路点。这是给定的输出,一切对我来说都还不错,我看不出为什么这里有任何会导致分割错误。
Breakpoint 1, FileSystem::mount (this=0x55555576bc20) at FileSystem.cpp:55
55 disk->writeSector(10, test);
(gdb) s
BlockDisk::writeSector (this=0x55555576c0c0, address=10,
block=0x55555576bc90 "001004005005006999") at BlockDisk.cpp:21
21 if (address > blocks || address < 0)
(gdb) s
25 std::fstream diskWrite;
,然后写入器函数的其余部分顺利进行。然后致电GeneratoToRootDir:
FileSystem::mount (this=0x55555576bc20) at FileSystem.cpp:56
56 generateRootDir(10);
(gdb) s
FileSystem::generateRootDir (this=0x55555576bc20, rootBlock=10)
at FileSystem.cpp:147
147 disk->writeSector(10, test);
(gdb) s
BlockDisk::writeSector (this=0x0, address=10,
block=0x55555576bc90 "001004005005006999") at BlockDisk.cpp:21
21 if (address > blocks || address < 0)
(gdb) s
Program received signal SIGSEGV, Segmentation fault.
0x0000555555556733 in BlockDisk::writeSector (this=0x0, address=10,
block=0x55555576bc90 "001004005005006999") at BlockDisk.cpp:21
21 if (address > blocks || address < 0)
(gdb) s
两个呼叫的GDB似乎都一样,但都给出了分割故障。对此的任何帮助将不胜感激。
如果这一行成功:
disk->writeSector(10, test);
和generateRootDir
中的相同线路与disk == NULL
失败:
void FileSystem::generateRootDir(int rootBlock)
{
disk->writeSector(10, test);
}
然后,disk
的值在第一个位置有效,但在第二个位置无效。
很可能这两个 disk
s是指不同的变量(其中一个已正确初始化,另一个没有)。
您可以在GDB中验证该理论:print &disk
将在generateRootDir
内外产生不同的结果。