Impossible to activate debug in Processing

Hi all,
I run processing 4.4.4 on my Ubuntu 22.04. The tool runs perfectly in normal mode but not in debug. There is no issue to activate debug mode but this has no effects at all.
I mean I can still run my sketch and I can set a break point but it never stops at it !
It acts as normal mode.
What is missing in my configuration to make it works ?
Thanks in advance.

I just tried it on an Ubuntu 24.04 VM and the debugger works there. Could you maybe share your code so we can maybe further diagnose the issue?

I can share … obviously. but this happens whatever the code. Even demo code

Oh my… I’m wrong only my code doesn’t work …

2 Likes
import processing.serial.*;
JSONObject json;

Serial port;                         // The serial port
char[] teapotPacket = new char[14];  // InvenSense Teapot packet
int serialCount = 0;                 // current packet byte position
int synced = 0;
int interval = 0;

float[] K = {0, 0, 0};

int motor;

PFont Font1, Font2;
PGraphics Curve;
PGraphics Info;

int guard_h = 80;
int guard_v = 30;
int tick_s = 10;
int font_size = 32;
int info_h = 400;
int info_v = 200;

String[] Mot = { "YAW", "PITCH", "ROLL" };

class PPoint { 
  float angle, time, cmd;
  PPoint (float a, float t, float c) {  
    angle = a; 
    time = t;
    cmd = c;
  } 
} 

PPoint[][] datas = new PPoint[2][255];
int nb_trace = 0;
int nb_points = 0;
int prev_seq = 0;

void setup() {
  size(1920, 1080);
  
  surface.setTitle("PID Drawer");

  // Uncomment the following two lines to see the available fonts
  String[] fontList = PFont.list();
  printArray(fontList);

  Font1 = createFont("FreeSans Bold", font_size);
  Font2 = createFont("FreeSans", font_size);

  Curve = createGraphics(width, height);
  Info = createGraphics(400, 200);

  // display serial port list for debugging/clarity
  println(Serial.list());

  // get the first available port (use EITHER this OR the specific port code below)
  String portName = Serial.list()[0];

  // get a specific serial port (use EITHER this OR the first-available code above)
  //String portName = "COM4";

  // open the serial port
  port = new Serial(this, portName, 115200);
  
  println(port);
  println(datas[0][0]);

}

void draw() {
  // black background
  background(0);

  Curve.beginDraw();
  Curve.textFont(Font2);

  // Horizontal line
  Curve.stroke(255);

  // Horizontal line
  Curve.line(guard_h, height / 2, width - guard_h, height / 2);
  for (int i = 0; i < 20; i = i+1) {
    Curve.line(guard_h + i * 90, height / 2 - tick_s / 2, guard_h + i * 90, height / 2 + tick_s / 2);
  }
  fill(255);
  Curve.triangle(width - guard_h, -10 + height / 2,
    width - guard_h + 10, height / 2,
    width - guard_h, +10 +       height / 2);

  // Vertial line
  Curve.line(guard_h, guard_v, guard_h, height - guard_v);
  for (int i = 0; i <= 12; i = i+1) {
    Curve.line(guard_h - tick_s / 2, i * 80 + guard_v, guard_h + tick_s / 2, i * 80 + guard_v);
    Curve.text(nfp(60 - i * 10, 0), 0, i * 80 + guard_v + font_size / 4);
  }
  Curve.triangle(guard_h - 10, guard_v, guard_h + 10, guard_v, guard_h, guard_v - 10);
  Curve.triangle(guard_h - 10, height - guard_v, guard_h + 10, height - guard_v, guard_h, height - guard_v + 10);
  Curve.endDraw();
  image(Curve, 0, 0);

  Info.beginDraw();
  Info.stroke(255, 0, 0);
  Info.fill(255, 255, 255);
  Info.rect(0, 0, info_h, info_v);
  Info.fill(1);
  Info.textFont(Font1);
  Info.text("Motor:", 20, 40);
  Info.text("Kp:", 20, 80);
  Info.text("Ki:", 20, 120);
  Info.text("Kd:", 20, 160);
  Info.textFont(Font2);
  Info.text(Mot[0], 130, 40);
  Info.text(nf(0.0, 0, 4), 130, 80);
  Info.text(nf(0.0, 0, 4), 130, 120);
  Info.text(nf(0.0, 0, 4), 130, 160);
  Info.endDraw();
  image(Info, width - info_h - guard_h, guard_v);
}

