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; #if DBG_LOG if(gfp.IsOpened()) { gfp.Write(strdebug); gfp.Flush(); } #else m_observer->UpdateAddLine( strdebug ); #endif } } 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); } } } }