CDT源代碼框架分析改造 線程對象的改造(三)

需求:當Debug系統上點擊了中止跟蹤後,若是緩存楨個數不爲零,則默認顯示第一楨的基本信息(跟蹤點的id,線程id。等)緩存

添加中止跟蹤事件,這部分機制後面說。ICDIStopTraceEvent。mvc

CThread對象實現了ICDIEventListener接口,所以在出發中止跟蹤事件的時候。該類的handleDebugEvents方法會攔截到此命令。app

在CDT中,每一個調試對象都有一個表現層跟CDT層的對象eclipse

例如線程對象。ide

CThread對象位於eclipse的core包中。它經過getCDIThread() 方法條用CDT層的Thread對象。post

Thread實現了對命令下發等操做。this

ICDIThread藉口中包含了用戶的一些操做指令spa

例如這裏咱們自定義的顯示楨的信息。插件

 

CThread{    
.....
public void handleDebugEvents( ICDIEvent[] events ) {
        if ( isDisposed() )
            return;
        for( int i = 0; i < events.length; i++ ) {
            ICDIEvent event = events[i];
            ICDIObject source = event.getSource();
            
            if(event instanceof  ICDIStopTraceEvent )
            {
                
//中止跟蹤點事件
                  handleStopTraceEvent((ICDIStopTraceEvent)event);
}
.....
}


private void handleStopTraceEvent(ICDIStopTraceEvent event) { this.getCDIThread().showFrame(event.getFrameNum()); fireChangeEvent( DebugEvent.STARTTRACE ); }

fireChangeEvent刷新界面線程

修改線程的名字

在eclipse插件開發中,都是採用內容提供器,標籤提供器 mvc的方式來顯示。

CDebugModelPresentation這個類做爲全部標籤的提供類。

線程標籤的顯示的內容分爲幾部分。對象名字,狀態,線程名字,以及狀態信息。

這裏修改標籤類的getThreadText方法。重構爲getFrameText方法。

CDebugUIMessages中從新添加Frame名字字段。這裏將全部Thread更替爲Frame。同時添加一個狀態的變動。thread.isTraceing()。若是是跟蹤狀態顯示其狀態。

    protected String getFrameText( IThread thread, boolean qualified ) throws DebugException {
        ICDebugTarget target = (ICDebugTarget)thread.getDebugTarget().getAdapter( ICDebugTarget.class );
        if ( target.isPostMortem() ) {
            return getFormattedString( CDebugUIMessages.getString( "CDTDebugModelPresentation.f8" ), thread.getName() ); //$NON-NLS-1$
        }
        //這裏添加一個啓動跟蹤的判斷,若是是啓動跟蹤,則顯示狀態

        if ( !thread.isTraceing()) {
            return getFormattedString( CDebugUIMessages.getString( "CDTDebugModelPresentation.f28" ), thread.getName() ); //$NON-NLS-1$
        }
        if ( thread.isTraceing()) {
            return getFormattedString( CDebugUIMessages.getString( "CDTDebugModelPresentation.f29" ), thread.getName() ); //$NON-NLS-1$
        }

好了。作模型判斷。若是是kgtp模型,則修改成楨。

private String getBaseText( Object element ) {


    else if ( element instanceof IThread )
            {
                int  mode=((IKideLaunch)((IThread)element).getLaunch()).getDebugMode();
                
                //這裏作一個模型判斷。若是是kgtp則顯示的的是楨的信息
                if(mode==IZTELaunchConfigurationConstants.KIDE_DEBUG_KGTP_MODE)
                {
                    label.append( getFrameText( (IThread)element, showQualified ) );
                    
                }else
            
                label.append( getThreadText( (IThread)element, showQualified ) );
                
            }

}

好了,如今開始作,查詢楨的內容

添加一個查詢楨的命令

package org.eclipse.cdt.debug.mi.core.command;

import org.eclipse.cdt.debug.mi.core.MIException;
import org.eclipse.cdt.debug.mi.core.output.MISelectFrameFomFrameIdInfo;
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
import org.eclipse.cdt.debug.mi.core.output.MIOutput;
import org.eclipse.cdt.debug.mi.core.output.MIThreadSelectInfo;

public class MISelectFrameFomFrameIdAction extends MICommand {
    
    public MISelectFrameFomFrameIdAction(String miVersion,String id){
            
        super(miVersion,"-trace-find frame-number "+id);
    }

    public MISelectFrameFomFrameIdInfo getMIFrameSelectInfo() throws MIException {
        return (MISelectFrameFomFrameIdInfo)getMIInfo();
    }

    public MIInfo getMIInfo() throws MIException {
        MIInfo info = null;
        MIOutput out = getMIOutput();
        if (out != null) {
            info = new MIThreadSelectInfo(out);
            if (info.isError()) {
                throwMIException(info, out);
            }
        }
        return info;
    }
}

 

MISelectFrameInfo 爲返回解析類。它分爲幾種類型,done,error。具體不作解釋了。

 

/***
 * 
 * 顯示楨的基本信息 。。這裏 由於 
 * 
 */
    @Override
    public void  showFrame(int frameNum) {
        
        if(frameNum>0)
        {
        Target target = (Target)getTarget();
        MISession mi = target.getMISession();
        CommandFactory factory = mi.getCommandFactory();
        //
        MISelectFrameFomFrameIdAction frames = factory.selectFrameFromFrameid((0+"").trim());
        try {
            mi.postCommand(frames);
        } catch (MIException e) {
            // TODO 自動生成的 catch 塊
            e.printStackTrace();
        }
            try {
                name="[跟蹤點的編號爲:"+frames.getMIFrameSelectInfo().getTraceframe()+",方法 名字爲 :"+frames.getMIFrameSelectInfo().getFramefunc()
                        
                        +",地址爲 "+frames.getMIFrameSelectInfo().getFrameaddr()+"]";
            } catch (MIException e) {
                // TODO 自動生成的 catch 塊
                e.printStackTrace();
            }
            
            
        
        }
        // TODO 自動生成的方法存根
      //
    }
相關文章
相關標籤/搜索