void TrashProtocol::get(const KURL &url) { INIT_IMPL; kdDebug() << "get() : " << url << endl; if(!url.isValid()) { kdDebug() << kdBacktrace() << endl; error(KIO::ERR_SLAVE_DEFINED, i18n("Malformed URL %1").arg(url.url())); return; } if(url.path().length() <= 1) { error(KIO::ERR_IS_DIRECTORY, url.prettyURL()); return; } int trashId; QString fileId; QString relativePath; bool ok = TrashImpl::parseURL(url, trashId, fileId, relativePath); if(!ok) { error(KIO::ERR_SLAVE_DEFINED, i18n("Malformed URL %1").arg(url.prettyURL())); return; } const QString physicalPath = impl.physicalPath(trashId, fileId, relativePath); if(physicalPath.isEmpty()) { error(impl.lastErrorCode(), impl.lastErrorMessage()); return; } // Usually we run jobs in TrashImpl (for e.g. future kdedmodule) // But for this one we wouldn't use DCOP for every bit of data... KURL fileURL; fileURL.setPath(physicalPath); KIO::Job *job = KIO::get(fileURL); connect(job, SIGNAL(data(KIO::Job *, const QByteArray &)), this, SLOT(slotData(KIO::Job *, const QByteArray &))); connect(job, SIGNAL(mimetype(KIO::Job *, const QString &)), this, SLOT(slotMimetype(KIO::Job *, const QString &))); connect(job, SIGNAL(result(KIO::Job *)), this, SLOT(jobFinished(KIO::Job *))); qApp->eventLoop()->enterLoop(); }
void checkNonExistentClients() { startTransiencyCheck(kdBacktrace(), NULL, true); checkTransiency(); }
void KDebugDCOPIface::printBacktrace() { kdDebug() << kdBacktrace() << endl; }
void Crash::crashHandler( int /*signal*/ ) { // we need to fork to be able to get a // semi-decent bt - I dunno why const pid_t pid = ::fork(); if( pid < 0 ) { std::cout << "forking crash reporter failed\n"; // continuing now can't do no good _exit( 1 ); } else if ( pid == 0 ) { // we are the child process (the result of the fork) std::cout << "Pana is crashing...sorry this will be a minute...\n"; QString subject = APP_VERSION " "; QString body = i18n( "Pana has crashed.\n\n" "Please help us fix it by clicking send on the crash report, " "If you have time please add a brief description of what was happening just before the crash.\n\n" "Thank you very much.\n\n" ); body += i18n( "\n\n\n\n\n\n" "The information below is to help identify the problem.\n\n\n "); body += "=== Debug information ===\n" "Version: " APP_VERSION "\n" "Engine: %1\n" "Build date: " __DATE__ "\n" "CC version: " __VERSION__ "\n" "KDElibs: " KDE_VERSION_STRING "\n" "Qt: %2\n" "TagLib: %3.%4.%5\n" "CPU count: %6\n"; QString cpucount = "unknown"; #ifdef __linux__ QString line; uint cpuCount = 0; QFile cpuinfo( "/proc/cpuinfo" ); if ( cpuinfo.open( IO_ReadOnly ) ) { while ( cpuinfo.readLine( line, 20000 ) != -1 ) { if ( line.startsWith( "processor" ) ) { ++cpuCount; } } } cpucount = QString::number( cpuCount ); #endif body = body.arg( PanaConfig::soundSystem() ) .arg( qVersion() ) .arg( TAGLIB_MAJOR_VERSION ) .arg( TAGLIB_MINOR_VERSION ) .arg( TAGLIB_PATCH_VERSION ) .arg( cpucount ); #ifdef NDEBUG body += "NDEBUG: true"; #endif body += '\n'; /// obtain the backtrace with gdb KTempFile temp; temp.setAutoDelete( true ); const int handle = temp.handle(); // QCString gdb_command_string = // "file panaapp\n" // "attach " + QCString().setNum( ::getppid() ) + "\n" // "bt\n" "echo \\n\n" // "thread apply all bt\n"; const QCString gdb_batch = "bt\n" "echo \\n\\n\n" "bt full\n" "echo \\n\\n\n" "echo ==== (gdb) thread apply all bt ====\\n\n" "thread apply all bt\n"; ::write( handle, gdb_batch, gdb_batch.length() ); ::fsync( handle ); // so we can read stderr too ::dup2( fileno( stdout ), fileno( stderr ) ); QCString gdb; gdb = "gdb --nw -n --batch -x "; gdb += temp.name().latin1(); gdb += " panaapp "; gdb += QCString().setNum( ::getppid() ); QString bt = runCommand( gdb ); /// clean up bt.remove( "(no debugging symbols found)..." ); bt.remove( "(no debugging symbols found)\n" ); bt.replace( QRegExp("\n{2,}"), "\n" ); //clean up multiple \n characters bt.stripWhiteSpace(); /// analyze usefulness bool useful = true; const QString fileCommandOutput = runCommand( "file `which panaapp`" ); if( fileCommandOutput.find( "not stripped", false ) == -1 ) subject += "[___stripped]"; //same length as below else subject += "[NOTstripped]"; if( !bt.isEmpty() ) { const int invalidFrames = bt.contains( QRegExp("\n#[0-9]+\\s+0x[0-9A-Fa-f]+ in \\?\\?") ); const int validFrames = bt.contains( QRegExp("\n#[0-9]+\\s+0x[0-9A-Fa-f]+ in [^?]") ); const int totalFrames = invalidFrames + validFrames; if( totalFrames > 0 ) { const double validity = double(validFrames) / totalFrames; subject += QString("[validity: %1]").arg( validity, 0, 'f', 2 ); if( validity <= 0.5 ) useful = false; } subject += QString("[frames: %1]").arg( totalFrames, 3 /*padding*/ ); if( bt.find( QRegExp(" at \\w*\\.cpp:\\d+\n") ) >= 0 ) subject += "[line numbers]"; } else useful = false; subject += QString("[%1]").arg( PanaConfig::soundSystem().remove( QRegExp("-?engine") ) ); std::cout << subject.latin1() << std::endl; //TODO -fomit-frame-pointer buggers up the backtrace, so detect it //TODO -O optimization can rearrange execution and stuff so show a warning for the developer //TODO pass the CXXFLAGS used with the email if( useful ) { body += "==== file `which panaapp` =======\n"; body += fileCommandOutput + "\n\n"; body += "==== (gdb) bt =====================\n"; body += bt + "\n\n"; body += "==== kdBacktrace() ================\n"; body += kdBacktrace(); //TODO startup notification kapp->invokeMailer( /*to*/ "*****@*****.**", /*cc*/ QString(), /*bcc*/ QString(), /*subject*/ subject, /*body*/ body, /*messageFile*/ QString(), /*attachURLs*/ QStringList(), /*startup_id*/ "" ); } else { std::cout << i18n( "\nPana has crashed.\n\n" "Perhaps an upgrade is already available " "which fixes the problem. Please check your distribution's software repository.\n" ).local8Bit(); } //_exit() exits immediately, otherwise this //function is called repeatedly ad finitum ::_exit( 255 ); } else { // we are the process that crashed ::alarm( 0 ); // wait for child to exit ::waitpid( pid, NULL, 0 ); ::_exit( 253 ); } }
void OscarMyselfContact::deleteContact() { kdWarning( OSCAR_GEN_DEBUG ) << k_funcinfo << "called on myself contact! Ignoring." << endl << kdBacktrace() << endl; }