2017-03-02 3 views
0

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!

Antwort

0

Darf ich einige ihrer Methoden von meiner Methode eventDispatched aufrufen?

Ich kann nicht viel über die Details der Implementierung helfen, aber ich kann versuchen, für den folgenden Punkt zu helfen:

Aber aufgrund mir nicht voll kann heiß verstehen mit Kontexten zu arbeiten,

Ich selbst versuche zu verstehen, wie man mit GDB-Kontexten von der CDT DSF Sitzung arbeitet. Ich muss Daten aus einem anderen physischen Speicher in jedem Thread lesen, daher muss ich den Threadkontext wechseln, um den Speicherplatz zu wechseln. Was ich gefunden habe, ist die folgende Implementierung für die MI-Sitzung des DSF, und es scheint zu liefern, was wir beide brauchen. MIProcesses.java on github

Es ist ziemlich schwer, eine gute Dokumentation über die Verwendung zu finden! Bitte sagen Sie mir, wenn Sie welche gefunden haben.

PS: Ich bin neu in SO, also weiß ich nicht genau, ob das als Antwort richtig ist.