私はこのコードを持っています:
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;
}
}
}
}
これは、4096 ビット長のビットセットを、ページのそのバイトがアクセスされたときに 1 でマークすることを目的としています。
このコードは、約 1 GB の XML をテストに使用したテスト マシンでうまく機能します。しかし、完全なもの (220 GB の XML) で実行すると、次のようにセグメンテーション エラーが発生します。
sets->lCode->insert(pair<long, bitset<4096> >
(page, bitset<4096>()));
しかし、これは実行の非常に早い段階で行われるため、これがデータのサイズの積であると考えるのは困難です。いずれにせよ、非常によく似たコードを使用してこの大きなデータセットを分析しても問題はありませんでした ( https://github.com/mcmenaminadrianで私の github リポジトリを確認してください- このプロジェクトは memsize ですが、pagestat は非常に類似したコードを使用しています)。このコードの唯一の差別化要因は、ビットセットの使用のようです。
これまで私を逃してきたエラーを誰かが見つけることができますか?
(コードはマルチスレッドです-ビットセットスレッドセーフですか?これはライブラリの問題でしょうか-私のテストシステムはMac OSXですが、「本番」システムはLinuxです-Ubuntu 12.04 LTSですか?)