Git Product home page Git Product logo

pyjdb's Introduction

pyjdb

Python interface with Java debugger through JDB.

Overview

The JdbProcess uses pexpect to attach to a jdb process and record all the information that is obtained.

For each instruction, we record a dictionary of the following format:

{
  "return": 10000,
  "thread": "main",
  "class.method": "IterPower.iterPower()",
  "method": "iterPower",
  "line": 15,
  "bci": 17,
  "instruction": "return result;"
}

For each instruction, we can also obtain the dictionary of the current method's arguments, as well as all its local variables:

({'base': 10, 'exp': 0}, {'result': 10000})

Example

Let's assume that we have this Java file, IterPower.java:

public class IterPower {
    public static void main(String[] args) {
        // ... parse arguments ...
        System.out.println(iterPower(base, exp));
    }

    public static int iterPower(int base, int exp) {
        int result = 1;
        while (exp > 0) {
            result *= base;
            exp -= 1;
        }
        return result;
    }
}

which has been compiled with debugging information, javac -g IterPower.java. The following is a Python snippet:

import pyjdb
import itertools

p = pyjdb.JdbProcess("IterPower")
p.spawn("10 4")

variables = {}

while True:
    
    # Try to make an additional step and retrieve local variables
    result = None
    try:
        p.step()
        result = p.locals()
    except pyjdb.EOF:
        break
    if result is None:
        continue

    # Store the values of each variable
    (args, locs) = result
    for (var, val) in itertools.chain(args.items(), locs.items()):
        variables[var] = variables.get(var, list())
        variables[var].append(val)

variables_unique_values = {
    var: list(set(vals)) for (var, vals) in variables.items()
}

print(variables_unique_values)

The snippet will output a trace of the variable values of this program through its execution:

{"args": ["instance of java.lang.String[0] (id=495)"],
 "base": [10],
 "exp": [0, 1, 2, 3, 4],
 "result": [1, 10, 100, 1000, 10000]}

Inspiration

This project was inspired by a talk by Elena Glassman in which she shows how to cluster different implementations of the same solution according to the trace of the internal variables. Her work, which includes OverCode and foobaz, focuses on Python programs. At my home institution, we use Java in our introductory classes. The initial goal of this project was to apply Dr. Glassman's techniques to Java assignments.

Related projects

There were several ambitious projects related to bringing a Java debugger to Python. These projects highlight how complex an undertaking it is to implement the actual JDWP protocol. This is why in this project, our approach has been to piggy-back on jdb so as to not need to reimplement protocol-level functionality.

  • csuter/pyjdb (abandonned): A Python implementation of the JDWP specifications.

  • soulseekah/pyjdb (abandonned): A jdb replacement with more user-friendly features.

pyjdb's People

Contributors

jlumbroso avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

vdaysky

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.