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);
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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