1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-04 06:45:43 +02:00

[263527] Give ability to override the way to find the GDB version.

This commit is contained in:
Marc Khouzam 2009-04-13 17:23:53 +00:00
parent 2a589c0f4b
commit f725205888
2 changed files with 53 additions and 23 deletions

View file

@ -129,7 +129,7 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate
monitor.worked( 1 );
String gdbVersion = LaunchUtils.getGDBVersion(config);
String gdbVersion = getGDBVersion(config);
// First make sure non-stop is supported, if the user want to use this mode
if (isNonStopSession && !isNonStopSupported(gdbVersion)) {
@ -211,6 +211,16 @@ public class GdbLaunchDelegate extends LaunchConfigurationDelegate
}
}
/**
* Returns the GDB version on the local host.
* Subclass can override for special need.
*
* @since 2.0
*/
protected String getGDBVersion(ILaunchConfiguration config) throws CoreException {
return LaunchUtils.getGDBVersion(config);
}
/*
* This method can be overridden by subclasses to allow to change the final launch sequence without
* having to change the entire GdbLaunchDelegate

View file

@ -198,9 +198,43 @@ public class LaunchUtils {
}
return retVal;
}
public static String getGDBVersion(final ILaunchConfiguration configuration) throws CoreException {
String line, version = "";//$NON-NLS-1$
/**
* Find gdb version info from a string object which is supposed to
* contain output text of "gdb --version" command.
*
* @param versionOutput
* output text from "gdb --version" command .
* @return
* String representation of version of gdb such as "6.8" on success;
* empty string otherwise.
* @since 2.0
*/
public static String getGDBVersionFromText(String versionOutput) {
String version = "";//$NON-NLS-1$
// These are the GDB version patterns I have seen up to now
// The pattern works for all of them extracting the version of 6.8.50.20080730
// GNU gdb 6.8.50.20080730
// GNU gdb (GDB) 6.8.50.20080730-cvs
// GNU gdb (Ericsson GDB 1.0-10) 6.8.50.20080730-cvs
Pattern pattern = Pattern.compile(" gdb( \\(.*\\))? (\\d*(\\.\\d*)*)", Pattern.MULTILINE); //$NON-NLS-1$
Matcher matcher = pattern.matcher(versionOutput);
if (matcher.find()) {
version = matcher.group(2);
// Temporary for cygwin, until GDB 7 is released
// Any cygwin GDB staring with 6.8 should be treated as plain 6.8
if (versionOutput.toLowerCase().indexOf("cygwin") != -1 && //$NON-NLS-1$
version.startsWith("6.8")) { //$NON-NLS-1$
version = "6.8"; //$NON-NLS-1$
}
}
return version;
}
public static String getGDBVersion(final ILaunchConfiguration configuration) throws CoreException {
Process process = null;
String cmd = getGDBPath(configuration).toOSString() + " --version"; //$NON-NLS-1$
try {
@ -209,37 +243,23 @@ public class LaunchUtils {
throw new DebugException(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, DebugException.REQUEST_FAILED,
"Error while launching command: " + cmd, e.getCause()));//$NON-NLS-1$
}
StringBuilder cmdOutput = new StringBuilder(200);
try {
InputStream stream = process.getInputStream();
Reader r = new InputStreamReader(stream);
BufferedReader reader = new BufferedReader(r);
// These are the GDB version patterns I have seen up to now
// The pattern works for all of them extracting the version of 6.8.50.20080730
// GNU gdb 6.8.50.20080730
// GNU gdb (GDB) 6.8.50.20080730-cvs
// GNU gdb (Ericsson GDB 1.0-10) 6.8.50.20080730-cvs
Pattern pattern = Pattern.compile(" gdb( \\(.*\\))? (\\d*(\\.\\d*)*)", Pattern.MULTILINE); //$NON-NLS-1$
String line;
while ((line = reader.readLine()) != null) {
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
version = matcher.group(2);
// Temporary for cygwin, until GDB 7 is released
// Any cygwin GDB staring with 6.8 should be treated as plain 6.8
if (line.toLowerCase().indexOf("cygwin") != -1 && //$NON-NLS-1$
version.startsWith("6.8")) { //$NON-NLS-1$
version = "6.8"; //$NON-NLS-1$
}
}
cmdOutput.append(line);
}
} catch (IOException e) {
throw new DebugException(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, DebugException.REQUEST_FAILED,
"Error reading GDB STDOUT after sending: " + cmd, e.getCause()));//$NON-NLS-1$
}
return version;
return getGDBVersionFromText(cmdOutput.toString());
}
public static boolean getIsAttach(ILaunchConfiguration config) {