Skip to content

Static variables are not shown #1243

Description

@felias-fogg

Describe the bug
Gobal static variable is not shown under Static heading

To Reproduce
Steps to reproduce the behavior:

  1. Start debug session with Arduino sketch static.ino (see below)
  2. Set breakpoint in loop function
  3. Start execution and wait until breakpoint is reached
  4. Open Static: ./static.ino variable category
  5. See issue

Expected behavior
The variables ontime and _vary should be shown

Screenshots

Image

Environment (please complete the following information):

  • Cortex-Debug Version (this extension) 1.12.1
  • OS: macOS 15.7.4
  • GDB Version: 17.1.4
  • Compiler Toolchain Version: avr-gcc 7.3.0

Please include launch.json

Note: We are unlikely to look at the issue if you do not supply this


  "version": "0.2.0",
  "configurations": [
    {
      "gdbPath": "/Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5/avr-gdb",
      "objdumpPath": "/Users/nebel/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-objdump",
      "overrideGDBServerStartedRegex": "Listening on port \\d+ for gdb connection",
      "preLaunchCommands": [
        "monitor debugwire enable"
      ],
      "runToEntryPoint": "main",
      "serverArgs": [
        "-s",
        "/Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5/bin/simavr",
        "-d",
        "atmega328p",
        "-m",
        "all",
        "-F",
        "16000000L",
        "--atexit",
        "leave"
      ],
      "configId": "XMiniCore:avr:atmega328p_xplained_mini:clock=16MHz,debug=leave,eeprom=keep:programmer=simavr",
      "name": "Arduino: XMiniCore:avr:atmega328p_xplained_mini:clock=16MHz,debug=leave,eeprom=keep (simavr)",
      "cwd": "${workspaceFolder}",
      "request": "launch",
      "type": "cortex-debug",
      "showDevDebugOutput": "raw",
      "executable": "/Users/nebel/Documents/Arduino/static/build/static.ino.elf",
      "servertype": "openocd",
      "serverpath": "/Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5/pyavrocd",
      "armToolchainPath": "/Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5",
      "configFiles": [
        "nix"
      ],
      "svdFile": "/Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5/pyavrocd-util/svd/atmega328p.svd"
    }
  ]
}

Attach text from Debug Console

Please enable debug output in your launch.json ("showDevDebugOutput": "raw"). It this is too large, please attach it as a file


Cortex-Debug: VSCode debugger extension version 1.12.1 git(652d042). Usage info: https://github.com/Marus/cortex-debug#usage
"configuration": {
    "gdbPath": "/Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5/avr-gdb",
    "objdumpPath": "/Users/nebel/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-objdump",
    "overrideGDBServerStartedRegex": "Listening on port \\d+ for gdb connection",
    "preLaunchCommands": [
        "monitor debugwire enable"
    ],
    "runToEntryPoint": "main",
    "serverArgs": [
        "-s",
        "/Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5/bin/simavr",
        "-d",
        "atmega328p",
        "-m",
        "all",
        "-F",
        "16000000L",
        "--atexit",
        "leave"
    ],
    "configId": "XMiniCore:avr:atmega328p_xplained_mini:clock=16MHz,debug=leave,eeprom=keep:programmer=simavr",
    "name": "Arduino: XMiniCore:avr:atmega328p_xplained_mini:clock=16MHz,debug=leave,eeprom=keep (simavr)",
    "cwd": "/Users/nebel/Documents/Arduino/static",
    "request": "launch",
    "type": "cortex-debug",
    "showDevDebugOutput": "raw",
    "executable": "/Users/nebel/Documents/Arduino/static/build/static.ino.elf",
    "servertype": "openocd",
    "serverpath": "/Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5/pyavrocd",
    "armToolchainPath": "/Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5",
    "configFiles": [
        "nix"
    ],
    "svdFile": "/Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5/pyavrocd-util/svd/atmega328p.svd",
    "__configurationTarget": 6,
    "gdbServerConsolePort": 55878,
    "pvtAvoidPorts": [],
    "chainedConfigurations": {
        "enabled": false
    },
    "debuggerArgs": [],
    "swoConfig": {
        "enabled": false,
        "decoders": [],
        "cpuFrequency": 0,
        "swoFrequency": 0,
        "source": "probe"
    },
    "rttConfig": {
        "enabled": false,
        "decoders": []
    },
    "graphConfig": [],
    "postLaunchCommands": [],
    "preAttachCommands": [],
    "postAttachCommands": [],
    "preRestartCommands": [],
    "postRestartCommands": [],
    "preResetCommands": [],
    "postResetCommands": [],
    "searchDir": [],
    "toolchainPath": "/Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5",
    "toolchainPrefix": "arm-none-eabi",
    "extensionPath": "/Users/nebel/.vscode/extensions/marus25.cortex-debug-1.12.1",
    "registerUseNaturalFormat": true,
    "variableUseNaturalFormat": true,
    "pvtVersion": "1.12.1",
    "__sessionId": "ba632499-359c-452f-b48a-de2327ab013e",
    "pvtShowDevDebugOutput": "raw"
}
Reading symbols from /Users/nebel/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-objdump --syms -C -h -w /Users/nebel/Documents/Arduino/static/build/static.ino.elf
Reading symbols from /Users/nebel/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-nm --defined-only -S -l -C -p /Users/nebel/Documents/Arduino/static/build/static.ino.elf
Launching GDB: /Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5/avr-gdb -q --interpreter=mi2
1-gdb-version
Launching gdb-server: /Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5/pyavrocd -c "gdb_port 50017" -c "tcl_port 50018" -c "telnet_port 50019" -s /Users/nebel/Documents/Arduino/static -f /Users/nebel/.vscode/extensions/marus25.cortex-debug-1.12.1/support/openocd-helpers.tcl -f nix -s /Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5/bin/simavr -d atmega328p -m all -F 16000000L --atexit leave
    Please check TERMINAL tab (gdb-server) for output from /Users/nebel/Library/Arduino15/packages/XMiniCore/tools/avrocd-tools/1.5.5/pyavrocd
