Пользовательская конфигурация отладки Eclipse - PullRequest
1 голос
/ 07 февраля 2011

У меня есть пользовательская сборка 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 );
        }
    }
}

Моя проблема в том, что я получаю ошибку SIGILL от GDB при вызове CDIDebugModel.newDebugTarget (). Если я пропущу эту строку, то сеанс отладчика будет создан, но точки останова не достигнуты.

Когда я пытаюсь отладить вручную в командной строке, используя тот же двоичный файл, который был создан (и не удалось) в Eclipse, у меня не возникает никаких проблем. Единственное отличие, которое я заметил, было то, что я вызываю «load [BinaryName]» перед запуском команды «continue» (не выполнение этого приводит к той же ошибке SIGILL).

Есть идеи?

Спасибо, Alan

1 Ответ

1 голос
/ 07 февраля 2011

Мне кажется, я нашел проблему, и это было связано с тем, что я вызывал «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.

Надеюсь, это подведет черту под вопросом и, по крайней мере, поможет кому-то еще в подобной ситуации.

Спасибо, Alan

...