标签:
需求:当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 自动生成的方法存根 // }
标签:
原文地址:http://www.cnblogs.com/codeGirl-wangMin/p/4779036.html