You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@drill.apache.org by "Paul Rogers (JIRA)" <ji...@apache.org> on 2016/11/20 03:11:58 UTC

[jira] [Comment Edited] (DRILL-5052) Option to debug generated Java code using an IDE

    [ https://issues.apache.org/jira/browse/DRILL-5052?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15680323#comment-15680323 ] 

Paul Rogers edited comment on DRILL-5052 at 11/20/16 3:11 AM:
--------------------------------------------------------------

To use the feature, do the following:

* Set the config option {{drill.exec.compile.save_source}} to {{true}}.
 * Set the config option {{drill.exec.compile.code_dir}} to the location where you want to save the generated source code.
 * Where you generate code (using a {{CodeGenerator}}), set the "plain-old Java" options:

{code}
  CodeGenerator&lt;Foo> cg = ...
  cg.plainOldJavaCapable(true); // Class supports plain-old Java
  cg.preferPlainOldJava(true); // Actually generate plain-old Java
{code}

 * In your favorite IDE, add to the code lookup path the code directory saved earlier. In Eclipse, for example, you do this in the debug configuration you will use to debug Drill.
 * Set a breakpoint in template used for the generated code.
 * Run Drill. The IDE will stop at your breakpoint.
 * Step into the generated code. Examine class field and local variables.
* Have fun!

Note: not all generated code is ready to be compiled as plain-old Java. Some classes omit from the template the proper {{throws}} declarations. Other minor problems may also crop up. All are easy to fix. Once you've done so, add the following to mark that you've done the clean-up:

{code}
  cg.plainOldJavaCapable(true); // Class supports plain-old Java
{code}

 The setting to prefer plain-old Java is ignored for generated classes not marked as plain-old Java capable.


was (Author: paul-rogers):
To use the feature, do the following:

* Set the config option {{drill.exec.compile.save_source}} to {{true}}.
 * Set the config option {{drill.exec.compile.code_dir}} to the location where you want to save the generated source code.
 * Where you generate code (using a {{CodeGenerator}}), set the "plain-old Java" options:

{code}
CodeGenerator&lt;Foo> cg = ...
cg.plainOldJavaCapable(true); // Class supports plain-old Java
 cg.preferPlainOldJava(true); // Actually generate plain-old Java
{code}

 * In your favorite IDE, add to the code lookup path the code directory saved earlier. In Eclipse, for example, you do this in the debug configuration you will use to debug Drill.
 * Set a breakpoint in template used for the generated code.
 * Run Drill. The IDE will stop at your breakpoint.
 * Step into the generated code. Examine class field and local variables.
* Have fun!

Note: not all generated code is ready to be compiled as plain-old Java. Some classes omit from the template the proper {{throws}} declarations. Other minor problems may also crop up. All are easy to fix. Once you've done so, add the following to mark that you've done the clean-up:

{code}
cg.plainOldJavaCapable(true); // Class supports plain-old Java
{code}

 The setting to prefer plain-old Java is ignored for generated classes not marked as plain-old Java capable.

> Option to debug generated Java code using an IDE
> ------------------------------------------------
>
>                 Key: DRILL-5052
>                 URL: https://issues.apache.org/jira/browse/DRILL-5052
>             Project: Apache Drill
>          Issue Type: Improvement
>          Components: Execution - Codegen
>    Affects Versions: 1.8.0
>            Reporter: Paul Rogers
>            Assignee: Paul Rogers
>            Priority: Minor
>
> Drill makes extensive use of Java code generation to implement its operators. Drill uses sophisticated techniques to blend generated code with pre-compiled template code. An unfortunate side-effect of this behavior is that it is very difficult to visualize and debug the generated code.
> As it turns out, Drill's code-merge facility is, in essence, a do-it-yourself version of subclassing. The Drill "template" is the parent class, the generated code is the subclass. But, rather than using plain-old subclassing, Drill combines the code from the two classes into a single "artificial" packet of byte codes for which no source exists.
> Modify the code generation path to optionally allow "plain-old Java" compilation: the generated code is a subclass of the template. Compile the generated code as a plain-old Java class with no byte-code fix-up. Write the code to a known location that the IDE can search when looking for source files.
> With this change, developers can turn on the above feature, set a breakpoint in a template, then step directly into the generated Java code called from the template.
> This feature should be an option, enabled by developers when needed. The existing byte-code technique should be used for production code generation.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)