自定义Eclipse调试配置

时间:2011-02-07 12:09:05

标签: plugins gcc gdb debugging eclipse-cdt

我有一个gcc / gdb的自定义版本,我正在尝试与Eclipse CDT插件集成。我已经创建了一个自定义Eclipse工具链,并且可以使用它成功构建。

我现在要做的是启用远程调试,但目前我还没有成功。

我已经创建了一个扩展AbstractCLaunchDelegate的启动配置子类。在启动方法中,我有这样的代码:

public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException
{
    // Get path to binary
    IPath exePath = CDebugUtils.verifyProgramPath(configuration);
    ICProject project = CDebugUtils.verifyCProject(configuration);
    IBinaryObject exeFile = verifyBinary(project, exePath);

    // If debugging
    if(mode.equals("debug"))
    {
        // Get debug configuration
        ICDebugConfiguration config = getDebugConfig(configuration);

        // Get debugger instance
        ICDIDebugger2 debugger = (ICDIDebugger2)config.createDebugger();

        // Create session
        ICDISession session = debugger2.createSession(launch, exePath.toFile(), monitor);

        // Note: Copied from LocalCDILaunchDelegate
        boolean stopInMain = configuration.getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, false );
        String stopSymbol = null;
        if ( stopInMain )
            stopSymbol = launch.getLaunchConfiguration().getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL, ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_SYMBOL_DEFAULT );
        ICDITarget[] targets = session.getTargets();
        for( int i = 0; i < targets.length; i++ ) {
            Process process = targets[i].getProcess();
            IProcess iprocess = null;
            if ( process != null ) {
                iprocess = DebugPlugin.newProcess( launch, process, renderProcessLabel( exePath.toOSString() ), getDefaultProcessMap() );
            }

            // Note: Failing here with SIGILL
            CDIDebugModel.newDebugTarget( launch, project.getProject(), targets[i], renderTargetLabel( config ), iprocess, exeFile, true, false, stopSymbol, true );
        }
    }
}

我的问题是我在调用CDIDebugModel.newDebugTarget()时从GDB返回SIGILL错误。如果我将此行保留,则会创建调试器会话,但不会触发任何断点。

当我尝试使用Eclipse中创建(和失败)的相同二进制文件在命令提示符下手动调试时,我没有任何问题。我注意到的唯一区别是我在运行“continue”命令之前调用“load [BinaryName]”(不会导致同样的SIGILL错误)。

有什么想法吗?

谢谢, 艾伦

1 个答案:

答案 0 :(得分:1)

我认为我发现了这个问题,这与我从命令提示符调试时调用“load [BinaryName]”这一事实有关,而不是在Eclipse中调用。

我发现我需要获取MISession,然后调用MITargetDownload命令(这似乎相当于我的手册“load [BinaryName]”命令)。

基本代码是:

// Get MI session
MISession miSession = target.getMISession();

// Get target download command for loading program on target
MITargetDownload targetDownload = miSession.getCommandFactory().createMITargetDownload(exePath.toOSString());

// Load program on target
miSession.postCommand(targetDownload);

这需要在任何对CDIDebugModel.newDebugTarget的调用之前进行。

希望这会在这个问题上划清界限,至少会帮助处于类似情况的其他人。

谢谢, 艾伦