Stack Trace Reader

Principle

Stack Trace Reader is a MicroEJ tool that reads and decodes the MicroEJ stack traces. When an exception occurs, the Core Engine prints the stack trace on the standard output System.out. The class names, non-required types names(see Types), and method names obtained are encoded with a MicroEJ internal format. This internal format prevents embedding all class names and method names in the executable image to save some memory space. The Stack Trace Reader tool allows you to decode the stack traces by replacing the internal class names and method names with their real names. It also retrieves the line numbers in the Application.

Functional Description

The Stack Trace Reader reads the debug information from the fully linked ELF file (the ELF file that contains the Core Engine, the other libraries, the BSP, the OS, and the compiled Application). It prints the decoded stack trace.

When Multi-Sandbox capability is enabled, the stack trace reader can simultaneously decode heterogeneous stack traces with lines owned by different Sandboxed Applications and the Kernel. Lines owned by the Kernel can be decoded with the Executable debug information file (optionally made available by your Kernel provider).

Use (Standalone Application)

For example, write the following new line to dump the currently executed stack trace on the standard output.

package com.mycompany;

public class Test {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
        new Exception().printStackTrace();
    }
}

To decode an application stack trace, the stack trace reader tool requires the application executable ELF file. In the case of a platform with full BSP connection (see BSP Connection Cases), the file is application.out in the output folder. In the other cases, the ELF file is generated by the C toolchain when building the BSP project (usually a .out or .axf file).

On successful deployment, the application is started on the device and the following trace is dumped on standard output.

VM START
Hello World from Gradle!
Exception in thread "main" @C:0x8070c30@
     at @C:0x8070c60@.@M:0x8075850:0x807585a@
     at @C:0x8070c30@.@M:0x80769a4:0x80769ba@
     at @C:0x8070c30@.@M:0x807857c:0x8078596@
     at @C:0x8070c00@.@M:0x8074e04:0x8074e1a@
     at @C:0x8070ce0@.@M:0x807601c:0x807603c@
     at @C:0x806fe10@.@M:0x807779c:0x80777b0@
     at @C:0x8070c00@.@M:0x8077b40:0x8077b4c@
     at @C:0x8070c00@.@M:0x80779b0:0x80779bb@

To decode the trace, execute the execTool task:

Warning

This tool requires to use Gradle 8.8 maximum.

./gradlew execTool --name=stackTraceDecrypter \
  --toolProperty=proxy.connection.connection.type="console" \
  --toolProperty=application.file="../../application/executable/application.out" \
  --toolProperty=additional.application.files="" \
  --console plain

Paste the previous trace dump into the console. The output of the Stack Trace Reader is the following:

=============== [ MicroEJ Core Engine Trace ] ===============
console:
[INFO] Paste the MicroEJ core engine stack trace here.
    VM START
    Hello World from Gradle!
    Exception in thread "main" @C:0x8070c30@
         at @C:0x8070c60@.@M:0x8075850:0x807585a@
         at @C:0x8070c30@.@M:0x80769a4:0x80769ba@
         at @C:0x8070c30@.@M:0x807857c:0x8078596@
         at @C:0x8070c00@.@M:0x8074e04:0x8074e1a@
         at @C:0x8070ce0@.@M:0x807601c:0x807603c@
         at @C:0x806fe10@.@M:0x807779c:0x80777b0@
         at @C:0x8070c00@.@M:0x8077b40:0x8077b4c@
         at @C:0x8070c00@.@M:0x80779b0:0x80779bb@
    VM START
    Hello World from Gradle!
    Exception in thread "main" java.lang.Throwable
         at java.lang.System.getStackTrace(Unknown Source)
         at java.lang.Throwable.fillInStackTrace(Throwable.java:82)
         at java.lang.Throwable.<init>(Throwable.java:32)
         at java.lang.Thread.dumpStack(Thread.java:573)
         at com.microej.Main.main(Main.java:22)
         at java.lang.MainThread.run(Thread.java:855)
         at java.lang.Thread.runWrapper(Thread.java:464)
         at java.lang.Thread.callWrapper(Thread.java:449)

Options

Option: Executable file

Option Name: application.file

Required?: Yes

Description:

Specify the full path of a full linked elf file.

Option: Additional object files

Option Name: additional.application.files

Required?: Yes

Option: Connection type

Option Name: proxy.connection.connection.type

Required?: Yes

Available values:

  • console

  • file

  • uart

  • socket

Description:

Specify the connection type between the device and PC.

Option: Port

Option Name: pcboardconnection.usart.pc.port

Required?: (For uart Connection Type)

Description:

Format: port name

Specifies the PC COM port:

  • Windows - COM1, COM2, ..., COM*n*

  • Linux - /dev/ttyS0, /dev/ttyS1, ..., /dev/ttyS*n*

Option: Baudrate

Option Name: pcboardconnection.usart.pc.baudrate

Required?: (For uart Connection Type)

Available values:

  • 9600

  • 38400

  • 57600

  • 115200

Description:

Defines the COM baudrate for PC-Device communication.

Option: Port

Option Name: pcboardconnection.socket.port

Required?: (For socket Connection Type)

Description:

IP port.

Option: Address

Option Name: pcboardconnection.socket.address

Required?: (For socket Connection Type)

Description:

IP address, on the form A.B.C.D. or empty.

Option: Stack trace file

Option Name: pcboardconnection.file.path

Required?:

Description:

Path to a stack trace file or empty.