{"id":288,"date":"2010-06-27T15:20:00","date_gmt":"2010-06-27T15:20:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/debugging-a-production-server-eclipse-and-jboss-showcase.html"},"modified":"2012-10-21T19:14:38","modified_gmt":"2012-10-21T19:14:38","slug":"debug-production-server-eclipse","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html","title":{"rendered":"Debugging a Production Server &#8211; Eclipse and JBoss showcase"},"content":{"rendered":"<p>Do you write code that has bugs? No, of course not. For the rest of us, mere mortals, who do write code with bugs, I would like to address a very sensitive issue: debugging an application that runs on a production server.<\/p>\n<p>So, your application is ready for deployment. <a href=\"http:\/\/en.wikipedia.org\/wiki\/Unit_tests\">Unit tests<\/a> were all successful, <a href=\"http:\/\/en.wikipedia.org\/wiki\/Software_testing\">testers<\/a> found some minor bugs that were immediately fixed, the <a href=\"http:\/\/en.wikipedia.org\/wiki\/Integration_testing\">integration tests<\/a> with the other department&#8217;s modules went pretty smoothly, the <a href=\"http:\/\/en.wikipedia.org\/wiki\/Quality_assurance\">QA department<\/a> made no complaints and the <a href=\"http:\/\/en.wikipedia.org\/wiki\/Acceptance_test#User_acceptance_testing\">UATs<\/a>  were passed with flying colors. Thus, your awesome code is now up and running on the production server.<\/p>\n<p>When the unthinkable happens. Your client notices some buggy behavior on the application and some of his customers have already started complaining. It seems that some nasty little bug has managed to get through all the testing procedures and make it to the live system. The client&#8217;s users pressure the client, the client managers pressure your managers and, guess what, your managers start pressuring you.<\/p>\n<p>You start up the test server and try to <a href=\"http:\/\/software-testing-zone.blogspot.com\/2007\/05\/my-top-5-ways-to-reproduce-hard-to.html\">reproduce the bug<\/a>. Alas, everything runs correctly on the test server, so it might be a strange configuration issue or an edge case that causes the problematic behavior. The bottom line is that you cannot track the bug down using your testbed.<\/p>\n<p>What a poor developer should do? Debug the application that runs on the production server. Note that this should be considered as a last resort and when all other attempts to spot the bug have failed. Be sure that the slightest wrong move while on production server (which serves a large number of users) could massively affect the application and cause even bigger problems or a complete service outage.<\/p>\n<p>So, if you decide to take the risky road, read along on how to do it. Some basic guidelines before you get started. First of all, let your client know that you will connect to the production system and \u201cperform some checks\u201d. You don&#8217;t have to be specific on what will be done, but certainly don&#8217;t do anything without informing the client. Second, pick the time where real traffic is as low as possible. This is a no-brainer, you want as little as possible users to be affected, plus you don&#8217;t want to have the server running on heavy load. Third, be careful and try not to be hasty. There might be pressure, but take your time, it will be easier to track down the problem.<\/p>\n<p>I will use <a href=\"http:\/\/www.jboss.org\/jbossas\/\">JBoss AS<\/a> and Eclipse in order to provide a hands-on example on how to perform the debugging. We will simulate a running application by deploying a simple piece of code on JBoss and executing a specific method. In most Java based application servers it is just a matter of configuration to start up the JVM with remote debugging enabled. Then, you use your favorite IDE, in my case Eclipse, to attach a debugger on the server&#8217;s port and start debugging. Note that enabling the remote debugging brings a small performance penalty, but I usually prefer to have the debugging option enabled so that I can connect to the server at will. In a different case, a JVM restart, thus a server restart, would be required in order to apply the new settings.<\/p>\n<p>First, let&#8217;s create the code that will perform the debugging on. We will use a <a href=\"http:\/\/java.sun.com\/j2se\/1.5.0\/docs\/guide\/management\/overview.html\">Java MBean<\/a> which gets deployed on JBoss and has a predefined lifecycle. MBeans are managed beans, Java objects that represent resources to be managed. JBoss actually provides an implementation of an <a href=\"http:\/\/java.sun.com\/j2se\/1.5.0\/docs\/guide\/management\/mxbeans.html#mbean_server\">MBean Server<\/a>, thus MBeans can be deployed on it.<\/p>\n<p>The simplest way is to extend the <a href=\"http:\/\/docs.jboss.org\/jbossas\/javadoc\/4.0.4\/system\/org\/jboss\/system\/ServiceMBeanSupport.html\">ServiceMBeanSupport<\/a> abstract class and implement a service that conforms to the <a href=\"http:\/\/docs.jboss.org\/jbossas\/javadoc\/4.0.4\/system\/org\/jboss\/system\/ServiceMBean.html\">ServiceMBean<\/a> interface. First we create an Eclipse project named \u201cSimpleMBeanProject\u201d. Then we create an interface that our service will have to implement. The source code is:<\/p>\n<pre class=\"brush:java\">package com.javacodegeeks.jboss;\r\n\r\nimport org.jboss.system.ServiceMBean;\r\n\r\npublic interface SimpleServiceMBean extends ServiceMBean {\r\n\r\n    void start() throws Exception;\r\n\r\n    void stop();\r\n    \r\n    String getName();\r\n    \r\n    void execute(String input);\r\n\r\n}\r\n<\/pre>\n<p>Then we create the appropriate implementation class:<\/p>\n<pre class=\"brush:java\">package com.javacodegeeks.jboss;\r\n\r\nimport org.jboss.system.ServiceMBeanSupport;\r\n\r\npublic class SimpleService extends ServiceMBeanSupport implements SimpleServiceMBean {    \r\n    \r\n    @Override\r\n    public void start() throws Exception {\r\n        System.out.println(\"Starting SimpleService MBean\");\r\n    }\r\n    \r\n    @Override\r\n    public void stop() {\r\n        System.out.println(\"Stopping SimpleService MBean\");\r\n    }\r\n    \r\n    @Override\r\n    public String getName() {\r\n        return SimpleService.class.getCanonicalName();\r\n    }\r\n    \r\n    public void execute(String input) {\r\n        System.out.println(\"Executing with input \" + input);\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>The code is really simplistic but with enough functionality for our demonstration purposes. The \u201cexecute\u201d method is the one that will be invoked in order to emulate a running application.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>A way to deploy the MBean is via bundling the two classes into a <a href=\"http:\/\/www.javabeat.net\/tips\/117-sar-service-archive-file-in-jboss.html\">Service Archive (SAR)<\/a> file. This file is a zipped file that includes the MBean classes and the corresponding deployment descriptor, which in this case is a file named \u201cjboss-service.xml\u201d with the following contents:<\/p>\n<pre class=\"brush:xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n\r\n&lt;service&gt;\r\n\r\n  &lt;mbean code=\"com.javacodegeeks.jboss.SimpleService\"\r\n     name=\"javacodegeeks:name=SimpleService\"&gt;\r\n  &lt;\/mbean&gt;\r\n\r\n&lt;\/service&gt;\r\n<\/pre>\n<p>The \u201cjboss-service.xml\u201d file must reside inside a folder named \u201cMETA-INF\u201d inside the SAR bundle. Then the archive has to be placed inside the &lt;jboss-base-dir&gt;\/server\/default\/deploy directory in order to deploy the MBean. The archive can be created by hand, it is just a zipped file after all, but a more elegant way is to create an <a href=\"http:\/\/www.javabeat.net\/tips\/103-writing-simple-ant-build-script.html\">ANT script<\/a> that will automate the procedure.<\/p>\n<pre class=\"brush:xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n\r\n&lt;project name=\"SimpleService Project Build\" default=\"build-sar\"&gt;\r\n\r\n    &lt;target name=\"init\"&gt;\r\n        &lt;property name=\"base.dir\" value=\".\"\/&gt;\r\n        &lt;property name=\"lib.dir\" value=\"${base.dir}\/lib\"\/&gt;\r\n        &lt;property name=\"bin.dir\" value=\"${base.dir}\/bin\"\/&gt;\r\n        &lt;property name=\"src.dir\" value=\"${base.dir}\/src\" \/&gt;\r\n        &lt;property name=\"dist.dir\" value=\"${base.dir}\/dist\" \/&gt;\r\n        &lt;delete dir=\"${dist.dir}\"\/&gt;\r\n        &lt;mkdir dir=\"${dist.dir}\"\/&gt;\r\n    &lt;\/target&gt;\r\n\r\n    &lt;target name=\"compile\" depends=\"init\"&gt;\r\n        &lt;echo message=\"Compiling source files...\" \/&gt;\r\n        &lt;javac destdir=\"${bin.dir}\" debug=\"on\"&gt;\r\n            &lt;src path=\"${src.dir}\" \/&gt;\r\n            &lt;classpath&gt;\r\n                &lt;fileset dir=\"${lib.dir}\"&gt;\r\n                    &lt;include name=\"**\/*.jar\" \/&gt;\r\n                &lt;\/fileset&gt;\r\n            &lt;\/classpath&gt;\r\n            &lt;include name=\"**\/*.java\" \/&gt;\r\n        &lt;\/javac&gt;\r\n    &lt;\/target&gt;\r\n\r\n    &lt;target name=\"build-sar\" depends=\"compile\"&gt;\r\n        &lt;jar destfile=\"dist\/SimpleService.sar\"&gt;\r\n            &lt;zipfileset dir=\"bin\"&gt;\r\n                &lt;include name=\"com\/javacodegeeks\/**\/*.class\" \/&gt;\r\n            &lt;\/zipfileset&gt;\r\n            &lt;zipfileset dir=\"resources\" prefix=\"META-INF\"&gt;\r\n                &lt;include name=\"jboss-service.xml\" \/&gt;\r\n            &lt;\/zipfileset&gt;\r\n        &lt;\/jar&gt;\r\n    &lt;\/target&gt;\r\n\r\n&lt;\/project&gt;\r\n<\/pre>\n<p>When the SAR gets deployed, the \u201cSimpleService\u201d MBean will appear at the server&#8217;s JMX Console. This is a web interface that can be accessed at the following URL (replace the host accordingly):<\/p>\n<p>http:\/\/host:8080\/jmx-console<\/p>\n<p>Scroll down until you find the \u201cname=SimpleService\u201d entry and follow the link. The Mbean&#8217;s attributes, along with a list of operations, will appear there.<\/p>\n<p><a href=\"http:\/\/3.bp.blogspot.com\/_piNjpdpJZXA\/TBku_u3RdKI\/AAAAAAAAAEE\/d1uObpRy7IA\/s1600\/00-jmx-view.png\"><img decoding=\"async\" alt=\"\" border=\"0\" src=\"http:\/\/3.bp.blogspot.com\/_piNjpdpJZXA\/TBku_u3RdKI\/AAAAAAAAAEE\/d1uObpRy7IA\/s320\/00-jmx-view.png\" style=\"cursor: pointer;height: 198px;margin: 0px auto 10px;text-align: center;width: 320px\" \/><\/a><\/p>\n<p>You can manually invoke the \u201cexecute\u201d method with a String argument and the corresponding input will be written to standard output.<\/p>\n<p>Ok, after deploying the SAR, it is time to start the debugging. The first step is to have JBoss&#8217;s JVM start with remote socket debugging enabled. This is done via JVM&#8217;s arguments of course and in order to configure it, you have to do the following:<\/p>\n<p><span style=\"font-style: italic\">Linux platform:<\/span> Open file \/bin\/run.conf and uncomment the line (remove the \u201c#\u201d) that reads<br \/>\nJAVA_OPTS=&#8221;$JAVA_OPTS -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n&#8221;<br \/>\n<span style=\"font-style: italic\"><br \/>\nWindows platform:<\/span> Open file \/bin\/run.bat and uncomment the line (remove the \u201crem\u201d keyword)<br \/>\nset JAVA_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n %JAVA_OPTS%<\/p>\n<p>The port that will be used is 8787. Make sure that \u201csuspend\u201d parameter is set to \u201cn\u201d (disabled) or, in a different case, when the server starts for the first time it will halt and wait for a remote debugger to be attached before proceeding.<\/p>\n<p>After that, start the server normally. It is now time to connect to the server via Eclipse. Go to \u201cRun ? Debug Configurations&#8230;\u201d and then double-click on the \u201cRemote Java Application\u201d option. At the \u201cConnect\u201d tab make sure that the \u201cSimpleMBeanProject\u201d is selected, provide the remote \u201cHost\u201d IP address or hostname (\u201clocalhost\u201d in my case) and the \u201cPort\u201d that the server listens at for incoming debugging sessions (8787 as configured previously). Finally, make sure that the \u201cAllow termination of remote VM\u201d is NOT selected, because if it is, the server&#8217;s JVM will shutdown the moment you disconnect the debugging. Not really a nice thing to happen to a production server. Ok, hit the \u201cDebug\u201d button to proceed.<\/p>\n<p><a href=\"http:\/\/4.bp.blogspot.com\/_piNjpdpJZXA\/TBkvvVUP_fI\/AAAAAAAAAEM\/J0fYp-9OuSo\/s1600\/01-setup-remote-debug.png\"><img decoding=\"async\" alt=\"\" border=\"0\" src=\"http:\/\/4.bp.blogspot.com\/_piNjpdpJZXA\/TBkvvVUP_fI\/AAAAAAAAAEM\/J0fYp-9OuSo\/s320\/01-setup-remote-debug.png\" style=\"cursor: pointer;height: 176px;margin: 0px auto 10px;text-align: center;width: 320px\" \/><\/a><\/p>\n<p>If the remote debugging is not enabled or if there is a connection problem (perhaps a firewall issue) you will see the following image:<\/p>\n<p><a href=\"http:\/\/1.bp.blogspot.com\/_piNjpdpJZXA\/TBkv3DMZ6uI\/AAAAAAAAAEU\/t3dkleivQMs\/s1600\/02-debug-attach-failed.png\"><img decoding=\"async\" alt=\"\" border=\"0\" src=\"http:\/\/1.bp.blogspot.com\/_piNjpdpJZXA\/TBkv3DMZ6uI\/AAAAAAAAAEU\/t3dkleivQMs\/s320\/02-debug-attach-failed.png\" style=\"cursor: pointer;height: 256px;margin: 0px auto 10px;text-align: center;width: 320px\" \/><\/a><\/p>\n<p>But if everything works correctly, the Eclipse debugger will attach itself to the server and you should be able to see something like this:<\/p>\n<p><a href=\"http:\/\/2.bp.blogspot.com\/_piNjpdpJZXA\/TBkwAlukMgI\/AAAAAAAAAEc\/M26tzbkQ5Ps\/s1600\/03-debug-established.png\"><img decoding=\"async\" alt=\"\" border=\"0\" src=\"http:\/\/2.bp.blogspot.com\/_piNjpdpJZXA\/TBkwAlukMgI\/AAAAAAAAAEc\/M26tzbkQ5Ps\/s320\/03-debug-established.png\" style=\"cursor: pointer;height: 153px;margin: 0px auto 10px;text-align: center;width: 320px\" \/><\/a><\/p>\n<p>As you can see, the monitored threads appear in the \u201cDebug\u201d view. If that view does not appear, go to \u201cWindow ? Show View ? Other&#8230;\u201d and search it under the \u201cDebug\u201d category.<\/p>\n<p>Now let&#8217;s assume that the \u201cexecute\u201d method of the \u201cSimpleService\u201d class simulates the code that gets executed on the production server with every incoming request. If you were performing debugging on a test server all you had to do is add a breakpoint inside the method, trigger a request and proceed with the debugging. However something like that will definitely not work on a production server. The moment you toggle a breakpoint, all requests will suspend and wait for your action (if the execution path passes from that method of course). That will stop the requests execution and most probably will get noticed by the users. Furthermore, you will be overwhelmed by the magnitude of the requests that you will have to monitor at the same time.<\/p>\n<p>What you have to do is add a conditional breakpoint that will only halt when specific input is provided, i.e. the one that you provide. So, disconnect from the remote server and then add a breakpoint inside the \u201cexecute\u201d method (at line 23). Then, right click on the breakpoint and from the menu that appears, choose \u201cBreakpoint Properties\u201d (the last one).<\/p>\n<p><a href=\"http:\/\/4.bp.blogspot.com\/_piNjpdpJZXA\/TBkwSMkEwfI\/AAAAAAAAAEk\/dinQguR7NOY\/s1600\/04-breakpoint-menu.png\"><img decoding=\"async\" alt=\"\" border=\"0\" src=\"http:\/\/4.bp.blogspot.com\/_piNjpdpJZXA\/TBkwSMkEwfI\/AAAAAAAAAEk\/dinQguR7NOY\/s320\/04-breakpoint-menu.png\" style=\"cursor: pointer;height: 268px;margin: 0px auto 10px;text-align: center;width: 281px\" \/><\/a><\/p>\n<p>The properties menu will come up. Check the \u201cEnable Condition\u201d checkbox and inside the textarea, write a condition. The breakpoint will be valid and suspend the execution only when that condition is true. Note that you actually write Java code inside the textarea and that you can use the familiar code assistance for that (using Ctrl+Space). Isn&#8217;t Eclipse an incredible tool? We want the breakpoint to kick in only when the method&#8217;s argument is \u201cmyinput\u201d.<\/p>\n<p><a href=\"http:\/\/3.bp.blogspot.com\/_piNjpdpJZXA\/TBkwcNCXafI\/AAAAAAAAAEs\/Dxfhv6pphNs\/s1600\/05-breakpoint-properties.png\"><img decoding=\"async\" alt=\"\" border=\"0\" src=\"http:\/\/3.bp.blogspot.com\/_piNjpdpJZXA\/TBkwcNCXafI\/AAAAAAAAAEs\/Dxfhv6pphNs\/s320\/05-breakpoint-properties.png\" style=\"cursor: pointer;height: 290px;margin: 0px auto 10px;text-align: center;width: 320px\" \/><\/a><\/p>\n<p>Start the remote debugging again and now you are sure that the execution will be suspended when your very own input is provided. To demonstrate this return to the JMX console and the \u201cSimpleService\u201d MBean view. At the \u201cexecute\u201d method, use a random argument:<\/p>\n<p><a href=\"http:\/\/2.bp.blogspot.com\/_piNjpdpJZXA\/TBkwoOFqSEI\/AAAAAAAAAE0\/3sXG4Pz6B1M\/s1600\/06-execute-testinput.png\"><img decoding=\"async\" alt=\"\" border=\"0\" src=\"http:\/\/2.bp.blogspot.com\/_piNjpdpJZXA\/TBkwoOFqSEI\/AAAAAAAAAE0\/3sXG4Pz6B1M\/s320\/06-execute-testinput.png\" style=\"cursor: pointer;height: 95px;margin: 0px auto 10px;text-align: center;width: 320px\" \/><\/a><\/p>\n<p>Hit the \u201cInvoke\u201d button and notice that the execution is not suspended by Eclipse. Now, use \u201cmyinput\u201d as the input value, hit \u201cInvoke\u201d and notice that Eclipse captures the execution.<\/p>\n<p><a href=\"http:\/\/2.bp.blogspot.com\/_piNjpdpJZXA\/TBkwxin4kgI\/AAAAAAAAAE8\/doYQon8c-tg\/s1600\/07-breakpoint-suspended.png\"><img decoding=\"async\" alt=\"\" border=\"0\" src=\"http:\/\/2.bp.blogspot.com\/_piNjpdpJZXA\/TBkwxin4kgI\/AAAAAAAAAE8\/doYQon8c-tg\/s320\/07-breakpoint-suspended.png\" style=\"cursor: pointer;height: 127px;margin: 0px auto 10px;text-align: center;width: 320px\" \/><\/a><\/p>\n<p>Now you are ready to proceed with the well known debugging options (step into methods, watch variable values etc.) without worrying that the system&#8217;s users will be affected.<\/p>\n<p>You can download the Eclipse project <a href=\"http:\/\/dl.dropbox.com\/u\/7215751\/JavaCodeGeeks\/DebuggingProductionServerArticle\/SimpleMBeanProject.zip\">here<\/a>.<\/p>\n<p>Happy bug hunting!<\/p>\n<div style=\"margin-bottom: 0px;margin-left: 0px;margin-right: 0px;margin-top: 0px\"><strong><i>Related Articles :<\/i><\/strong><\/div>\n<ul>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/05\/jboss-42x-spring-3-jpa-hibernate.html\">JBoss 4.2.x Spring 3 JPA Hibernate Tutorial<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/09\/gwt-ejb3-maven-jboss-51-integration.html\">GWT EJB3 Maven JBoss 5.1 integration tutorial<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/10\/hello-world-portlet-jboss-portal.html\">&#8216;Hello World&#8217; portlet on JBoss Portal<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Do you write code that has bugs? No, of course not. For the rest of us, mere mortals, who do write code with bugs, I would like to address a very sensitive issue: debugging an application that runs on a production server. So, your application is ready for deployment. Unit tests were all successful, testers &hellip;<\/p>\n","protected":false},"author":3,"featured_media":110,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[53,29,48],"class_list":["post-288","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-core-java","tag-debugging","tag-eclipse","tag-jboss"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Debugging a Production Server - Eclipse and JBoss showcase - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Do you write code that has bugs? No, of course not. For the rest of us, mere mortals, who do write code with bugs, I would like to address a very\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Debugging a Production Server - Eclipse and JBoss showcase - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Do you write code that has bugs? No, of course not. For the rest of us, mere mortals, who do write code with bugs, I would like to address a very\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2010-06-27T15:20:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-21T19:14:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/eclipse-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ilias Tsagklis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ilias Tsagklis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/06\\\/debug-production-server-eclipse.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/06\\\/debug-production-server-eclipse.html\"},\"author\":{\"name\":\"Ilias Tsagklis\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/9a83496b285d30c61e8a674625c1350e\"},\"headline\":\"Debugging a Production Server &#8211; Eclipse and JBoss showcase\",\"datePublished\":\"2010-06-27T15:20:00+00:00\",\"dateModified\":\"2012-10-21T19:14:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/06\\\/debug-production-server-eclipse.html\"},\"wordCount\":1643,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/06\\\/debug-production-server-eclipse.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/eclipse-logo.jpg\",\"keywords\":[\"Debugging\",\"Eclipse\",\"JBoss\"],\"articleSection\":[\"Core Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/06\\\/debug-production-server-eclipse.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/06\\\/debug-production-server-eclipse.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/06\\\/debug-production-server-eclipse.html\",\"name\":\"Debugging a Production Server - Eclipse and JBoss showcase - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/06\\\/debug-production-server-eclipse.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/06\\\/debug-production-server-eclipse.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/eclipse-logo.jpg\",\"datePublished\":\"2010-06-27T15:20:00+00:00\",\"dateModified\":\"2012-10-21T19:14:38+00:00\",\"description\":\"Do you write code that has bugs? No, of course not. For the rest of us, mere mortals, who do write code with bugs, I would like to address a very\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/06\\\/debug-production-server-eclipse.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/06\\\/debug-production-server-eclipse.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/06\\\/debug-production-server-eclipse.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/eclipse-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/eclipse-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2010\\\/06\\\/debug-production-server-eclipse.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Core Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/core-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Debugging a Production Server &#8211; Eclipse and JBoss showcase\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/9a83496b285d30c61e8a674625c1350e\",\"name\":\"Ilias Tsagklis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g\",\"caption\":\"Ilias Tsagklis\"},\"description\":\"Ilias is a software developer turned online entrepreneur. He is co-founder and Executive Editor at Java Code Geeks.\",\"sameAs\":[\"http:\\\/\\\/www.iliastsagklis.com\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/iliastsagklis\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/ilias-tsagklis\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Debugging a Production Server - Eclipse and JBoss showcase - Java Code Geeks","description":"Do you write code that has bugs? No, of course not. For the rest of us, mere mortals, who do write code with bugs, I would like to address a very","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html","og_locale":"en_US","og_type":"article","og_title":"Debugging a Production Server - Eclipse and JBoss showcase - Java Code Geeks","og_description":"Do you write code that has bugs? No, of course not. For the rest of us, mere mortals, who do write code with bugs, I would like to address a very","og_url":"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2010-06-27T15:20:00+00:00","article_modified_time":"2012-10-21T19:14:38+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/eclipse-logo.jpg","type":"image\/jpeg"}],"author":"Ilias Tsagklis","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Ilias Tsagklis","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html"},"author":{"name":"Ilias Tsagklis","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/9a83496b285d30c61e8a674625c1350e"},"headline":"Debugging a Production Server &#8211; Eclipse and JBoss showcase","datePublished":"2010-06-27T15:20:00+00:00","dateModified":"2012-10-21T19:14:38+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html"},"wordCount":1643,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/eclipse-logo.jpg","keywords":["Debugging","Eclipse","JBoss"],"articleSection":["Core Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html","url":"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html","name":"Debugging a Production Server - Eclipse and JBoss showcase - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/eclipse-logo.jpg","datePublished":"2010-06-27T15:20:00+00:00","dateModified":"2012-10-21T19:14:38+00:00","description":"Do you write code that has bugs? No, of course not. For the rest of us, mere mortals, who do write code with bugs, I would like to address a very","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/eclipse-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/eclipse-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2010\/06\/debug-production-server-eclipse.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Core Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/core-java"},{"@type":"ListItem","position":4,"name":"Debugging a Production Server &#8211; Eclipse and JBoss showcase"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/9a83496b285d30c61e8a674625c1350e","name":"Ilias Tsagklis","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g","caption":"Ilias Tsagklis"},"description":"Ilias is a software developer turned online entrepreneur. He is co-founder and Executive Editor at Java Code Geeks.","sameAs":["http:\/\/www.iliastsagklis.com\/","https:\/\/www.linkedin.com\/in\/iliastsagklis"],"url":"https:\/\/www.javacodegeeks.com\/author\/ilias-tsagklis"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/288","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=288"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/288\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/110"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=288"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}