码迷,mamicode.com
首页 > 编程语言 > 详细

CDT源代码框架分析改造 线程对象的改造(三)

时间:2015-09-02 18:35:14      阅读:444      评论:0      收藏:0      [点我收藏+]

标签:

需求:当Debug系统上点击了停止跟踪后,如果缓存桢个数不为零,则默认显示第一桢的基本信息(跟踪点的id,线程id。等)

添加停止跟踪事件,这部分机制后面说。ICDIStopTraceEvent。

CThread对象实现了ICDIEventListener接口,因此在出发停止跟踪事件的时候。该类的handleDebugEvents方法会拦截到此命令。

在CDT中,每个调试对象都有一个表现层跟CDT层的对象

例如线程对象。

CThread对象位于eclipse的core包中。它通过getCDIThread() 方法条用CDT层的Thread对象。

Thread实现了对命令下发等操作。

ICDIThread借口中包含了用户的一些操作指令

例如这里我们自定义的显示桢的信息。

 

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 自动生成的方法存根
      //
    }

 

CDT源代码框架分析改造 线程对象的改造(三)

标签:

原文地址:http://www.cnblogs.com/codeGirl-wangMin/p/4779036.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!