DSF GDB提取有关堆栈帧的数据

时间:2017-03-02 19:25:20

标签: java c++ eclipse debugging plugins

我在Eclipse中调试期间开发了一个可视化C / C ++程序的插件。我尝试使用DSF(调试器服务框架)。我研究了很多关于DSF的文档,但是我遇到了理解问题,如何使用DSF上下文。

为了开始我打开项目org.eclipse.cdt.examples.dsf.gdb并开始修改它。 我的目标是在每个调试步骤中提取有关所有堆栈帧(激活记录),局部变量,堆中的变量以及全局/静态变量的信息。

我做了什么。我将服务MIStack子类化并添加其构造函数事件监听器。

package org.eclipse.cdt.examples.dsf.gdb.service;

import org.eclipse.cdt.dsf.mi.service.MIStack;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.example.dsf.gdb.listener.Listener;

public class NewlMIStack extends MIStack {

    public NewMIStack(DsfSession session) {
        super(session);
        getSession().addServiceEventListener(new Listener(), null);
    }
}

通过这种方式,当用户按下“下一步”,“前进”等按钮时,我真的可以处理每个事件。为了做到这一点,我使用我的类Listener中的以下方法:

@DsfServiceEventHandler
public void eventDispatched(MISteppingRangeEvent e) {

    MIFrame frame = e.getFrame();
    System.out.println(frame.getFullname()); // Same as getFile()
    System.out.println("Function: " + frame.getFunction());
    System.out.println("File: " + frame.getFile());
    System.out.println("Frame level: " + frame.getLevel()); // Always equals zero
    System.out.println("Line: " + frame.getLine());
    System.out.println("Address: " + frame.getAddress());

    MIArg[] args = frame.getArgs();
    if (args.length > 0) {
        System.out.println("Arguments:");
        for (MIArg arg : args) {
            System.out.println("Name: " + arg.getName());
            System.out.println("Value: " + arg.getValue());
        }
    }
}

问题在于,它只是我需要提取的信息的一小部分。据我所知,其他部分信息(如变量状态,变量类型等)我可以使用服务IExpression提取,也可能是GDBMemory。但我不明白如何使用这些服务。我可以从我的方法eventDispatched中调用他们的方法吗?

此外,我尝试在我的事件hanle方法中添加以下代码:

IExpressionDMContext expressionDMC = DMContexts.getAncestorOfType(e.getDMContext(), IExpressionDMContext.class); 
// getAncestorOfType always returns null

IExpressions expressionService = getServicesTracker().getService(IExpressions.class);
DataRequestMonitor<IExpressionDMData> drm = new DataRequestMonitor<>(getExecutor(), null);
expressionService.getExpressionData(expressionDMC, drm);  

但是由于我无法完全理解使用上下文的热点,这段代码并没有帮助我解决我的问题。

我真的花了很多时间来解决这个问题,遗憾的是没有成功,所以我很乐意看到任何评论!

1 个答案:

答案 0 :(得分:0)

  

我可以从我的方法eventDispatched中调用他们的方法吗?

我对您的实施细节无能为力,但我可以尝试帮助以下几点:

  

但由于我无法完全理解使用上下文的热点,

我自己试图了解如何使用CDT DSF会话中的GDB上下文。我需要从每个线程中的不同物理内存中读取数据,因此我需要切换线程上下文来切换内存空间。 我发现的是DSF的MI会话的以下实现,它似乎提供了我们都需要的东西。 MIProcesses.java on github

很难找到关于使用情况的好文档!请告诉我你是否找到了。

PS:我是新手,所以我不确切地知道这是否正确答案。