/******************************************************************************* * Copyright (c) 2004, 2010 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * QNX Software Systems - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.debug.mi.core; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.debug.core.cdi.model.ICDITarget; import org.eclipse.cdt.debug.mi.core.cdi.Session; import org.eclipse.cdt.debug.mi.core.cdi.model.Target; import org.eclipse.cdt.debug.mi.core.command.CommandFactory; import org.eclipse.cdt.debug.mi.core.command.MIGDBSet; import org.eclipse.cdt.debug.mi.core.command.MITargetSelect; import org.eclipse.cdt.debug.mi.core.output.MIInfo; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; /** * Implementing the cdebugger extension point for gdbserver. */ public class GDBServerCDIDebugger2 extends GDBCDIDebugger2 { /* (non-Javadoc) * @see org.eclipse.cdt.debug.mi.core.GDBCDIDebugger2#doStartSession(org.eclipse.debug.core.ILaunch, org.eclipse.cdt.debug.mi.core.cdi.Session, org.eclipse.core.runtime.IProgressMonitor) */ protected void doStartSession( ILaunch launch, Session session, IProgressMonitor monitor ) throws CoreException { ILaunchConfiguration config = launch.getLaunchConfiguration(); initializeLibraries( config, session ); if ( monitor.isCanceled() ) { throw new OperationCanceledException(); } String debugMode = config.getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN ); if ( ICDTLaunchConfigurationConstants.DEBUGGER_MODE_RUN.equals( debugMode ) ) startGDBServerSession( config, session, monitor ); if ( ICDTLaunchConfigurationConstants.DEBUGGER_MODE_ATTACH.equals( debugMode ) ) { String msg = MIPlugin.getResourceString( "src.GDBServerDebugger.GDBServer_attaching_unsupported" ); //$NON-NLS-1$ throw newCoreException( msg, null ); } if ( ICDTLaunchConfigurationConstants.DEBUGGER_MODE_CORE.equals( debugMode ) ) { String msg = MIPlugin.getResourceString( "src.GDBServerDebugger.GDBServer_corefiles_unsupported" ); //$NON-NLS-1$ throw newCoreException( msg, null ); } } protected void startGDBServerSession( ILaunchConfiguration config, Session session, IProgressMonitor monitor ) throws CoreException { if ( monitor.isCanceled() ) { throw new OperationCanceledException(); } ICDITarget[] targets = session.getTargets(); int launchTimeout = MIPlugin.getLaunchTimeout(); boolean tcpConnection = config.getAttribute( IGDBServerMILaunchConfigurationConstants.ATTR_REMOTE_TCP, false ); // Set serial line parameters if ( !tcpConnection ) { String remoteBaud = config.getAttribute( IGDBServerMILaunchConfigurationConstants.ATTR_DEV_SPEED, "invalid" ); //$NON-NLS-1$ for( int i = 0; i < targets.length; ++i ) { if ( monitor.isCanceled() ) { throw new OperationCanceledException(); } Target target = (Target)targets[i]; MISession miSession = target.getMISession(); CommandFactory factory = miSession.getCommandFactory(); MIGDBSet setRemoteBaud = factory.createMIGDBSet( new String[]{ "remotebaud", remoteBaud } ); //$NON-NLS-1$ // Set serial line parameters MIInfo info = null; MIException ex = null; try { // shouldn't we use the command timeout instead? miSession.postCommand( setRemoteBaud, launchTimeout ); info = setRemoteBaud.getMIInfo(); } catch( MIException e ) { ex = e; } if ( info == null ) { throw newCoreException( MIPlugin.getResourceString( "src.GDBServerDebugger.Can_not_set_Baud" ), ex ); //$NON-NLS-1$ } } } for( int i = 0; i < targets.length; ++i ) { if ( monitor.isCanceled() ) { throw new OperationCanceledException(); } Target target = (Target)targets[i]; MISession miSession = target.getMISession(); CommandFactory factory = miSession.getCommandFactory(); String[] targetParams = getTargetParams( config, tcpConnection ); MITargetSelect select = factory.createMITargetSelect( targetParams ); MIInfo info = null; MIException ex = null; try { miSession.postCommand( select, launchTimeout ); info = select.getMIInfo(); } catch( MIException e ) { ex = e; } if ( info == null ) { throw newCoreException( MIPlugin.getResourceString( "src.GDBServerCDIDebugger.target_selection_failed" ), ex ); //$NON-NLS-1$ } // @@@ We have to set the suspended state manually miSession.getMIInferior().setSuspended(); miSession.getMIInferior().update(); miSession.getMIInferior().setIsRemoteInferior(true); } } protected String[] getTargetParams( ILaunchConfiguration config, boolean tcpConnection ) throws CoreException { String remote = null; if ( tcpConnection ) { remote = config.getAttribute( IGDBServerMILaunchConfigurationConstants.ATTR_HOST, "invalid" ); //$NON-NLS-1$ remote += ":"; //$NON-NLS-1$ remote += config.getAttribute( IGDBServerMILaunchConfigurationConstants.ATTR_PORT, "invalid" ); //$NON-NLS-1$ } else { remote = config.getAttribute( IGDBServerMILaunchConfigurationConstants.ATTR_DEV, "invalid" ); //$NON-NLS-1$ } return new String[]{ "remote", remote }; //$NON-NLS-1$ } /* (non-Javadoc) * @see org.eclipse.cdt.debug.mi.core.AbstractGDBCDIDebugger#usePty(org.eclipse.debug.core.ILaunchConfiguration) */ protected boolean usePty( ILaunchConfiguration config ) throws CoreException { return false; } }