void serialEvent(Serial port) {
  interval = millis();
  while (port.available() > 0) {
    int ch = port.read();
    print((char)ch);
  
    if (synced == 0 && ch != '$') return;   // initial synchronization - also used to resync/realign if needed
    synced = 1;

    if ((serialCount == 1 && ch != 2)
      || (serialCount == 12 && ch != '\r')
      || (serialCount == 13 && ch != '\n')) {
      serialCount = 0;
      synced = 0;
      println("Dump Frame");
      return;
    }

    if (serialCount > 0 || ch == '$') {
      teapotPacket[serialCount++] = (char)ch;
      if (serialCount == 14) {
        serialCount = 0; // restart packet byte position
        println("Complete Packet");

        if (teapotPacket[10] == 0x1) {
          println("Reset is requested");
          Curve.beginDraw();
          Curve.clear();
          Curve.endDraw();
          nb_trace = 0;
          nb_points = 0;
          prev_seq = 0;
          
        }

        if ( prev_seq !=  teapotPacket[9]) {
          println("New Seq");
          nb_trace++;
        }
        if (nb_trace >= 2) {
          println("Reset Seq");
          nb_trace = 0;
        }
        
        PPoint p = new PPoint(teapotPacket[6], teapotPacket[7], teapotPacket[8]);
        println(nb_trace); println(nb_points);
        datas[nb_trace][nb_points] = p;

        motor = teapotPacket[2];
        K[0] = teapotPacket[3];
        K[1] = teapotPacket[4];
        K[2] = teapotPacket[5];
        nb_points++;
        if (nb_points >= 254) {
          // Overflow 
          nb_points = 254;
        }

      }
    }
  }
}

void keyPressed() {
  json = new JSONObject();

  print("Pressed");
  if (key == 'a') {
    K[0] += 0.1;  
  }
  else if (key == 'q') {
    K[1] += 0.1;
  }
  else if (key == 'w') {
    K[2] += 0.1;
  }
  else if (key == 'z') {
    K[0] += 0.01;
  }
  else if (key == 's') {
    K[1] += 0.01;
  }
  else if (key == 'x') {
    K[2] += 0.01;
  }
  else if (key == 'e') {
    K[0] += 0.001;
  }
  else if (key == 'd') {
    K[1] += 0.001;
  }
  else if (key == 'c') {
    K[2] += 0.001;
  }
  else if (key == 'r') {
    K[0] += 0.0001;
  }
  else if (key == 'f') {
    K[1] += 0.0001;
  }
  else if (key == 'v') {
    K[2] += 0.0001;
  }
  else if (key == 'A') {
    K[0] -= 0.1;  
  }
  else if (key == 'Q') {
    K[1] -= 0.1;
  }
  else if (key == 'W') {
    K[2] -= 0.1;
  }
  else if (key == 'Z') {
    K[0] -= 0.01;
  }
  else if (key == 'S') {
    K[1] -= 0.01;
  }
  else if (key == 'X') {
    K[2] -= 0.01;
  }
  else if (key == 'E') {
    K[0] -= 0.001;
  }
  else if (key == 'D') {
    K[1] -= 0.001;
  }
  else if (key == 'C') {
    K[2] -= 0.001;
  }
  else if (key == 'R') {
    K[0] -= 0.0001;
  }
  else if (key == 'F') {
    K[1] -= 0.0001;
  }
  else if (key == 'V') {
    K[2] -= 0.0001;
  }
  else if (key == '1') {
    motor = 0;
  }
  else if (key == '2') {
    motor = 1;
  }
  else if (key == '3') {
    motor = 2;
  }
  json.setInt("motor", motor);
  json.setFloat("Kp", K[0]);
  json.setFloat("Ki", K[1]);
  json.setFloat("Kd", K[2]);
  
  print(json.toString());
  port.write(json.toString());
  
}```
1 Like

Alright, can you check if debugging works within the draw function but not the serial event function? As far as I recall the serial event runs on a different thread under the hood so is thus not debuggable with the current way Processing handles the debugger.

ok I move forward in this matter. It’s working now …
The reason … the folder and PDE file was not sharing the same name. When I renamed my PDE script with the same content folder it makes it works …

1 Like

Thank you for figuring that out, I see the same on macOS

Created an issue here:

1 Like

AFAIK, folder & main .pde file names must match.
It’s not a bug, but a Processing spec.

1 Like

Since Processing 4.0 the folder & main .pde files can be different and Processing will add main=File.pde to the sketch.properties instead

2 Likes