銆銆鐜瑕佹眰: 鏈枃鐨勪唬鐮佹槸鍦?nbsp;Eclipse3.0.0錛孞DK1.4.2 鍜?nbsp;Tomcat5.0.5 涓婃祴璇曡繃鐨勩?br>
銆銆JAVA 璋冭瘯妗嗘灦錛圝PDA錛夌畝浠?/strong>
銆銆JPDA 鏄竴涓灞傜殑璋冭瘯妗嗘灦錛屽寘鎷?nbsp;JVMDI銆丣DWP銆丣DI 涓変釜灞傛銆侸AVA 铏氭嫙鏈烘彁渚涗簡 JPDA 鐨勫疄鐜般傚叾寮鍙戝伐鍏蜂綔涓鴻皟璇曞鎴風錛屽彲浠ユ柟渚跨殑涓庤櫄鎷熸満閫氳錛岃繘琛岃皟璇曘侲clipse 姝f槸鍒╃敤 JPDA 璋冭瘯 JAVA 搴旂敤錛屼簨瀹炰笂錛屾墍鏈?nbsp;JAVA 寮鍙戝伐鍏烽兘鏄繖鏍峰仛鐨勩係UN JDK 榪樺甫浜嗕竴涓瘮杈冪畝鍗曠殑璋冭瘯宸ュ叿浠ュ強紺轟緥銆?br>
- JVMDI 瀹氫箟浜嗚櫄鎷熸満闇瑕佸疄鐜扮殑鏈湴鎺ュ彛
- JDWP 瀹氫箟浜咼VM涓庤皟璇曞鎴風涔嬮棿鐨勯氳鍗忚
璋冭瘯瀹㈡埛绔拰JVM 鏃㈠彲浠ュ湪鍚屼竴鍙版満鍣ㄤ笂錛屼篃鍙互榪滅▼璋冭瘯銆侸DK 浼氬寘鍚竴涓粯璁ょ殑瀹炵幇 jdwp.dll錛孞VM 鍏佽鐏墊椿鐨勪嬌鐢ㄥ叾浠栧崗璁唬鏇?nbsp;JDWP銆係UN JDK 鏈変袱縐嶆柟寮忎紶杈撻氳鍗忚錛歋ocket 鍜屽叡浜唴瀛?鍚庤呬粎浠呴拡瀵?nbsp;Windows)錛屼竴鑸垜浠兘閲囩敤 Socket 鏂瑰紡銆?br>
浣犲彲浠ョ敤涓嬮潰鐨勫弬鏁幫紝浠ヨ皟璇曟ā寮忓惎鍔↗VM
-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -Xrunjdwp JVM 鍔犺澆 jdwp.dll transport=dt_socket 浣跨敤 Socket 浼犺緭 address 琛ㄧず璋冭瘯绔彛鍙?nbsp; server=y 琛ㄧず JVM 浣滀負鏈嶅姟鍣紝寤虹珛 Socket suspend=n 琛ㄧず鍚姩榪囩▼涓紝JVM 涓嶄細鎸傝搗鍘葷瓑寰呰皟璇曞鎴風榪炴帴
- JDI 鍒欐槸涓緇凧AVA鎺ュ彛
濡傛灉鏄竴涓?nbsp;JAVA 鐨勮皟璇曞鎴風錛屽彧瑕佸疄鐜?nbsp;JDI 鎺ュ彛錛屽埄鐢↗DWP鍗忚錛屼笌铏氭嫙鏈洪氳錛屽氨鍙互璋冪敤JVMDI浜嗐?br>
Components Debugger Interface / |-----------------------| / | VM | debuggee ----( |-----------------------| <------- JVMDI - Java VM Debug Interface \ | back-end | \ |-----------------------| / | comm channel -( | <--------------- JDWP - Java Debug Wire Protocol \ | |---------------------| | front-end | |---------------------| <------- JDI - Java Debug Interface | UI | |---------------------|
銆銆鍙傝錛?a >http://java.sun.com/j2se/1.4.2/docs/guide/jpda/architecture.html
銆銆Eclipse浣滀負涓涓熀浜?nbsp;JAVA 鐨勮皟璇曞鎴風錛屽埄鐢?nbsp;org.eclipse.jdt.debug Plugin 鎻愪緵浜咼DI 鐨勫叿浣撳疄鐜般侸DI 鎺ュ彛涓昏鍖呭惈涓嬮潰 4 涓寘
com.sun.jdi com.sun.jdi.connect com.sun.jdi.event com.sun.jdi.request銆銆鏈枃涓嶅 JDI 榪涜娣卞叆闃愯堪錛岃繖閲岄噸鐐逛粙緇?nbsp;JDI 涓笌鏂偣鐩稿叧鐨勬帴鍙c?br>
- com.sun.jdi
涓昏鏄疛VM(VirtualMachine) 綰跨▼(ThreadReference) 璋冪敤鏍?StackFrame) 浠ュ強綾誨瀷銆佸疄渚嬬殑鎻忚堪銆傚埄鐢ㄨ繖緇勬帴鍙o紝璋冭瘯瀹㈡埛绔彲浠ョ敤綾諱技綾誨弽灝勭殑鏂瑰紡錛屽緱鍒版墍鏈夌被鍨嬬殑瀹氫箟錛屽姩鎬佽皟鐢?nbsp;Class 鐨勬柟娉曘?nbsp; - com.sun.jdi.event
灝佽浜咼VM 浜х敓鐨勪簨浠訛紝 JVM 姝f槸灝嗚繖浜涗簨浠墮氱煡緇欒皟璇曞鎴風鐨勩備緥濡?nbsp;BreakpointEvent 灝辨槸 JVM 鎵ц鍒版柇鐐圭殑鏃跺欙紝鍙戝嚭鐨勪簨浠訛紱ClassPrepareEvent灝辨槸 Class 琚姞杞芥椂鍙戝嚭鐨勪簨浠躲?nbsp;
- com.sun.jdi.request
灝佽浜嗚皟璇曞鎴風鍙互鍚?nbsp;JVM鍙戣搗鐨勮姹傘備緥濡?nbsp;BreakpointRequest 鍚?nbsp;JVM 鍙戣搗涓涓坊鍔犳柇鐐圭殑璇鋒眰錛汣lassPrepareRequest 鍚?nbsp;JVM 娉ㄥ唽涓涓被鍔犺澆璇鋒眰錛孞VM 鍦ㄥ姞杞芥寚瀹?nbsp;Class 鐨勬椂鍊欙紝灝變細鍙戝嚭涓涓?nbsp;ClassPrepareEvent 浜嬩歡銆?nbsp;
銆銆JSR-45(Debugging Support for Other Languages)涓洪偅浜涢潪 JAVA 璇█鍐欐垚錛屽嵈闇瑕佺紪璇戞垚 JAVA 浠g爜錛岃繍琛屽湪 JVM 涓殑紼嬪簭錛屾彁渚涗簡涓涓繘琛岃皟璇曠殑鏍囧噯鏈哄埗銆備篃璁稿瓧闈㈢殑鎰忔濇湁鐐逛笉濂界悊瑙o紝浠涔堢畻鏄潪 JAVA 璇█鍛紵鍏跺疄 JSP 灝辨槸涓涓啀濂戒笉榪囩殑渚嬪瓙錛孞SR-45 鐨勬牱渚嬪氨鏄竴涓?nbsp;JSP銆?br>
銆銆JSP鐨勮皟璇曚竴鐩翠緷璧栦簬鍏蜂綋搴旂敤鏈嶅姟鍣ㄧ殑瀹炵幇錛屾病鏈変竴涓粺涓鐨勬ā寮忥紝JSR-45 閽堝榪欑鎯呭喌錛屾彁渚涗簡涓涓爣鍑嗙殑妯″紡銆傛垜浠煡閬擄紝JAVA 鐨勮皟璇曚腑錛屼富瑕佹牴鎹鍙蜂綔涓烘爣蹇楋紝榪涜瀹氫綅銆備絾鏄?nbsp;JSP 琚紪璇戜負 JAVA 浠g爜涔嬪悗錛孞AVA 琛屽彿涓?nbsp;JSP 琛屽彿鏃犳硶涓涓瀵瑰簲錛屾庢牱瑙e喅鍛紵
銆銆JSR-45 鏄繖鏍瘋瀹氱殑錛欽SP 琚紪璇戞垚 JAVA 浠g爜鏃訛紝鍚屾椂鐢熸垚涓浠?nbsp;JSP 鏂囦歡鍚嶅拰琛屽彿涓?nbsp;JAVA 琛屽彿涔嬮棿鐨勫搴旇〃(SMAP)銆侸VM 鍦ㄦ帴鍙楀埌璋冭瘯瀹㈡埛绔姹傚悗錛屽彲浠ユ牴鎹繖涓搴旇〃(SMAP)錛屼粠 JSP 鐨勮鍙瘋漿鎹㈠埌 JAVA 浠g爜鐨勮鍙鳳紱JVM 鍙戝嚭浜嬩歡閫氱煡鍓? 涔熸牴鎹搴旇〃(SMAP)榪涜杞寲錛岀洿鎺ュ皢 JSP 鐨勬枃浠跺悕鍜岃鍙烽氱煡璋冭瘯瀹㈡埛绔?br>
銆銆鎴戜滑鐢?nbsp;Tomcat 5.0 鍋氫釜嫻嬭瘯錛屾湁涓や釜 JSP錛孒ello.jsp 鍜?nbsp;greeting.jsp錛屽墠鑰?nbsp;include 鍚庤呫俆omcat浼氬皢浠栦滑緙栬瘧鎴?nbsp;JAVA 浠g爜(Hello_jsp.java)錛孞AVA Class(Hello_jsp.class) 浠ュ強 JSP 鏂囦歡鍚?琛屽彿鍜?nbsp;JAVA 琛屽彿涔嬮棿鐨勫搴旇〃(SMAP)銆?br>
銆銆Hello.jsp:
1 <HTML> 2 <HEAD> 3 <TITLE>Hello Example</TITLE> 4 </HEAD> 5 <BODY> 6 <%@ include file="greeting.jsp" %> 7 </BODY> 8 </HTML>
銆銆greeting.jsp:
1 Hello There!<P> 2 Goodbye on <%= new java.util.Date() %>
銆銆JSP 緙栬瘧鍚庝駭鐢熺殑Hello_jsp.java 濡備笅:
Hello_jsp.java: 1 package org.apache.jsp; 2 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 import javax.servlet.jsp.*; 6 7 public final class Hello_jsp extends org.apache.jasper.runtime.HttpJspBase 8 implements org.apache.jasper.runtime.JspSourceDependent { 9 10 private static java.util.Vector _jspx_dependants; 11 12 static { 13 _jspx_dependants = new java.util.Vector(1); 14 _jspx_dependants.add("/greeting.jsp"); 15 } 16 17 public java.util.List getDependants() { 18 return _jspx_dependants; 19 } 20 21 public void _jspService(HttpServletRequest request, HttpServletResponse response) 22 throws java.io.IOException, ServletException { 23 24 JspFactory _jspxFactory = null; 25 PageContext pageContext = null; 26 HttpSession session = null; 27 ServletContext application = null; 28 ServletConfig config = null; 29 JspWriter out = null; 30 Object page = this; 31 JspWriter _jspx_out = null; 32 33 34 try { 35 _jspxFactory = JspFactory.getDefaultFactory(); 36 response.setContentType("text/html"); 37 pageContext = _jspxFactory.getPageContext(this, request, response, 38 null, true, 8192, true); 39 application = pageContext.getServletContext(); 40 config = pageContext.getServletConfig(); 41 session = pageContext.getSession(); 42 out = pageContext.getOut(); 43 _jspx_out = out; 44 45 out.write("<HTML> \r\n"); 46 out.write("<HEAD> \r\n"); 47 out.write("<TITLE>Hello Example"); 48 out.write("</TITLE> \r\n"); 49 out.write("</HEAD> \r\n"); 50 out.write("<BODY> \r\n"); 51 out.write("Hello There!"); 52 out.write("<P> \r\nGoodbye on "); 53 out.write(String.valueOf( new java.util.Date() )); 54 out.write(" \r\n"); 55 out.write(" \r\n"); 56 out.write("</BODY> \r\n"); 57 out.write("</HTML> \r\n"); 58 } catch (Throwable t) { 59 if (!(t instanceof javax.servlet.jsp.SkipPageException)){ 60 out = _jspx_out; 61 if (out != null && out.getBufferSize() != 0) 62 out.clearBuffer(); 63 if (pageContext != null) pageContext.handlePageException(t); 64 } 65 } finally { 66 if (_jspxFactory != null) _jspxFactory.releasePageContext ( pageContext); 67 } 68 } 69 }
銆銆Tomcat 鍙堝皢榪欎釜 JAVA 浠g爜緙栬瘧涓?nbsp;Hello_jsp.class錛屼粬浠綅浜庯細 $Tomcat_install_path$\work\Standalone\localhost\_ 鐩綍涓嬨備絾鏄?nbsp;JSP 鏂囦歡鍚?琛屽彿鍜?nbsp;JAVA 琛屽彿鐨勫搴旇〃(浠ヤ笅綆縐癝MAP) 鍦ㄥ摢閲屽憿錛熺瓟妗堟槸錛屽畠淇濆瓨鍦?nbsp;Class 涓傚鏋滅敤 UltraEdit 鎵撳紑榪欎釜 Class 鏂囦歡錛屽氨鍙互鎵懼埌 SourceDebugExtension 灞炴э紝榪欎釜灞炴х敤鏉ヤ繚瀛?nbsp;SMAP銆?br>
銆銆JVM 瑙勮寖瀹氫箟浜?nbsp;ClassFile 涓彲浠ュ寘鍚?nbsp;SourceDebugExtension 灞炴э紝淇濆瓨 SMAP錛?br>
SourceDebugExtension_attribute { u2 attribute_name_index; u4 attribute_length; u1 debug_extension[attribute_length]; }
銆銆鎴戠敤 javassist 鍋氫簡涓涓祴璇?javassist鍙槸涓涓ソ涓滀笢錛屽畠鍙互鍔ㄦ佹敼鍙楥lass鐨勭粨鏋勶紝JBOSS 鐨?nbsp;AOP灝卞埄鐢ㄤ簡javassist錛岃繖閲屾垜浠彧浣跨敤瀹冭鍙朇lassFile鐨勫睘鎬?
public static void main(String[] args) throws Exception{ String[]files = { 銆銆銆"E:\\Tomcat5_0_5\\work\\Catalina\\localhost\\_\\org\\apache\\jsp\\Hello_jsp.class", }; 銆for(int k = 0; k < files.length; k++){ 銆 String file = files[k]; 銆 System.out.println("Class : " + file); 銆 ClassFile classFile = new ClassFile(new DataInputStream(new FileInputStream(file))); 銆 銆 AttributeInfo attributeInfo = classFile.getAttribute("SourceDebugExtension"); 銆 System.out.println("attribute name :" + attributeInfo.getName() + "]\n\n"); 銆 byte[]bytes = attributeInfo.get(); 銆 String str = new String(bytes); 銆 System.out.println(str); } }
銆銆榪欐浠g爜鏄劇ず浜哠ourceDebugExtension 灞炴э紝浣犲彲浠ョ湅鍒癝MAP 鐨勫唴瀹廣傜紪璇慗SP鍚庯紝SMAP 灝辮鍐欏叆 Class 涓? 浣犱篃鍙互鍒╃敤 javassist 淇敼 ClassFile 鐨勫睘鎬с?br>
銆銆涓嬮潰灝辨槸 Hello_jsp.class 涓繚瀛樼殑 SMAP 鍐呭:
SMAP E:\Tomcat5_0_5\work\Catalina\localhost\_\org\apache\jsp\Hello_jsp.java JSP *S JSP *F + 0 Hello.jsp /Hello.jsp + 1 greeting.jsp /greeting.jsp *L 1:45 2:46 3:47 3:48 4:49 5:50 1#1:51 1:52 2:53 7#0:56 8:57 *E
銆銆棣栧厛娉ㄦ槑JAVA浠g爜鐨勫悕縐幫細Hello_jsp.java錛岀劧鍚庢槸 stratum 鍚嶇О錛?nbsp;JSP銆傞殢鍚庢槸涓や釜JSP鏂囦歡鐨勫悕縐?nbsp;錛欻ello.jsp銆乬reeting.jsp銆備袱涓狫SP鏂囦歡鍏?0琛岋紝浜х敓鐨凥ello_jsp鍏?9琛屼唬鐮併傛渶鍚庝篃鏄渶閲嶈鐨勫唴瀹瑰氨鏄簮鏂囦歡鏂囦歡鍚?琛屽彿鍜岀洰鏍囨枃浠惰鍙風殑瀵瑰簲鍏崇郴(*L 涓?nbsp;*E涔嬮棿鐨勯儴鍒?
銆銆鍦ㄨ鑼冨畾涔変簡榪欐牱鐨勬牸寮忥細
銆銆婧愭枃浠惰鍙?nbsp;# 婧愭枃浠朵唬鍙?閲嶅嬈℃暟 : 鐩爣鏂囦歡寮濮嬭鍙?鐩爣鏂囦歡琛屽彿姣忔澧炲姞鐨勬暟閲?nbsp;
(InputStartLine # LineFileID , RepeatCount : OutputStartLine , OutputLineIncrement)
銆銆婧愭枃浠惰鍙?InputStartLine) 鐩爣鏂囦歡寮濮嬭鍙?OutputStartLine) 鏄繀欏葷殑銆備笅闈㈡槸瀵硅繖涓猄MAP鍏蜂綋鐨勮鏄庯細
1:45 2:46 3:47 3:48 4:49 5:50(娌℃湁婧愭枃浠朵唬鍙鳳紝榛樿涓篐ello.jsp) 銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆寮濮嬭鍙?nbsp;銆銆緇撴潫琛屽彿 Hello.jsp: 1 -> Hello_jsp.java: 45 2 -> 46 3 -> 47 48 4 -> 49 5 -> 50 1#1:51 1:52 2:53(1#1琛ㄧず greeting.jsp 鐨勭1琛? greeting.jsp: 1 -> Hello_jsp.java: 51 52 2 -> 53 7#0:56 8:57(7#0琛ㄧず Hello.jsp 鐨勭7琛? Hello.jsp: 7 -> Hello_jsp.java: 56 8 -> 57
銆銆Eclipse 鎻愪緵浜?nbsp;TextEditor錛屼綔涓烘枃鏈紪杈戝櫒鐨勭埗綾匯傜敱浜?nbsp;Editor 鐨勫紑鍙戜笉鏄湰鏂囩殑閲嶇偣錛屼笉鍋氬叿浣撹榪般傛垜浠彲浠ュ埄鐢?nbsp;Eclipse 鐨?nbsp;Plugin 欏圭洰鍚戝錛岀敓鎴愪竴涓畝鍗曠殑 JSP 緙栬緫鍣細
銆銆(1)鐐瑰嚮 File 鑿滃崟錛孨ew -> Project -> Plug-in Project 錛?br>
銆銆(2)杈撳叆欏圭洰鍚嶇О JSP_DEBUG錛屼笅涓姝ワ紱
銆銆(3)杈撳叆 plugin ID 錛?nbsp;com.jsp.debug
銆銆銆銆Plugin Class name 錛?nbsp;com.jsp.debug.JSP_DebugPlugin
銆銆(4)閫夋嫨鐢ㄦā鏉垮垱寤?br>
銆銆浣跨敤 Plug-in with editor錛岃緭鍏?br>
銆銆Java Package Name 錛歝om.jsp.editors
銆銆Editor Class Name 錛欽SPEditor
銆銆File extension 錛歫sp
銆銆涓涓?nbsp;jsp editor 灝變駭鐢熶簡銆?br>
銆銆榪愯榪欎釜Plugin錛屾柊寤轟竴涓狫AVA欏圭洰錛屾柊寤轟竴涓?nbsp;Hello.jsp 鍜?nbsp;greeting.jsp錛屽湪 Navigator 瑙嗗浘鍙屽嚮 jsp錛岃繖涓猠ditor灝辨墦寮浜嗐?br>
銆銆鍦↗SP緙栬緫鍣ㄤ腑璁劇疆鏂偣
銆銆鍦ㄧ紪杈戝櫒涓坊鍔犳柇鐐圭殑鎿嶄綔鏂瑰紡鏈変袱縐嶏紝涓縐嶆槸鍦ㄧ紪杈戝櫒宸︿晶鍨傜洿鏍囧昂涓婂弻鍑伙紝鍙︿竴縐嶆槸鍦ㄥ乏渚у瀭鐩存爣灝轟笂鐐瑰嚮榧犳爣鍙抽敭錛岄夋嫨鑿滃崟"娣誨姞/鍒犻櫎鏂偣"銆?br>
銆銆鍦?nbsp;Eclipse 鐨勫疄鐜頒腑錛屾坊鍔犳柇鐐瑰疄闄呬笂灝辨槸涓?nbsp;IFile 娣誨姞涓涓猰arker 錛岀被鍨嬫槸IBreakpoint.BREAKPOINT_MARKER錛岀劧鍚庡皢鏂偣娉ㄥ唽鍒?nbsp;BreakpointManager銆?br>
銆銆BreakpointManager 灝嗕駭鐢熶竴涓?nbsp;BreakpointRequest錛岄氱煡姝e湪榪愯鐨凧VM Target錛屽鏋滄鏃惰繕娌℃湁鍚姩 JVM錛屼細鍦?nbsp;JVM 鍚姩鐨勬椂鍊欙紝灝嗘墍鏈夋柇鐐逛竴璧烽氱煡 JVM Target銆?br>
銆銆娣誨姞鏂偣浣跨敤涓涓?nbsp;AbstractRulerActionDelegate錛岄噸杞?nbsp;createAction 鏂規(guī)硶錛岃繑鍥炰竴涓?nbsp;IAction ManageBreakpointRulerAction鍔ㄤ綔錛?br>
public class ManageBreakpointRulerActionDelegate extends AbstractRulerActionDelegate{ protected IAction createAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) { return new ManageBreakpointRulerAction(rulerInfo, editor); } }
銆銆涓轟簡灝?nbsp;ManageBreakpointRulerActionDelegate 娣誨姞鍒版枃鏈紪杈戝櫒宸︿晶鏍囧昂鐨勯紶鏍囧彸閿彍鍗曪紝騫朵笖鑳藉澶勭悊宸︿晶鏍囧昂鐨勯紶鏍囧弻鍑諱簨浠訛紝鍦?nbsp;plugin.xml 涓姞鍏ュ畾涔夈?br>
銆銆澶勭悊鍙屽嚮浜嬩歡錛?br>
<extension point="org.eclipse.ui.editorActions"> 銆<editorContribution targetID="com.jiaoly.editors.JSPEditor" id="com.jiaoly.debug.ManageBreakpointRulerActionDelegate"> 銆銆銆<action label="娣誨姞/鍒犻櫎鏂偣" class="com.jiaoly.debug.ManageBreakpointRulerActionDelegate" actionID="RulerDoubleClick" id="com.jiaoly.debug.ManageBreakpointRulerActionDelegate"> 銆銆銆</action> 銆</editorContribution> </extension>
銆銆娣誨姞鍙抽敭鑿滃崟錛?br>
<extension point="org.eclipse.ui.popupMenus"> <viewerContribution targetID="#TextRulerContext" id="com.jiaoly.debug.ManageBreakpointRulerActionDelegate"> <action label="娣誨姞/鍒犻櫎鏂偣" class="com.jiaoly.debug.ManageBreakpointRulerActionDelegate" menubarPath="addition" id="com.jiaoly.debug.ManageBreakpointRulerActionDelegate"> </action> </viewerContribution> </extension>
銆銆ManageBreakpointRulerAction 鏄疄闄呮坊鍔犳柇鐐圭殑Action錛屽疄鐜頒簡 IUpdate 鎺ュ彛錛岃繖涓狝ction鐨勫伐浣滐紝灝辨槸鍒ゆ柇褰撳墠閫変腑琛屾槸鍚﹀瓨鍦ㄦ柇鐐圭被鍨嬬殑 Marker錛屽鏋滀笉瀛樺湪鍒涘緩涓涓紝濡傛灉瀛樺湪錛屽皢瀹冨垹闄ゃ?br>
public class ManageBreakpointRulerAction extends Action implements IUpdate{ private IVerticalRulerInfo rulerInfo; private ITextEditor textEditor; private String BPmarkerType ; //褰撶偣Marker鐨勭被鍨?nbsp; private List allMarkers; //褰撳墠榧犳爣鐐瑰嚮琛屾墍鏈夌殑Marker private String addBP; //Action 鐨勬樉紺哄悕縐?nbsp; public ManageBreakpointRulerAction(IVerticalRulerInfo ruler, ITextEditor editor){ this.rulerInfo = ruler; this.textEditor = editor; BPmarkerType = IBreakpoint.BREAKPOINT_MARKER; addBP = "娣誨姞/鍒犻櫎鏂偣"; //$NON-NLS-1$ setText(this.addBP); } public void update() { this.allMarkers = this.fetchBPMarkerList(); } public void run(){ if(this.allMarkers.isEmpty()) this.addMarker(); else this.removeMarkers(this.allMarkers); } }