Finished reading symbols from objdump: Time: 112 ms
Finished reading symbols from nm: Time: 107 ms
-> =thread-group-added,id="i1"
-> ~"GNU gdb (GDB) 17.1.4\n"
-> ~"Copyright (C) 2025 Free Software Foundation, Inc.\n"
-> ~"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law."
-> ~"\nType \""
-> ~"show copying\" and \"show warranty\" for details.\n"
-> ~"This GDB was configured as \"--host=aarch64-apple-darwin24.6.0 --target=avr\".\n"
-> ~"Type \"show configuration\" for configuration details.\n"
-> ~"For bug reporting instructions, please see:\n"
-> ~"<https://www.gnu.org/software/gdb/bugs/>.\n"
-> ~"Find the GDB manual and other documentation resources online at:\n    <"
-> ~"http://www.gnu.org/software/gdb/documentation/>.\n\n"
-> ~"For help, type \"help\".\n"
-> ~"Type \"apropos word\" to search for commands related to \"word\".\n"
-> 1^done
2-gdb-set mi-async on
-> 2^done
3-interpreter-exec console "set print demangle on"
-> 3^done
4-interpreter-exec console "set print asm-demangle on"
-> =cmd-param-changed,param="print asm-demangle",value="on"
-> 4^done
5-enable-pretty-printing
-> 5^done
6-interpreter-exec console "source /Users/nebel/.vscode/extensions/marus25.cortex-debug-1.12.1/support/gdbsupport.init"
-> 6^done
7-interpreter-exec console "source /Users/nebel/.vscode/extensions/marus25.cortex-debug-1.12.1/support/gdb-swo.init"
-> =cmd-param-changed,param="language",value="c"
-> =cmd-param-changed,param="language",value="auto"
-> 7^done
8-interpreter-exec console "set output-radix 0xa"
-> ~"Output radix now set to decimal 10, hex a, octal 12.\n"
Output radix now set to decimal 10, hex a, octal 12.
-> 8^done
9-interpreter-exec console "set input-radix 0xa"
-> ~"Input radix now set to decimal 10, hex a, octal 12.\n"
Input radix now set to decimal 10, hex a, octal 12.
-> 9^done
10-file-exec-and-symbols "/Users/nebel/Documents/Arduino/static/build/static.ino.elf"
-> 10^done
11-target-select extended-remote localhost:50017
-> =thread-group-started,id="i1",pid="42000"
-> =thread-created,id="1",group-id="i1"
-> ~"0x00000000 in __vectors ()\n"
0x00000000 in __vectors ()
-> *stopped,frame={addr="0x00000000",func="__vectors",args=[],arch="avr:5"},thread-id="1",stopped-threads="all"
mi2.status = stopped
Program stopped, probably due to a reset and/or halt issued by debugger
-> 11^connected
12-interpreter-exec console "monitor debugwire enable"
-> @"Monitor subcommands are: ior halt reset\n"
Monitor subcommands are: ior halt reset
-> 12^done
13-interpreter-exec console "monitor reset halt"
-> 13^done
14-target-download
-> 14+download,{section=".text",section-size="2562",total-size="16616"}
-> 14+download,{section=".text",section-sent="48",section-size="2562",total-sent="48",total-size="16616"}
-> 14+download,{section=".data",section-size="14",total-size="16616"}
-> 14^done,address="0x00000000",load-size="2576",transfer-rate="355304",write-rate="46"
15-interpreter-exec console "monitor reset halt"
-> 15^done
16-break-insert "/Users/nebel/Documents/Arduino/static/static.ino:12"
-> ~"Note: automatically using hardware breakpoints for read-only addresses.\n"
Note: automatically using hardware breakpoints for read-only addresses.
-> 16^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x000003da",func="loop",file="/Users/nebel/Documents/Arduino/static/static.ino",fullname="/Users/nebel/Documents/Arduino/static/static.ino",line="12",thread-groups=["i1"],times="0",original-location="/Users/nebel/Documents/Arduino/static/static.ino:12"}
Returning dummy thread-id to workaround VSCode issue with pause button not working
Returning dummy stack frame to workaround VSCode issue with pause button not working: {"threadId":1,"startFrame":0,"levels":20}
17-break-insert -t --function main
-> 17^done,bkpt={number="2",type="breakpoint",disp="del",enabled="y",addr="0x00000582",func="main",file="/Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp",fullname="/Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp",line="35",thread-groups=["i1"],times="0",original-location="-function main"}
18-exec-continue --all
-> 18^running
-> *running,thread-id="all"
mi2.status = running
-> =breakpoint-modified,bkpt={number="2",type="breakpoint",disp="del",enabled="y",addr="0x00000582",func="main",file="/Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp",fullname="/Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp",line="35",thread-groups=["i1"],times="1",original-location="-function main"}
-> ~"\n"

