Ich entwickle ein Plugin für die Visualisierung von C/C++ - Programmen während des Debuggens in Eclipse. Ich versuche DSF (Debugger Services Framework) zu verwenden. Ich habe eine Menge Dokumentation über DSF studiert, aber ich hatte Probleme damit, zu verstehen, wie man mit DSF-Kontexten arbeitet.DSF GDB extrahieren Daten über Stack-Frames
Zum Anfang Ich öffne Projekt org.eclipse.cdt.examples.dsf.gdb und beginne zu ändern. Mein Ziel ist es, in jedem Debug-Schritt Informationen über alle Stack-Frames (Aktivierungsdatensätze), lokale Variablen, Variablen im Heap und globale/statische Variablen zu extrahieren.
Was ich getan habe. Ich Unterklasse Service MIStack und in seinem Konstruktor Ereignis Listener hinzufügen.
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);
}
}
Auf diese Weise wirklich ich jedes Ereignis verarbeiten kann, wenn die Benutzer-Taste drücken Sie „nächsten Schritt“, „Schritt nach vorn“, etc. Um die folgenden Methode aus meiner Klasse Listener es mir zu tun:
@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());
}
}
}
Das Problem ist, dass es nur ein kleiner Teil der Informationen ist, die ich extrahieren muss. Wie ich verstanden habe, kann ich einen anderen Teil der Informationen (wie Status der Variablen, Arten von Variablen, etc.) mit Hilfe der IEExpression extrahieren und kann GDBMemory sein. Aber ich verstehe nicht, wie man diese Dienste benutzt. Darf ich einige ihrer Methoden von meiner Methode eventDispatched aufrufen?
Auch habe ich versucht, in meinem Fall hanle Methode den folgenden Code hinzuzufügen:
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);
Aber wegen ich dieser Code nicht vollständig mit Kontexten versteht heiß zu arbeiten, nicht mir helfen, hätte zu lösen Problem.
Ich habe wirklich viel Zeit investiert, um dieses Problem zu lösen, leider ohne Erfolg, also werde ich mich sehr freuen, irgendwelche Kommentare zu sehen!