我在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);
但是由于我无法完全理解使用上下文的热点,这段代码并没有帮助我解决我的问题。
我真的花了很多时间来解决这个问题,遗憾的是没有成功,所以我很乐意看到任何评论!
答案 0 :(得分:0)
我可以从我的方法eventDispatched中调用他们的方法吗?
我对您的实施细节无能为力,但我可以尝试帮助以下几点:
但由于我无法完全理解使用上下文的热点,
我自己试图了解如何使用CDT DSF会话中的GDB上下文。我需要从每个线程中的不同物理内存中读取数据,因此我需要切换线程上下文来切换内存空间。 我发现的是DSF的MI会话的以下实现,它似乎提供了我们都需要的东西。 MIProcesses.java on github
很难找到关于使用情况的好文档!请告诉我你是否找到了。
PS:我是新手,所以我不确切地知道这是否正确答案。