我開發了一個插件,用於在Eclipse中進行調試期間對C/C++程序進行可視化。我嘗試使用DSF(調試器服務框架)。我研究了大量關於DSF的文檔,但是我遇到了理解問題,如何使用DSF上下文。DSF GDB提取有關堆棧幀的數據
對於開始,我打開項目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);
}
}
通過這種方式我當用戶擊中按鈕「下一步」,真的可以處理每個事件,「進步」等。爲了做到這一點我用下面的方法從我的類監聽:
@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調用他們的方法嗎?
而且我想在我的事件漢勒方法添加以下代碼:
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);
但由於我不能完全理解炎熱,環境工作,這段代碼並沒有幫助我解決我的問題。
我真的花了很多時間來解決這個問題,可悲的是沒有成功,所以我很樂意看到任何意見!