2017-03-02 80 views
0

我開發了一個插件,用於在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); 

但由於我不能完全理解炎熱,環境工作,這段代碼並沒有幫助我解決我的問題。

我真的花了很多時間來解決這個問題,可悲的是沒有成功,所以我很樂意看到任何意見!

回答

0

我可以從我的方法eventDispatched調用他們的方法嗎?

我不禁地講自己的執行細節,但我可以盡力幫助以下一點:

但由於我不能完全理解炎熱,環境工作,

我自己試圖理解如何使用CDT DSF會話中的GDB上下文。我需要從每個線程的不同物理內存中讀取數據,因此我需要切換線程上下文以切換內存空間。 我發現的是DSF MI會話的以下實現,它似乎提供了我們都需要的。 MIProcesses.java on github

很難找到有關使用情況的好文檔!請告訴我,如果你找到任何。 PS:我是新手,所以我不完全知道這是否是正確答案。