Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 15034619d36d20cf680a646db6fec8a9717be2cc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*******************************************************************************
 * Copyright (c) 2016 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
 *******************************************************************************/
package org.eclipse.cdt.internal.qt.core.launch;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.ExecutionException;

import org.eclipse.cdt.core.build.IToolChain;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor;
import org.eclipse.cdt.dsf.concurrent.Query;
import org.eclipse.cdt.dsf.concurrent.RequestMonitorWithProgress;
import org.eclipse.cdt.dsf.concurrent.Sequence;
import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
import org.eclipse.cdt.dsf.gdb.launching.GdbSourceLookupDirector;
import org.eclipse.cdt.dsf.gdb.launching.ServicesLaunchSequence;
import org.eclipse.cdt.dsf.gdb.service.GdbDebugServicesFactory;
import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.internal.qt.core.Activator;
import org.eclipse.cdt.qt.core.IQtBuildConfiguration;
import org.eclipse.cdt.qt.core.QtLaunchConfigurationDelegate;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.launchbar.core.target.ILaunchTarget;
import org.eclipse.launchbar.core.target.launch.ITargetedLaunch;

public class QtLocalDebugLaunchConfigDelegate extends QtLaunchConfigurationDelegate {

	@Override
	public ITargetedLaunch getLaunch(ILaunchConfiguration configuration, String mode, ILaunchTarget target)
			throws CoreException {
		GdbLaunch launch = new GdbLaunch(configuration, mode, null);
		launch.setLaunchTarget(target);
		launch.initialize();

		GdbSourceLookupDirector locator = new GdbSourceLookupDirector(launch.getSession());
		String memento = configuration.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, (String) null);
		if (memento == null) {
			locator.initializeDefaults(configuration);
		} else {
			locator.initializeFromMemento(memento, configuration);
		}

		launch.setSourceLocator(locator);
		return launch;
	}

	@Override
	public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor)
			throws CoreException {
		GdbLaunch gdbLaunch = (GdbLaunch) launch;
		ILaunchTarget target = ((ITargetedLaunch) launch).getLaunchTarget();
		IQtBuildConfiguration qtBuildConfig = getQtBuildConfiguration(configuration, mode, target, monitor);

		IToolChain toolChain = qtBuildConfig.getToolChain();
		gdbLaunch.setGDBPath(toolChain.getCommandPath(Paths.get("gdb")).toString()); //$NON-NLS-1$
		String gdbVersion = gdbLaunch.getGDBVersion();

		Path exeFile = qtBuildConfig.getProgramPath();
		gdbLaunch.setProgramPath(exeFile.toString());

		gdbLaunch.setServiceFactory(new GdbDebugServicesFactory(gdbVersion, configuration));

		Sequence servicesLaunchSequence = new ServicesLaunchSequence(gdbLaunch.getSession(), gdbLaunch, monitor);
		gdbLaunch.getSession().getExecutor().execute(servicesLaunchSequence);
		try {
			servicesLaunchSequence.get();
		} catch (InterruptedException | ExecutionException e) {
			throw new DebugException(new Status(IStatus.ERROR, Activator.ID, "Failure launching with gdb", e));
		}

		gdbLaunch.initializeControl();

		gdbLaunch.addCLIProcess(gdbLaunch.getGDBPath().toOSString() + " (" + gdbVersion + ")"); //$NON-NLS-1$ //$NON-NLS-2$

		Query<Object> ready = new Query<Object>() {
			@Override
			protected void execute(final DataRequestMonitor<Object> rm) {
				DsfServicesTracker tracker = new DsfServicesTracker(
						Activator.getDefault().getBundle().getBundleContext(), gdbLaunch.getSession().getId());
				IGDBControl control = tracker.getService(IGDBControl.class);
				tracker.dispose();
				control.completeInitialization(
						new RequestMonitorWithProgress(ImmediateExecutor.getInstance(), monitor) {
					@Override
					protected void handleCompleted() {
						if (isCanceled()) {
							rm.cancel();
						} else {
							rm.setStatus(getStatus());
						}
						rm.done();
					}
				});
			}
		};

		// Start it up
		gdbLaunch.getSession().getExecutor().execute(ready);
		try {
			ready.get();
		} catch (ExecutionException | InterruptedException e) {
			throw new DebugException(new Status(IStatus.ERROR, Activator.ID, "Failure to start debug session", e));
		}
	}

}

Back to the top