Use Eclipse Conditional Breakpoint to Execute Arbitrary Code to Fix Real Problem

When debug the problem: Solr post failed with error Illegal character ((CTRL-CHAR, code 22))  - about the problem and solution, please see
Solr: XML Contains Invalid Control Characters

I have to find what XML data contains invalid characters, there are several ways, here I would like to introduce how to use Eclipse Conditional Breakpoint.

First, look at the stack trace:
SEVERE: [com.ctc.wstx.exc.WstxLazyException] com.ctc.wstx.exc.WstxUnexpectedCharException: Illegal character ((CTRL-CHAR, code 22))
 at [row,col {unknown-source}]: [1,128]
at com.ctc.wstx.exc.WstxLazyException.throwLazily(WstxLazyException.java:45)
at com.ctc.wstx.sr.BasicStreamReader.safeFinishToken(BasicStreamReader.java:3659)
org.apache.solr.handler.loader.XMLLoader.readDoc(XMLLoader.java:393)
First I enabled remote debug, then put a break point at below location, so Solr will pause when hit the exception.
protected void com.ctc.wstx.sr.BasicStreamReader.safeFinishToken()
{

 try {
  boolean deferErrors = (mCurrToken == CHARACTERS);
  finishToken(deferErrors);
 }
 catch (IOException ioe) 
 {
  throwLazyError(ioe); // Breakpoint here
 }
 catch (XMLStreamException strex)
 {
  throwLazyError(strex);
 }

}
Next I need figure outthe content of xml body, so I can show to tester and developers of other component. Because this is a post request, we can't see the content directly from streams of SolrQueryRequest instance.

We can't view content of HttpRequestContentStream , but we can view content of StringStream.
And I have an util that can clone SolrQueryRequest instance to a StringStream-based SolrQueryRequest. Please read how to Clone SolrQueryRequest 

Next where and how I can execute the code to clone clone SolrQueryRequest instance to a StringStream-based SolrQueryRequest?

Eclipse Conditional Breakpoint comes to rescue in this case.

In an Eclipse Conditional Breakpoint, we can execute arbitrary code as long as it return a boolean value at alst.

So I add a Conditional Breakpoint in the first line of method: org.apache.solr.handler.RequestHandlerBase.handleRequest(SolrQueryRequest req, SolrQueryResponse rsp)

The condition looks like below:
req = org.jefferyyuan.SolrUtil.cloneSolrRequest(req);
return false;
Eclipse will excute the statements in declaration of Conditional Breakpoint which will replace the original SolrQueryRequest instance to a StringStream-based SolrQueryRequest object.
"return false" tells Eclipse not to break.

So now when the application hits the exception, I can go to the stack at org.apache.solr.handler.RequestHandlerBase.handleRequest, and view and copy the xml data.

We have to use full qualified classname(org.jefferyyuan.SolrUtil) in Conditional Breakpoint statements, as in current context, the JVM doesn't know SolrUtil.

If we have not defined a util method like above yet, we can copy the following statements to the conditional breakpoint.
org.apache.solr.request.SolrQueryRequestBase newReq = new org.apache.solr.request.LocalSolrQueryRequest(req.getCore(),
 req.getParams());
Iterable<org.apache.solr.common.util.ContentStream> iterable = req.getContentStreams();
if (iterable != null) {
  Iterator<org.apache.solr.common.util.ContentStream> it = iterable.iterator();
  List<org.apache.solr.common.util.ContentStream> newStreams = 
 new ArrayList<org.apache.solr.common.util.ContentStream>();
  while (it.hasNext()) {
 org.apache.solr.common.util.ContentStream oldStream = it.next();
 if (oldStream instanceof org.apache.solr.common.util.ContentStreamBase.StringStream) {
   newStreams.add(oldStream);
 } else {
   java.io.InputStream is = oldStream.getStream();
   String streamContent = org.apache.commons.io.IOUtils.toString(is);
   org.apache.solr.common.util.ContentStreamBase.StringStream sStr = 
  new org.apache.solr.common.util.ContentStreamBase.StringStream(streamContent);
   sStr.setContentType(oldStream.getContentType());
   sStr.setName(oldStream.getName());
   sStr.setSize(oldStream.getSize());
   sStr.setSourceInfo(oldStream.getSourceInfo());
   newStreams.add(sStr);
 }
  }
  newReq.setContentStreams(newStreams);
}
req = newReq;
return false;

Resource
Solr: Clone Solr Request
Solr: XML Contains Invalid Control Characters
Post a Comment

Labels

Java (159) Lucene-Solr (110) All (58) Interview (58) J2SE (53) Algorithm (41) Soft Skills (36) Eclipse (34) Code Example (31) Linux (25) JavaScript (23) Spring (22) Windows (22) Web Development (20) Nutch2 (18) Tools (18) Bugs (17) Debug (15) Defects (14) Text Mining (14) J2EE (13) Network (13) PowerShell (11) Chrome (9) Design (9) How to (9) Learning code (9) Performance (9) UIMA (9) html (9) Continuous Integration (8) Dynamic Languages (8) Http Client (8) Maven (8) Security (8) Trouble Shooting (8) bat (8) blogger (8) Big Data (7) Google (7) Guava (7) JSON (7) Problem Solving (7) ANT (6) Coding Skills (6) Database (6) Scala (6) Shell (6) css (6) Algorithm Series (5) Cache (5) IDE (5) Lesson Learned (5) Programmer Skills (5) System Design (5) Tips (5) adsense (5) xml (5) AIX (4) Code Quality (4) GAE (4) Git (4) Good Programming Practices (4) Jackson (4) Memory Usage (4) Miscs (4) OpenNLP (4) Project Managment (4) Python (4) Spark (4) Testing (4) ads (4) regular-expression (4) Android (3) Apache Spark (3) Become a Better You (3) Concurrency (3) Eclipse RCP (3) English (3) Happy Hacking (3) IBM (3) J2SE Knowledge Series (3) JAX-RS (3) Jetty (3) Restful Web Service (3) Script (3) regex (3) seo (3) .Net (2) Android Studio (2) Apache (2) Apache Procrun (2) Architecture (2) Batch (2) Bit Operation (2) Build (2) Building Scalable Web Sites (2) C# (2) C/C++ (2) CSV (2) Career (2) Cassandra (2) Distributed (2) Fiddler (2) Firefox (2) Google Drive (2) Gson (2) Html Parser (2) Http (2) Image Tools (2) JQuery (2) Jersey (2) LDAP (2) Life (2) Logging (2) Software Issues (2) Storage (2) Text Search (2) xml parser (2) AOP (1) Application Design (1) AspectJ (1) Chrome DevTools (1) Cloud (1) Codility (1) Data Mining (1) Data Structure (1) ExceptionUtils (1) Exif (1) Feature Request (1) FindBugs (1) Greasemonkey (1) HTML5 (1) Httpd (1) I18N (1) IBM Java Thread Dump Analyzer (1) JDK Source Code (1) JDK8 (1) JMX (1) Lazy Developer (1) Mac (1) Machine Learning (1) Mobile (1) My Plan for 2010 (1) Netbeans (1) Notes (1) Operating System (1) Perl (1) Problems (1) Product Architecture (1) Programming Life (1) Quality (1) Redhat (1) Redis (1) Review (1) RxJava (1) Solutions logs (1) Team Management (1) Thread Dump Analyzer (1) Troubleshooting (1) Visualization (1) boilerpipe (1) htm (1) ongoing (1) procrun (1) rss (1)

Popular Posts