C++的std ::地图的std :: bitset的段错误

问题描述:

我有这样的代码:C++的std ::地图的std :: bitset的段错误

static void XMLCALL 
hackHandler(void *data, const XML_Char *name, const XML_Char **attr) 
{ 
SetPointers* sets = static_cast<SetPointers*>(data); 
if (strcmp(name, "instruction") == 0 || strcmp(name, "load") == 0 || 
    strcmp(name, "modify") == 0||strcmp(name, "store") == 0) { 
    long address(0); 
    long page(0); 
    int offset(0); 
    long size(0); 
    int i(0); 
    for (i = 0; attr[i]; i += 2) { 
     if (strcmp(attr[i], "address") == 0) { 
      address = strtol(attr[i+1], NULL, 16); 
      page = address >> 12; 
      offset = address & 0xFFF; 
      continue; 
     } 
     if (strcmp(attr[i], "size") == 0) { 
      size = strtol(attr[i + 1], NULL, 16); 
     } 
    } 
    map<long, bitset<4096> >::iterator itLocal; 

    itLocal = sets->lCount->find(page); 
    if (itLocal == sets->lCount->end()) { 
     sets->lCount->insert(pair<long, bitset<4096> > 
      (page, bitset<4096>())); 
     itLocal = sets->lCount->find(page); 
    } 
    //now mark the bitmap 
    for (i = 0; i < size; i++) { 
     (itLocal->second)[i + offset] = 1; 
    } 

    if (strcmp(name, "instruction") == 0) { 
     itLocal = sets->lCode->find(page); 
     if (itLocal == sets->lCode->end()) { 
      sets->lCode->insert(pair<long, bitset<4096> > 
       (page, bitset<4096>())); 
      itLocal = sets->lCode->find(page); 
     } 
     for (i = 0; i < size; i++) { 
      (itLocal->second)[i + offset] = 1; 
     } 
    } else { 
     itLocal = sets->lMemory->find(page); 
     if (itLocal == sets->lMemory->end()) { 
      sets->lMemory->insert(pair<long, bitset<4096> > 
       (page, bitset<4096>())); 
      itLocal = sets->lMemory->find(page); 
     } 
     for (i = 0; i < size; i++) { 
      (itLocal->second)[i + offset] = 1; 
     } 
    } 
} 
} 

这旨在纪念一个bitset,4096位长,用时1页的该字节被访问。

当我使用大约1GB的XML进行测试时,此代码适用于我的测试机器。但是,当我在全事情运行(XML的220GB),它给出了一个段故障:

sets->lCode->insert(pair<long, bitset<4096> > 
      (page, bitset<4096>())); 

但它在运行做到这一点非常早,所以认为这是对一个产品很难数据的大小。无论如何,我在使用一些非常相似的代码分析这个更大的数据集时没有问题(检查我的github回购https://github.com/mcmenaminadrian - 此项目是memsize,但pagestat使用非常类似的代码)。这个代码的唯一区别因素似乎是使用bitset。

有人可以发现迄今为止没有发现的错误吗?

(代码是多线程的 - 是位集线程安全难道这是一个图书馆的问题 - 我的测试系统是Mac OSX上,但“生产”是Linux系统 - 的Ubuntu 12.04 LTS)

+1

是'i + offset'保证小于'4096'吗? –

+0

这是一个明显的问题 - 它应该是。我猜可能有一个坏的XML导致这个,虽然 – adrianmcmenamin

+0

我怀疑任何常见的c + +容器实现是线程安全的,它允许并发读/写操作。请参阅文档[g ++](http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_concurrency.html)和[msvc](http://msdn.microsoft.com/en-us/library/c9ceah3b。 aspx) – Stephan

有没有检查以确保i + offset小于4096。这可能是问题的根源。