void DbgGdb::DoProcessAsyncCommand(wxString& line, wxString& id) { if(line.StartsWith(wxT("^error"))) { // the command was error, for example: // finish in the outer most frame // print the error message and remove the command from the queue DbgCmdHandler* handler = PopHandler(id); bool errorProcessed(false); if(handler && handler->WantsErrors()) { errorProcessed = handler->ProcessOutput(line); } if(handler) { delete handler; } StripString(line); // We also need to pass the control back to the program if(!errorProcessed) { m_observer->UpdateGotControl(DBG_CMD_ERROR); } if(!FilterMessage(line) && m_info.enableDebugLog) { m_observer->UpdateAddLine(line); } } else if(line.StartsWith(wxT("^done")) || line.StartsWith(wxT("^connected"))) { // The synchronous operation was successful, results are the return values. DbgCmdHandler* handler = PopHandler(id); if(handler) { handler->ProcessOutput(line); delete handler; } } else if(line.StartsWith(wxT("^running"))) { // asynchronous command was executed // send event that we dont have the control anymore m_observer->UpdateLostControl(); } else if(line.StartsWith(wxT("*stopped"))) { // get the stop reason, if(line == wxT("*stopped")) { if(m_bpList.empty()) { ExecuteCmd(wxT("set auto-solib-add off")); ExecuteCmd(wxT("set stop-on-solib-events 0")); } else { // no reason for the failure, this means that we stopped due to // hitting a loading of shared library // try to place all breakpoints which previously failed SetBreakpoints(); } Continue(); } else { // GDB/MI Out-of-band Records // caused by async command, this line indicates that we have the control back DbgCmdHandler* handler = PopHandler(id); if(handler) { handler->ProcessOutput(line); delete handler; } } } }
int _tmain(int argc, _TCHAR* argv[]) { std::string input = "svn_log.xml"; std::string output = "Changelog.txt"; int limit = 0; if (argc < 2) { // output help information printf("usage:\n"); printf("\n"); printf(" Changelog input <output> <limit>\n"); printf("\n"); printf(" input : input .xml file generated from SVN (using svn log --xml)\n"); printf(" DOWNLOAD to download direct from XBMC SVN\n"); printf(" <output> : output .txt file for the changelog (defaults to Changelog.txt)\n"); printf(" <limit> : the number of log entries for svn to fetch. (defaults to no limit)"); printf("\n"); return 0; } input = argv[1]; if (argc > 2) output = argv[2]; FILE *file = fopen(output.c_str(), "wb"); if (!file) return 1; fprintf(file, header); if (input.compare("download") == 0) { if(argc > 3) limit = atoi(argv[3]); // download our input file std::string command = "svn log -r 'HEAD':8638 "; if (limit > 0) { command += "--limit "; command += argv[3]; // the limit as a string command += " "; } #ifndef _LINUX command += "--xml https://xbmc.svn.sourceforge.net/svnroot/xbmc/trunk/XBMC > svn_log.xml"; #else command += "--xml https://xbmc.svn.sourceforge.net/svnroot/xbmc/branches/linuxport/XBMC > svn_log.xml"; #endif printf("Downloading changelog from SVN - this will take some time (around 1MB to download with no limit)\n"); system(command.c_str()); input = "svn_log.xml"; printf("Downloading done - processing\n"); } TiXmlDocument doc; if (!doc.LoadFile(input.c_str())) { return 1; } TiXmlElement *root = doc.RootElement(); if (!root) return 1; TiXmlElement *logitem = root->FirstChildElement("logentry"); while (logitem) { int revision; logitem->Attribute("revision", &revision); TiXmlNode *date = logitem->FirstChild("date"); std::string dateString; if (date && date->FirstChild()) dateString = date->FirstChild()->Value(); TiXmlNode *msg = logitem->FirstChild("msg"); if (msg && msg->FirstChild()) { // filter the message a bit std::string message = FilterMessage(msg->FirstChild()->Value()); if (message.size()) fprintf(file, "%s %4i %s\r\n", dateString.substr(0,10).c_str(), revision, message.c_str()); else int breakhere = 1; } logitem = logitem->NextSiblingElement("logentry"); } fclose(file); printf("Changelog saved as: %s\n", output.c_str()); return 0; }
void DbgGdb::Poke() { static wxRegEx reCommand(wxT("^([0-9]{8})")); // poll the debugger output wxString curline; if(!m_gdbProcess || m_gdbOutputArr.IsEmpty()) { return; } while(DoGetNextLine(curline)) { GetDebugeePID(curline); // For string manipulations without damaging the original line read wxString tmpline(curline); StripString(tmpline); tmpline.Trim().Trim(false); if(m_info.enableDebugLog) { // Is logging enabled? if(curline.IsEmpty() == false && !tmpline.StartsWith(wxT(">"))) { wxString strdebug(wxT("DEBUG>>")); strdebug << curline; clDEBUG() << strdebug << clEndl; m_observer->UpdateAddLine(strdebug); } } if(reConnectionRefused.Matches(curline)) { StripString(curline); #ifdef __WXGTK__ m_consoleFinder.FreeConsole(); #endif m_observer->UpdateAddLine(curline); m_observer->UpdateGotControl(DBG_EXITED_NORMALLY); return; } // Check for "Operation not permitted" usually means // that the process does not have enough permission to // attach to the process if(curline.Contains(wxT("Operation not permitted"))) { #ifdef __WXGTK__ m_consoleFinder.FreeConsole(); #endif m_observer->UpdateAddLine(_("Failed to start debugger: permission denied")); m_observer->UpdateGotControl(DBG_EXITED_NORMALLY); return; } if(tmpline.StartsWith(wxT(">"))) { // Shell line, probably user command line continue; } if(curline.StartsWith(wxT("~")) || curline.StartsWith(wxT("&")) || curline.StartsWith("@")) { // lines starting with ~ are considered "console stream" message // and are important to the CLI handler bool consoleStream(false); bool targetConsoleStream(false); if(curline.StartsWith(wxT("~"))) { consoleStream = true; } if(curline.StartsWith(wxT("@"))) { targetConsoleStream = true; } // Filter out some gdb error lines... if(FilterMessage(curline)) { continue; } StripString(curline); // If we got a valid "CLI Handler" instead of writing the output to // the output view, concatenate it into the handler buffer if(targetConsoleStream) { m_observer->UpdateAddLine(curline); } else if(consoleStream && GetCliHandler()) { GetCliHandler()->Append(curline); } else if(consoleStream) { // log message m_observer->UpdateAddLine(curline); } } else if(reCommand.Matches(curline)) { // not a gdb message, get the command associated with the message wxString id = reCommand.GetMatch(curline, 1); if(GetCliHandler() && GetCliHandler()->GetCommandId() == id) { // probably the "^done" message of the CLI command GetCliHandler()->ProcessOutput(curline); SetCliHandler(NULL); // we are done processing the CLI } else { // strip the id from the line curline = curline.Mid(8); DoProcessAsyncCommand(curline, id); } } else if(curline.StartsWith(wxT("^done")) || curline.StartsWith(wxT("*stopped"))) { // Unregistered command, use the default AsyncCommand handler to process the line DbgCmdHandlerAsyncCmd cmd(m_observer, this); cmd.ProcessOutput(curline); } else { // Unknow format, just log it if(m_info.enableDebugLog && !FilterMessage(curline)) { m_observer->UpdateAddLine(curline); } } } }
void DbgGdb::Poke() { static wxRegEx reCommand(wxT("^([0-9]{8})")); //poll the debugger output wxString line; if ( !m_gdbProcess || m_gdbOutputArr.IsEmpty() ) { return; } if (m_debuggeePid == wxNOT_FOUND) { if (GetIsRemoteDebugging()) { m_debuggeePid = m_gdbProcess->GetPid(); } else { std::vector<long> children; ProcUtils::GetChildren(m_gdbProcess->GetPid(), children); std::sort(children.begin(), children.end()); if (children.empty() == false) { m_debuggeePid = children.at(0); } if (m_debuggeePid != wxNOT_FOUND) { wxString msg; msg << wxT("Debuggee process ID: ") << m_debuggeePid; m_observer->UpdateAddLine(msg); } } } while ( DoGetNextLine( line ) ) { // For string manipulations without damaging the original line read wxString tmpline ( line ); StripString( tmpline ); tmpline.Trim().Trim(false); if (m_info.enableDebugLog) { //Is logging enabled? if (line.IsEmpty() == false && !tmpline.StartsWith(wxT(">")) ) { wxString strdebug(wxT("DEBUG>>")); strdebug << line; m_observer->UpdateAddLine(strdebug); } } if (reConnectionRefused.Matches(line)) { StripString(line); #ifdef __WXGTK__ m_consoleFinder.FreeConsole(); #endif m_observer->UpdateAddLine(line); m_observer->UpdateGotControl(DBG_EXITED_NORMALLY); return; } if( tmpline.StartsWith(wxT(">")) ) { // Shell line, probably user command line continue; } if (line.StartsWith(wxT("~")) || line.StartsWith(wxT("&"))) { // lines starting with ~ are considered "console stream" message // and are important to the CLI handler bool consoleStream(false); if ( line.StartsWith(wxT("~")) ) { consoleStream = true; } // Filter out some gdb error lines... if (FilterMessage(line)) { continue; } StripString( line ); // If we got a valid "CLI Handler" instead of writing the output to // the output view, concatenate it into the handler buffer if ( GetCliHandler() && consoleStream ) { GetCliHandler()->Append( line ); } else if ( consoleStream ) { // log message m_observer->UpdateAddLine( line ); } } else if (reCommand.Matches(line)) { //not a gdb message, get the command associated with the message wxString id = reCommand.GetMatch(line, 1); if ( GetCliHandler() && GetCliHandler()->GetCommandId() == id ) { // probably the "^done" message of the CLI command GetCliHandler()->ProcessOutput( line ); SetCliHandler( NULL ); // we are done processing the CLI } else { //strip the id from the line line = line.Mid(8); DoProcessAsyncCommand(line, id); } } else if (line.StartsWith(wxT("^done")) || line.StartsWith(wxT("*stopped"))) { //Unregistered command, use the default AsyncCommand handler to process the line DbgCmdHandlerAsyncCmd cmd(m_observer); cmd.ProcessOutput(line); } else { //Unknow format, just log it if( m_info.enableDebugLog && !FilterMessage(line)) { m_observer->UpdateAddLine(line); } } } }