static bool openDumpFile(JNIEnv* env, jobject obj, jstring coreFileName) { // open the dump file jboolean isCopy; const char* buf = env->GetStringUTFChars(coreFileName, &isCopy); CHECK_EXCEPTION_(false); AutoJavaString coreFile(env, coreFileName, buf); if (setImageAndSymbolPath(env, obj) == false) { return false; } IDebugClient* ptrIDebugClient = (IDebugClient*) env->GetLongField(obj, ptrIDebugClient_ID); CHECK_EXCEPTION_(false); if (ptrIDebugClient->OpenDumpFile(coreFile) != S_OK) { THROW_NEW_DEBUGGER_EXCEPTION_("Windbg Error: OpenDumpFile failed!", false); } IDebugControl* ptrIDebugControl = (IDebugControl*) env->GetLongField(obj, ptrIDebugControl_ID); CHECK_EXCEPTION_(false); if (ptrIDebugControl->WaitForEvent(DEBUG_WAIT_DEFAULT, INFINITE) != S_OK) { THROW_NEW_DEBUGGER_EXCEPTION_("Windbg Error: WaitForEvent failed!", false); } return true; }
void ServerThread::maybeSendBacktrace() { QFile coreFile("core"); if (!coreFile.exists()) { qDebug() << "No core dump found"; return; } char *receiver = getenv("CRASH_REPORT_RECEIVER"); if (!receiver) { qDebug() << "CRASH_REPORT_RECEIVER environment variable not set"; return; } QProcess gdb; gdb.start(QString("gdb %1 core -q -x print-backtrace.gdb") .arg(mExecutable)); if (!gdb.waitForStarted()) { qDebug() << "Failed to launch gdb"; coreFile.remove(); return; } if (!gdb.waitForFinished()) { qDebug() << "gdb process is not finishing, killing"; gdb.kill(); coreFile.remove(); return; } coreFile.remove(); const QByteArray gdbOutput = gdb.readAllStandardOutput(); qDebug() << "gdb output:\n" << gdbOutput.constData(); QTime current = QTime::currentTime(); if (!mLastCrash.isNull() && mLastCrash.secsTo(current) < 60 * 10) { qDebug() << "Sent a crash report less than 10 minutes ago, " "dropping this one"; return; } mLastCrash = current; QProcess mail; mail.start(QString("mail -s \"Crash report for %1\" %2") .arg(mExecutable, QString::fromLocal8Bit(receiver))); if (!mail.waitForStarted()) { qDebug() << "Failed to launch mail"; return; } mail.write(gdbOutput); mail.closeWriteChannel(); if (mail.waitForFinished()) { qDebug() << "Crash report sent to" << receiver; } else { qDebug() << "mail process is not finishing, killing"; mail.kill(); } }