mmap 损坏,是 malloc 覆盖内存中的元素
mmap gets corrupted, is malloc overriding elements on memory
我一直在数据文件中遇到随机问题,这些数据文件是使用 mmap 以只读方式访问的(它们很大),我一直试图找到错误的来源,我注意到了什么是文件在最后被破坏,随机数据来自当时正在执行的任何内容(从控制台中提取,其他程序执行的一些日志等)。今天,我的程序又崩溃了,但这次我注意到损坏的文件只是以只读方式打开,这没有意义。如果使用以下命令打开文件,文件会如何损坏:
FILE _pFile = ::open(fileName, O_RDONLY);
char* _addr = reinterpret_cast<char *>(mmap(NULL, fileLenRequired, PROT_READ, MAP_FILE | (shared?MAP_SHARED:MAP_PRIVATE) | MAP_POPULATE , _pFile, offset));
阅读其他一些问题后,我认为 mmap 不是 "protected",它可能是 overridden/overlapped 通过 malloc 调用,我该如何防止这种情况?
顺便说一句,我认为这是由内存泄漏或错误的指针引起的,因此我使用 valgrind 进行了全面检查并修复了几个问题,但文件时常损坏。
好的,终于我发现了问题所在,问题不在于映射文件,最初我以为系统崩溃是因为文件不知何故被破坏了,我发现是先崩溃然后再崩溃打开的文件被垃圾损坏。问题是它真的很难重现,而且只发生在生产服务器上,我绞尽脑汁想弄清楚这是怎么回事。
感谢大家花时间阅读并尝试提出建议,至少这有助于检查我的代码是否没有做明显的错误。
我一直在数据文件中遇到随机问题,这些数据文件是使用 mmap 以只读方式访问的(它们很大),我一直试图找到错误的来源,我注意到了什么是文件在最后被破坏,随机数据来自当时正在执行的任何内容(从控制台中提取,其他程序执行的一些日志等)。今天,我的程序又崩溃了,但这次我注意到损坏的文件只是以只读方式打开,这没有意义。如果使用以下命令打开文件,文件会如何损坏:
FILE _pFile = ::open(fileName, O_RDONLY);
char* _addr = reinterpret_cast<char *>(mmap(NULL, fileLenRequired, PROT_READ, MAP_FILE | (shared?MAP_SHARED:MAP_PRIVATE) | MAP_POPULATE , _pFile, offset));
阅读其他一些问题后,我认为 mmap 不是 "protected",它可能是 overridden/overlapped 通过 malloc 调用,我该如何防止这种情况?
顺便说一句,我认为这是由内存泄漏或错误的指针引起的,因此我使用 valgrind 进行了全面检查并修复了几个问题,但文件时常损坏。
好的,终于我发现了问题所在,问题不在于映射文件,最初我以为系统崩溃是因为文件不知何故被破坏了,我发现是先崩溃然后再崩溃打开的文件被垃圾损坏。问题是它真的很难重现,而且只发生在生产服务器上,我绞尽脑汁想弄清楚这是怎么回事。
感谢大家花时间阅读并尝试提出建议,至少这有助于检查我的代码是否没有做明显的错误。