-> ~"Temporary breakpoint 2, main () at /Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp:35\n"
Temporary breakpoint 2, main () at /Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp:35
-> ~"35\t  init();\n"
35	  init();
-> *stopped,reason="breakpoint-hit",disp="del",bkptno="2",frame={addr="0x00000582",func="main",args=[],file="/Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp",fullname="/Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp",line="35",arch="avr:5"},thread-id="1",stopped-threads="all"
mi2.status = stopped
-> =breakpoint-deleted,id="2"
19-thread-list-ids
-> 19^done,thread-ids={thread-id="1"},current-thread-id="1",number-of-threads="1"
20-thread-info 1
-> 20^done,threads=[{id="1",target-id="Thread <main>",frame={level="0",addr="0x00000582",func="main",args=[],file="/Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp",fullname="/Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp",line="35",arch="avr:5"},state="stopped"}]
21-stack-list-frames --thread 1 0 19
-> 21^done,stack=[frame={level="0",addr="0x00000582",func="main",file="/Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp",fullname="/Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp",line="35",arch="avr:5"}]
22-stack-info-frame --thread 1 --frame 0
-> 22^done,frame={level="0",addr="0x00000582",func="main",file="/Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp",fullname="/Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp",line="35",arch="avr:5"}
23-stack-list-variables --thread 1 --frame 0 --simple-values
-> 23^done,variables=[]
24-exec-continue --thread 1
-> 24^running
-> *running,thread-id="all"
mi2.status = running
-> =breakpoint-modified,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x000003da",func="loop",file="/Users/nebel/Documents/Arduino/static/static.ino",fullname="/Users/nebel/Documents/Arduino/static/static.ino",line="12",thread-groups=["i1"],times="1",original-location="/Users/nebel/Documents/Arduino/static/static.ino:12"}
-> ~"\n"

