需求:當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 自動生成的方法存根 // }