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)
答
有没有检查以确保i + offset
小于4096
。这可能是问题的根源。
是'i + offset'保证小于'4096'吗? –
这是一个明显的问题 - 它应该是。我猜可能有一个坏的XML导致这个,虽然 – adrianmcmenamin
我怀疑任何常见的c + +容器实现是线程安全的,它允许并发读/写操作。请参阅文档[g ++](http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_concurrency.html)和[msvc](http://msdn.microsoft.com/en-us/library/c9ceah3b。 aspx) – Stephan