私はこのかなり大きなネットワークシミュレーターをC++で書いています。私はそれらを開発している間、定期的に個々の部分をテストしてきました、そしてすべてをまとめた後、私がシミュレーターに課す負荷が大きすぎない限りそれはうまくいくようです(それはP2Pコンテンツ配信シミュレーターなので、より異なっています "内容」シミュレータが処理しなければならないより多くのデータ転送を紹介します)。シミュレートされているさまざまなコンテンツの数の特定のしきい値を超えると、数分間スムーズに実行された後、突然のSIGSEGVが発生します。メモリリークが発生し、最終的には大きくなりすぎて混乱していると思いましたが、しきい値を下回るパラメータでvalgrindを実行すると、問題なく終了しました。ただし、コンテンツ番号の重要な値を使用してvalgrindでプログラムを実行しようとすると、
==5987== Invalid read of size 8
==5987== at 0x40524E: Scheduler::advanceClock() (Scheduler.cpp:38)
==5987== by 0x45BA73: TestRun::execute() (TestRun.cpp:73)
==5987== by 0x45522B: main (CDSim.cpp:131)
==5987== Address 0x2e63bc70 is 0 bytes inside a block of size 32 free'd
==5987== at 0x4C2A4BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5987== by 0x405487: Scheduler::advanceClock() (Scheduler.cpp:69)
==5987== by 0x45BA73: TestRun::execute() (TestRun.cpp:73)
==5987== by 0x45522B: main (CDSim.cpp:131)
==5987==
==5987== Invalid read of size 4
==5987== at 0x40584E: Request::getSimTime() const (Event.hpp:45)
==5987== by 0x40525C: Scheduler::advanceClock() (Scheduler.cpp:38)
==5987== by 0x45BA73: TestRun::execute() (TestRun.cpp:73)
==5987== by 0x45522B: main (CDSim.cpp:131)
==5987== Address 0x2e63bc78 is 8 bytes inside a block of size 32 free'd
==5987== at 0x4C2A4BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5987== by 0x405487: Scheduler::advanceClock() (Scheduler.cpp:69)
==5987== by 0x45BA73: TestRun::execute() (TestRun.cpp:73)
==5987== by 0x45522B: main (CDSim.cpp:131)
==5987==
コード全体を見ずに答えを出すのは難しいかもしれませんが、ここで何が起こっているのかについての「高レベルの」ヒントはありますか?正常に動作しているように見える関数が突然誤動作し始める理由がわかりません。多分私が行方不明になっている明らかな何かがありますか?
前のvalgrindログの有罪判決を受けた行はif (nextEvent->getSimTime() < this->getSimTime())
、次のブロックにあります。
bool Scheduler::advanceClock() {
if (pendingEvents.size() == 0) {
std::cerr << "WARNING: Scheduler::advanceClock() - Empty event queue before "
"reaching the termination event" << std::endl;
return false;
}
const Event* nextEvent = pendingEvents.top();
// Check that the event is not scheduled in the past
if (nextEvent->getSimTime() < this->getSimTime()) {
std::cerr << "Scheduler::advanceClock() - Event scheduled in the past!" <<
std::endl;
std::cerr << "Simulation time: " << this->getSimTime()
<< ", event time: " << nextEvent->getSimTime()
<< std::endl;
exit(ERR_EVENT_IN_THE_PAST);
}
// Update the clock with the current event time (>= previous time)
this->setSimTime(nextEvent->getSimTime());
...
ここで、pendingEventsはboost :: heap::binomial_heapです。