Visual Studio 2008 から例外をキャッチできます。そこでは、デバッグ情報を有効にしてリリース モードで実行し、すべての例外を Debug->Exceptions メニューと
SEH Exceptions (/EHa) を IDE でオンにして
実行します。
m_NotificationTimer = new QTimer();
connect(m_NotificationTimer, SIGNAL(timeout()),
this,SLOT(CheckOuterLinks()/*,Qt::DirectConnection*/));
Bean が 3 秒ごとに呼び出すこの関数:
void CollectorWorker2::CheckOuterLinks()
{
while(!rpm_urlStack->isEmptyO())
{
QMutexLocker locker(m_pMutex1);
std::map<std::string,std::string > m = rpm_urlStack->topO();
locker.unlock();
}
}
top0() メソッドは、 QStack メンバー関数から最上位の要素を取得する関数であり、次のように pop() で要素を別の場所で削除しました。
std::map<std::string,std::string > UrlStack::topO()
{
std::map<std::string,std::string > m;
try
{
static QMutex mutex;
QMutexLocker locker(&mutex);
m = m_OuterLinksToProcessOutStack.top();
return m;
}
catch (std::exception const & e)
{
std::cout << "Standard exception: " << e.what() << std::endl;
}
catch (...)
{
std::cout << "Unknown exception." << std::endl;
}
}
m_OuterLinksToProcessOutStack は静的メンバーであり、mutex で保護されたコード内の別の場所からの要素で満たされます。
メンバーで満たされた m_OuterLinksToProcessOutStack は、2000 個の要素のようなものを残しました。別の場所でチェックするので、空のスタックの問題ではありません。
アプリケーションを実行してから数分後に、実行時にこのエラーが発生するという問題があります。
First-chance exception at 0x00403fc2 in app.exe: 0xC0000005: Access violation reading location 0x00000004.
QStack の top() メソッドで