-> ~"Breakpoint 1, loop () at /Users/nebel/Documents/Arduino/static/static.ino:12\n"
Breakpoint 1, loop () at /Users/nebel/Documents/Arduino/static/static.ino:12
-> ~"12\t  int local_ontime = random(100,1000);\n"
12	  int local_ontime = random(100,1000);
-> *stopped,reason="breakpoint-hit",disp="keep",bkptno="1",frame={addr="0x000003da",func="loop",args=[],file="/Users/nebel/Documents/Arduino/static/static.ino",fullname="/Users/nebel/Documents/Arduino/static/static.ino",line="12",arch="avr:5"},thread-id="1",stopped-threads="all"
mi2.status = stopped
25-thread-list-ids
-> 25^done,thread-ids={thread-id="1"},current-thread-id="1",number-of-threads="1"
26-thread-info 1
-> 26^done,threads=[{id="1",target-id="Thread <main>",frame={level="0",addr="0x000003da",func="loop",args=[],file="/Users/nebel/Documents/Arduino/static/static.ino",fullname="/Users/nebel/Documents/Arduino/static/static.ino",line="12",arch="avr:5"},state="stopped"}]
27-stack-list-frames --thread 1 0 19
-> 27^done,stack=[frame={level="0",addr="0x000003da",func="loop",file="/Users/nebel/Documents/Arduino/static/static.ino",fullname="/Users/nebel/Documents/Arduino/static/static.ino",line="12",arch="avr:5"},frame={level="1",addr="0x0000058e",func="main",file="/Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp",fullname="/Users/nebel/Library/Arduino15/packages/MiniCore/hardware/avr/3.1.2/cores/MCUdude_corefiles/main.cpp",line="46",arch="avr:5"}]
28-stack-info-frame --thread 1 --frame 0
-> 28^done,frame={level="0",addr="0x000003da",func="loop",file="/Users/nebel/Documents/Arduino/static/static.ino",fullname="/Users/nebel/Documents/Arduino/static/static.ino",line="12",arch="avr:5"}
29-stack-list-variables --thread 1 --frame 0 --simple-values
-> 29^done,variables=[{name="local_ontime",type="int",value="<optimized out>"},{name="factor",type="float",value="1"}]
30-var-create --thread 1 --frame 0 var_local_ontime_4096 @ "local_ontime"
-> 30^done,name="var_local_ontime_4096",numchild="0",value="<optimized out>",type="int",has_more="0"
31-var-create --thread 1 --frame 0 var_factor_4096 @ "factor"
-> 31^done,name="var_factor_4096",numchild="0",value="1",type="float",has_more="0"
32-stack-info-frame --thread 1 --frame 0
-> 32^done,frame={level="0",addr="0x000003da",func="loop",file="/Users/nebel/Documents/Arduino/static/static.ino",fullname="/Users/nebel/Documents/Arduino/static/static.ino",line="12",arch="avr:5"}
info addr ontime
33-interpreter-exec console "info addr ontime"
-> ~"Symbol \"ontime\" is static storage at address 0x800100.\n"
Symbol "ontime" is static storage at address 0x800100.
-> 33^done
{"output":"","token":33,"outOfBandRecord":[],"resultRecords":{"resultClass":"done","results":[]}}
34-stack-info-frame --thread 1 --frame 0
-> 34^done,frame={level="0",addr="0x000003da",func="loop",file="/Users/nebel/Documents/Arduino/static/static.ino",fullname="/Users/nebel/Documents/Arduino/static/static.ino",line="12",arch="avr:5"}
35-stack-list-variables --thread 1 --frame 0 --simple-values
-> 35^done,variables=[{name="local_ontime",type="int",value="<optimized out>"},{name="factor",type="float",value="1"}]
36-stack-info-frame --thread 1 --frame 0
-> 36^done,frame={level="0",addr="0x000003da",func="loop",file="/Users/nebel/Documents/Arduino/static/static.ino",fullname="/Users/nebel/Documents/Arduino/static/static.ino",line="12",arch="avr:5"}
37-var-update --thread 1 --frame 0 --all-values var_local_ontime_4096
-> 37^done,changelist=[]
38-var-update --thread 1 --frame 0 --all-values var_factor_4096
-> 38^done,changelist=[]

Additional context

  • It looks similar to Static variables don't show #929. However, here GDB is not even asked for the variables.

  • I checked the output of avr-objdump and avr-nm, which looks as follows (concerning ontime):
    00800100 l O .data 00000002 ontime
    00800100 00000002 d ontime

  • The list of global variables is also empty because LTO elevated all global variables to static ones. I guess that is something that one can not do much about it. However, it would be great if these variables could at least be shown as static variables.

  • As a side remark: I tried that out with AVR-GCC 15.1 and got the same result.

  • I attached a description of how to reproduce the error using a simulator. This should work on Mac/Linux/Windows.

reproduce-no-static.md

Arduino sketch static.ino:

#define LED LED_BUILTIN

int offtime = 1;
static int ontime = 1;
static int _vary = 2;

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  int local_ontime = random(100,1000);
  static float factor = 1;
  offtime = local_ontime + offtime + _vary;
  if (offtime > 3000) {
    offtime = 100;
  }
  factor = factor * 0.99;
  ontime += offtime;
  _vary = (_vary + 1) %2;
  digitalWrite(LED, HIGH);
  delay(local_ontime+ontime);
  digitalWrite(LED, LOW);
  delay(offtime*factor);
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions