JTAG Programming/Debugging the NodeMCU ESP8266

Sysprogs forums Forums VisualGDB JTAG Programming/Debugging the NodeMCU ESP8266

Viewing 11 posts - 1 through 11 (of 11 total)
  • Author
    Posts
  • #11433
    luffy
    Participant

    Hi,

    I’am trying to program and debug the NodeMCU over the Olimex ARM-USB-OCD-H JTAG debugger. I followed the Tutorial (https://visualgdb.com/tutorials/esp8266/nodemcu/jtag/) and installed the latest version of VisualGDB and Gnu Toolchain (http://gnutoolchains.com/esp8266/).

    Here is a picture of the wiring: http://i67.tinypic.com/bg6z8.jpg

    During the setup of the project I get the following when clicking on “Test settings”:

    C:\SysGCC\esp8266\esp8266-bsp\OpenOCD\bin\openocd.exe -f interface/ftdi/olimex-arm-usb-ocd-h.cfg -f target/esp8266.cfg -c “adapter_khz 3000”
    Open On-Chip Debugger 0.9.0 (2015-11-04-20:38)
    Licensed under GNU GPL v2
    For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
    trst_and_srst separate srst_gates_jtag trst_push_pull srst_open_drain connect_deassert_srst
    adapter speed: 1000 kHz
    stop_wdt
    adapter speed: 3000 kHz
    Info : clock speed 3000 kHz
    Error: JTAG scan chain interrogation failed: all zeroes
    Error: Check JTAG interface, timings, target power, etc.
    Error: Trying to use configured scan chain anyway…
    Error: esp8266.cpu: IR capture error; saw 0x00 not 0x01
    Warn : Bypassing JTAG setup events due to errors
    Warn : Warning: Target not halted, breakpoint/watchpoint state may be unpredictable.
    Info : accepting ‘telnet’ connection on tcp/4444
    shutdown command invoked
    Info : dropped ‘telnet’ connection

    Despite the errors above, I get a popup with: “Your settings appear to be valid”.

    I can successfully build the project but debugging doesn’t work (Stuck on Loading Image).

    Here is the output I get:

    openocd

    <div>Open On-Chip Debugger 0.9.0 (2015-11-04-20:38)
    Licensed under GNU GPL v2
    For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
    trst_and_srst separate srst_gates_jtag trst_push_pull srst_open_drain connect_deassert_srst
    adapter speed: 1000 kHz
    stop_wdt
    adapter speed: 3000 kHz
    Info : clock speed 3000 kHz
    Error: JTAG scan chain interrogation failed: all zeroes
    Error: Check JTAG interface, timings, target power, etc.
    Error: Trying to use configured scan chain anyway…
    Error: esp8266.cpu: IR capture error; saw 0x00 not 0x01
    Warn : Bypassing JTAG setup events due to errors
    Warn : Warning: Target not halted, breakpoint/watchpoint state may be unpredictable.
    Info : accepting ‘gdb’ connection on tcp/3333
    undefined debug reason 7 – target needs reset
    Warn : target not halted
    Info : TAP esp8266.cpu does not have IDCODE
    Warn : xtensa_deassert_reset: ‘reset halt’ is not supported for Xtensa. Have halted some time aft
    er resetting (not the same thing!)
    Error: timed out while waiting for target halted
    TARGET: esp8266.cpu – Not halted
    in procedure ‘reset’
    in procedure ‘ocd_bouncer'</div>
    <div>
    Warn : WARNING! The target is already running. All changes GDB did to registers will be discarded
    ! Waiting for target to halt.
    Info : Halt timed out, wake up GDB.
    Warn : target esp8266.cpu is not halted
    undefined debug reason 7 – target needs reset
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Warn : target not halted
    Error: Memory write failure!
    Warn : WARNING! The target is already running. All changes GDB did to registers will be discarded
    ! Waiting for target to halt.</div>

    GDB Session

    <div>Found an SPI FLASH section at 0x00020000. This image is a non-OTA image.
    mon reset halt
    &”mon reset halt\n”
    @”TAP esp8266.cpu does not have IDCODE\n”
    @”xtensa_deassert_reset: ‘reset halt’ is not supported for Xtensa. Have halted some time after resetting (not the same thing!)\n”
    @”timed out while waiting for target halted\n”
    @”TARGET: esp8266.cpu – Not halted\n”
    @”in procedure ‘reset’ \n”
    @”in procedure ‘ocd_bouncer’\n”
    @”\n”
    @”\n”
    ^done
    -exec-next-instruction
    ^running
    *running,thread-id=”all”
    @”WARNING! The target is already running. All changes GDB did to registers will be discarded! Waiting for target to halt.\n”
    @”Halt timed out, wake up GDB.\n”
    ~”\nProgram”
    ~” stopped.\n”
    ~”0x00000000 in ?? ()\n”
    *stopped,reason=”signal-received”,signal-name=”0″,signal-meaning=”Signal 0″,frame={addr=”0x00000000″,func=”??”,args=[]},thread-id=”1″,stopped-threads=”all”
    set $com_sysprogs_esp8266_wdcfg=0
    &”set $com_sysprogs_esp8266_wdcfg=0\n”
    ^done
    set $vecbase=0x40000000
    &”set $vecbase=0x40000000\n”
    ^done
    set *(0x3fffc200)=0
    &”set *(0x3fffc200)=0\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fffc200″,len=”0x4″
    ^done
    set $ccompare=0
    &”set $ccompare=0\n”
    ^done
    set $intclear=-1
    &”set $intclear=-1\n”
    ^done
    set $intenable=0
    &”set $intenable=0\n”
    ^done
    set $eps2=0x20
    &”set $eps2=0x20\n”
    ^done
    set $icountlevel=0
    &”set $icountlevel=0\n”
    ^done
    print *((int *)0x60000900)
    &”print *((int *)0x60000900)\n”
    ~”$1 = 0″
    ~”\n”
    ^done
    set *((int *)0x60000900)=0
    &”set *((int *)0x60000900)=0\n”
    &”Cannot access memory at address 0x60000900\n”
    ^error,msg=”Cannot access memory at address 0x60000900″
    restore C:/SysGCC/esp8266/esp8266-bsp/sysprogs/flashprog/ESP8266FlashProg.bin binary 0x40100000 0 0x1a4
    &”restore C:/SysGCC/esp8266/esp8266-bsp/sysprogs/flashprog/ESP8266FlashProg.bin binary 0x40100000 0 0x1a4\n”
    ~”Restoring binary file C:/SysGCC/esp8266/esp8266-bsp/sysprogs/flashprog/ESP8266FlashProg.bin into memory (0x40100000 to 0x401001a4)\n”
    &”warning: restore: memory write failed ((undocumented errno -1)).\n”
    ^done
    flushregs
    &”flushregs\n”
    ~”Register cache flushed.\n”
    ^done
    set $epc2=0x40100074
    &”set $epc2=0x40100074\n”
    ^done
    set $ps=0x20
    &”set $ps=0x20\n”
    ^done
    set $sp=0x3fffc000
    &”set $sp=0x3fffc000\n”
    ^done
    set *((unsigned *)0x3fff8008)=0
    &”set *((unsigned *)0x3fff8008)=0\n”
    &”Cannot access memory at address 0x3fff8008\n”
    ^error,msg=”Cannot access memory at address 0x3fff8008″
    set *((unsigned *)0x3fff800c)=4096
    &”set *((unsigned *)0x3fff800c)=4096\n”
    &”Cannot access memory at address 0x3fff800c\n”
    ^error,msg=”Cannot access memory at address 0x3fff800c”
    set *((unsigned *)0x3fff8010)=4096
    &”set *((unsigned *)0x3fff8010)=4096\n”
    &”Cannot access memory at address 0x3fff8010\n”
    ^error,msg=”Cannot access memory at address 0x3fff8010″
    set *((unsigned *)0x3fff8014)=4294967295
    &”set *((unsigned *)0x3fff8014)=4294967295\n”
    &”Cannot access memory at address 0x3fff8014\n”
    ^error,msg=”Cannot access memory at address 0x3fff8014″
    set $intclear=-1
    &”set $intclear=-1\n”
    ^done
    set $intenable=0
    &”set $intenable=0\n”
    ^done
    set $eps2=0x20
    &”set $eps2=0x20\n”
    ^done
    set $icountlevel=0
    &”set $icountlevel=0\n”
    ^done
    -exec-continue
    ^running
    *running,thread-id=”all”
    @”Memory write failure!\n”
    @”WARNING! The target is already running. All changes GDB did to registers will be discarded! Waiting for target to halt.\n”</div>

    <div>Thank you very much in advance :)</div>

    #11440
    support
    Keymaster

    Hi,

    The “Error: JTAG scan chain interrogation failed: all zeroes” suggests a wiring error. Please double-check the JTAG wiring you are using and ensure the JTAG pins are not connected to any other external components. If you are using a different version of the NodeMCU module than shown in our tutorial, please double-check its schematics that the pin numbers have not changed.

    #11456
    luffy
    Participant

    Thank you for the quick response.

    I double checked the wiring and connected the NodeMCU directly to the Olimex JTAG (here is a picture: http://i67.tinypic.com/10cq3xi.jpg) . Unfortunately still the same problem.

    I’am using the NodeMCU v1.0 and the Olimex ARM-USB-OCD-H (The same as in the tutorial).

    Is there something else I could do to debug the error?

    #11461
    support
    Keymaster

    Hi,

    The connection looks very similar to what we have (unless the individual pins are confused), so the best advice we could give is to double-check each and every connection with a multimeter (also check for accidental short-circuited wires) or try another NodeMCU board.

    This could also be caused by some undocumented ESP8266 functionality disabling the JTAG connection, so erasing the FLASH using the serial bootloader might help as well.

    #11471
    luffy
    Participant

    Hi,

    thanks for the tip. I used this tutorial (http://www.pratikpanda.com/completely-format-erase-esp8266-flash-memory/) to erase the Flash. The “Test settings” dialog doesn’t show any errors now: http://i63.tinypic.com/fd8uw3.png . So this definitely helped.

    When I click start debugging however, the image loads (Progress bar 100%) and an exception is displayed with the following error: http://i63.tinypic.com/5nsxmp.png

     

    I don’t know if it’s useful, but here is the Raw output from GDB:

    Your VisualGDB trial expires in 28 days!
    C:\SysGCC\esp8266\bin\xtensa-lx106-elf-gdb.exe –interpreter mi C:\Users\hes\Documents\visualGdb\Projects\NodeMCUDebugTest\VisualGDB\Debug\NodeMCUDebugTest
    -gdb-version
    =thread-group-added,id=”i1″
    ~”GNU gdb (GDB) 7.11\n”
    ~”Copyright (C) 2016 Free Software Foundation, Inc.\n”
    ~”License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html&gt;\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.  Type \”show copying\”\nand \”show warranty\” for details.\n”
    ~”This GDB was configured as \”–host=i686-pc-mingw32 –target=xtensa-lx106-elf\”.\nType \”show configuration\” for configuration details.”
    ~”\nFor bug reporting instructions, please see:\n”
    ~”<http://www.gnu.org/software/gdb/bugs/&gt;.\n”
    ~”Find the GDB manual and other documentation resources online at:\n<http://www.gnu.org/software/gdb/documentation/&gt;.\n”
    ~”For help, type \”help\”.\n”
    ~”Type \”apropos word\” to search for commands related to \”word\”…\n”
    ~”Reading symbols from C:\\Users\\hes\\Documents\\visualGdb\\Projects\\NodeMCUDebugTest\\VisualGDB\\Debug\\NodeMCUDebugTest…”
    ~”done.\n”
    ~”GNU gdb (GDB) 7.11\n”
    ~”Copyright (C) 2016 Free Software Foundation, Inc.\n”
    ~”License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html&gt;\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.  Type \”show copying\”\nand \”show warranty\” for details.\n”
    ~”This GDB was configured as \”–host=i686-pc-mingw32 –target=xtensa-lx106-elf\”.\nType \”show configuration\” for configuration details.”
    ~”\nFor bug reporting instructions, please see:\n”
    ~”<http://www.gnu.org/software/gdb/bugs/&gt;.\n”
    ~”Find the GDB manual and other documentation resources online at:\n<http://www.gnu.org/software/gdb/documentation/&gt;.\n”
    ~”For help, type \”help\”.\n”
    ~”Type \”apropos word\” to search for commands related to \”word\”.\n”
    ^done
    -list-features
    ^done,features=[“frozen-varobjs”,”pending-breakpoints”,”thread-info”,”data-read-memory-bytes”,”breakpoint-notifications”,”ada-task-info”,”language-option”,”info-gdb-mi-command”,”undefined-command-error-code”,”exec-run-start-option”]
    -gdb-set disassembly-flavor intel
    ^error,msg=”No symbol \”disassembly\” in current context.”
    -gdb-set print demangle off
    ^done
    -break-insert -f main
    &”Function \”main\” not defined.\n”
    ^done,bkpt={number=”1″,type=”breakpoint”,disp=”keep”,enabled=”y”,addr=”<PENDING>”,pending=”main”,times=”0″,original-location=”main”}
    Warning: could not set a breakpoint on main. ‘Step into new instance’ will not work.
    -break-delete 1
    ^done
    target remote :3333
    &”target remote :3333\n”
    ~”Remote debugging using :3333\n”
    =thread-group-started,id=”i1″,pid=”42000″
    =thread-created,id=”1″,group-id=”i1″
    ~”0x4000dc4b in ?? ()\n”
    *stopped,frame={addr=”0x4000dc4b”,func=”??”,args=[]},thread-id=”1″,stopped-threads=”all”
    ^done
    info shared
    &”info shared\n”
    ~”No shared libraries loaded at this time.\n”
    ^done
    mon reset halt
    &”mon reset halt\n”
    @”TAP esp8266.cpu does not have IDCODE\n”
    @”xtensa_deassert_reset: ‘reset halt’ is not supported for Xtensa. Have halted some time after resetting (not the same thing!)\n”
    @”target state: halted\n”
    @”halted: PC: 0x40000013\n”
    @”debug cause: 0x20\n”
    ^done
    -exec-next-instruction
    ^running
    *running,thread-id=”all”
    @”xtensa_step: Timed out waiting for target to finish stepping.\n”
    ~”\nProgram”
    ~” stopped.\n”
    ~”0x40000013 in ?? ()\n”
    *stopped,reason=”signal-received”,signal-name=”0″,signal-meaning=”Signal 0″,frame={addr=”0x40000013″,func=”??”,args=[]},thread-id=”1″,stopped-threads=”all”
    set $com_sysprogs_esp8266_wdcfg=0
    &”set $com_sysprogs_esp8266_wdcfg=0\n”
    ^done
    set $vecbase=0x40000000
    &”set $vecbase=0x40000000\n”
    ^done
    set *(0x3fffc200)=0
    &”set *(0x3fffc200)=0\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fffc200″,len=”0x4″
    ^done
    set $ccompare=0
    &”set $ccompare=0\n”
    ^done
    set $intclear=-1
    &”set $intclear=-1\n”
    ^done
    set $intenable=0
    &”set $intenable=0\n”
    ^done
    set $eps2=0x20
    &”set $eps2=0x20\n”
    ^done
    set $icountlevel=0
    &”set $icountlevel=0\n”
    ^done
    print *((int *)0x60000900)
    &”print *((int *)0x60000900)\n”
    ~”$1 = 0″
    ~”\n”
    ^done
    set *((int *)0x60000900)=0
    &”set *((int *)0x60000900)=0\n”
    =memory-changed,thread-group=”i1″,addr=”0x60000900″,len=”0x4″
    ^done
    restore C:/SysGCC/esp8266/esp8266-bsp/sysprogs/flashprog/ESP8266FlashProg.bin binary 0x40100000 0 0x1a4
    &”restore C:/SysGCC/esp8266/esp8266-bsp/sysprogs/flashprog/ESP8266FlashProg.bin binary 0x40100000 0 0x1a4\n”
    ~”Restoring binary file C:/SysGCC/esp8266/esp8266-bsp/sysprogs/flashprog/ESP8266FlashProg.bin into memory (0x40100000 to 0x401001a4)\n”
    ^done
    flushregs
    &”flushregs\n”
    ~”Register cache flushed.\n”
    ^done
    set $epc2=0x40100074
    &”set $epc2=0x40100074\n”
    ^done
    set $ps=0x20
    &”set $ps=0x20\n”
    ^done
    set $sp=0x3fffc000
    &”set $sp=0x3fffc000\n”
    ^done
    set *((unsigned *)0x3fff8008)=0
    &”set *((unsigned *)0x3fff8008)=0\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8008″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff800c)=4096
    &”set *((unsigned *)0x3fff800c)=4096\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff800c”,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8010)=4096
    &”set *((unsigned *)0x3fff8010)=4096\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8010″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8014)=4294967295
    &”set *((unsigned *)0x3fff8014)=4294967295\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8014″,len=”0x4″
    ^done
    set $intclear=-1
    &”set $intclear=-1\n”
    ^done
    set $intenable=0
    &”set $intenable=0\n”
    ^done
    set $eps2=0x20
    &”set $eps2=0x20\n”
    ^done
    set $icountlevel=0
    &”set $icountlevel=0\n”
    ^done
    -exec-continue
    ^running
    *running,thread-id=”all”
    ~”\nProgram”
    ~” received signal SIGTRAP, Trace/breakpoint trap.\n”
    ~”0x4010013c in ?? ()\n”
    *stopped,reason=”signal-received”,signal-name=”SIGTRAP”,signal-meaning=”Trace/breakpoint trap”,frame={addr=”0x4010013c”,func=”??”,args=[]},thread-id=”1″,stopped-threads=”all”
    -data-evaluate-expression “\*\(\(unsigned\ \*\)0x3fff8014\)”
    ^done,value=”0″
    flushregs
    &”flushregs\n”
    ~”Register cache flushed.\n”
    ^done
    set $epc2=0x40100074
    &”set $epc2=0x40100074\n”
    ^done
    set $ps=0x20
    &”set $ps=0x20\n”
    ^done
    set $sp=0x3fffc000
    &”set $sp=0x3fffc000\n”
    ^done
    set *((unsigned *)0x3fff8008)=1
    &”set *((unsigned *)0x3fff8008)=1\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8008″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff800c)=507904
    &”set *((unsigned *)0x3fff800c)=507904\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff800c”,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8010)=128
    &”set *((unsigned *)0x3fff8010)=128\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8010″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8014)=4294967295
    &”set *((unsigned *)0x3fff8014)=4294967295\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8014″,len=”0x4″
    ^done
    set $intclear=-1
    &”set $intclear=-1\n”
    ^done
    set $intenable=0
    &”set $intenable=0\n”
    ^done
    set $eps2=0x20
    &”set $eps2=0x20\n”
    ^done
    set $icountlevel=0
    &”set $icountlevel=0\n”
    ^done
    -exec-continue
    ^running
    *running,thread-id=”all”
    ~”\nProgram”
    ~” received signal SIGTRAP, Trace/breakpoint trap.\n”
    ~”0x4010013c in ?? ()\n”
    *stopped,reason=”signal-received”,signal-name=”SIGTRAP”,signal-meaning=”Trace/breakpoint trap”,frame={addr=”0x4010013c”,func=”??”,args=[]},thread-id=”1″,stopped-threads=”all”
    -data-evaluate-expression “\*\(\(unsigned\ \*\)0x3fff8014\)”
    ^done,value=”0″
    restore C:/SysGCC/esp8266/esp8266-bsp/IoT-SDK/bin/esp_init_data_default.bin binary 0x3ffe8008 0x0 0x80
    &”restore C:/SysGCC/esp8266/esp8266-bsp/IoT-SDK/bin/esp_init_data_default.bin binary 0x3ffe8008 0x0 0x80\n”
    ~”Restoring binary file C:/SysGCC/esp8266/esp8266-bsp/IoT-SDK/bin/esp_init_data_default.bin into memory (0x3ffe8008 to 0x3ffe8088)\n”
    ^done
    flushregs
    &”flushregs\n”
    ~”Register cache flushed.\n”
    ^done
    set $epc2=0x40100074
    &”set $epc2=0x40100074\n”
    ^done
    set $ps=0x20
    &”set $ps=0x20\n”
    ^done
    set $sp=0x3fffc000
    &”set $sp=0x3fffc000\n”
    ^done
    set *((unsigned *)0x3fff8008)=2
    &”set *((unsigned *)0x3fff8008)=2\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8008″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff800c)=507904
    &”set *((unsigned *)0x3fff800c)=507904\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff800c”,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8010)=128
    &”set *((unsigned *)0x3fff8010)=128\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8010″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8014)=4294967295
    &”set *((unsigned *)0x3fff8014)=4294967295\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8014″,len=”0x4″
    ^done
    set $intclear=-1
    &”set $intclear=-1\n”
    ^done
    set $intenable=0
    &”set $intenable=0\n”
    ^done
    set $eps2=0x20
    &”set $eps2=0x20\n”
    ^done
    set $icountlevel=0
    &”set $icountlevel=0\n”
    ^done
    -exec-continue
    ^running
    *running,thread-id=”all”
    ~”\nProgram”
    ~” received signal SIGTRAP, Trace/breakpoint trap.\n”
    ~”0x4010013c in ?? ()\n”
    *stopped,reason=”signal-received”,signal-name=”SIGTRAP”,signal-meaning=”Trace/breakpoint trap”,frame={addr=”0x4010013c”,func=”??”,args=[]},thread-id=”1″,stopped-threads=”all”
    -data-evaluate-expression “\*\(\(unsigned\ \*\)0x3fff8014\)”
    ^done,value=”0″
    flushregs
    &”flushregs\n”
    ~”Register cache flushed.\n”
    ^done
    set $epc2=0x40100074
    &”set $epc2=0x40100074\n”
    ^done
    set $ps=0x20
    &”set $ps=0x20\n”
    ^done
    set $sp=0x3fffc000
    &”set $sp=0x3fffc000\n”
    ^done
    set *((unsigned *)0x3fff8008)=1
    &”set *((unsigned *)0x3fff8008)=1\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8008″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff800c)=0
    &”set *((unsigned *)0x3fff800c)=0\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff800c”,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8010)=31024
    &”set *((unsigned *)0x3fff8010)=31024\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8010″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8014)=4294967295
    &”set *((unsigned *)0x3fff8014)=4294967295\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8014″,len=”0x4″
    ^done
    set $intclear=-1
    &”set $intclear=-1\n”
    ^done
    set $intenable=0
    &”set $intenable=0\n”
    ^done
    set $eps2=0x20
    &”set $eps2=0x20\n”
    ^done
    set $icountlevel=0
    &”set $icountlevel=0\n”
    ^done
    -exec-continue
    ^running
    *running,thread-id=”all”
    ~”\nProgram”
    ~” received signal SIGTRAP, Trace/breakpoint trap.\n”
    ~”0x4010013c in ?? ()\n”
    *stopped,reason=”signal-received”,signal-name=”SIGTRAP”,signal-meaning=”Trace/breakpoint trap”,frame={addr=”0x4010013c”,func=”??”,args=[]},thread-id=”1″,stopped-threads=”all”
    -data-evaluate-expression “\*\(\(unsigned\ \*\)0x3fff8014\)”
    ^done,value=”0″
    restore C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x00000.bin binary 0x3ffe8008 0x0 0x7930
    &”restore C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x00000.bin binary 0x3ffe8008 0x0 0x7930\n”
    ~”Restoring binary file C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x00000.bin into memory (0x3ffe8008 to 0x3ffef938)\n”
    ^done
    flushregs
    &”flushregs\n”
    ~”Register cache flushed.\n”
    ^done
    set $epc2=0x40100074
    &”set $epc2=0x40100074\n”
    ^done
    set $ps=0x20
    &”set $ps=0x20\n”
    ^done
    set $sp=0x3fffc000
    &”set $sp=0x3fffc000\n”
    ^done
    set *((unsigned *)0x3fff8008)=2
    &”set *((unsigned *)0x3fff8008)=2\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8008″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff800c)=0
    &”set *((unsigned *)0x3fff800c)=0\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff800c”,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8010)=31024
    &”set *((unsigned *)0x3fff8010)=31024\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8010″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8014)=4294967295
    &”set *((unsigned *)0x3fff8014)=4294967295\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8014″,len=”0x4″
    ^done
    set $intclear=-1
    &”set $intclear=-1\n”
    ^done
    set $intenable=0
    &”set $intenable=0\n”
    ^done
    set $eps2=0x20
    &”set $eps2=0x20\n”
    ^done
    set $icountlevel=0
    &”set $icountlevel=0\n”
    ^done
    -exec-continue
    ^running
    *running,thread-id=”all”
    ~”\nProgram”
    ~” received signal SIGTRAP, Trace/breakpoint trap.\n”
    ~”0x4010013c in ?? ()\n”
    *stopped,reason=”signal-received”,signal-name=”SIGTRAP”,signal-meaning=”Trace/breakpoint trap”,frame={addr=”0x4010013c”,func=”??”,args=[]},thread-id=”1″,stopped-threads=”all”
    -data-evaluate-expression “\*\(\(unsigned\ \*\)0x3fff8014\)”
    ^done,value=”0″
    flushregs
    &”flushregs\n”
    ~”Register cache flushed.\n”
    ^done
    set $epc2=0x40100074
    &”set $epc2=0x40100074\n”
    ^done
    set $ps=0x20
    &”set $ps=0x20\n”
    ^done
    set $sp=0x3fffc000
    &”set $sp=0x3fffc000\n”
    ^done
    set *((unsigned *)0x3fff8008)=1
    &”set *((unsigned *)0x3fff8008)=1\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8008″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff800c)=131072
    &”set *((unsigned *)0x3fff800c)=131072\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff800c”,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8010)=228187
    &”set *((unsigned *)0x3fff8010)=228187\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8010″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8014)=4294967295
    &”set *((unsigned *)0x3fff8014)=4294967295\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8014″,len=”0x4″
    ^done
    set $intclear=-1
    &”set $intclear=-1\n”
    ^done
    set $intenable=0
    &”set $intenable=0\n”
    ^done
    set $eps2=0x20
    &”set $eps2=0x20\n”
    ^done
    set $icountlevel=0
    &”set $icountlevel=0\n”
    ^done
    -exec-continue
    ^running
    *running,thread-id=”all”
    ~”\nProgram”
    ~” received signal SIGTRAP, Trace/breakpoint trap.\n”
    ~”0x4010013c in ?? ()\n”
    *stopped,reason=”signal-received”,signal-name=”SIGTRAP”,signal-meaning=”Trace/breakpoint trap”,frame={addr=”0x4010013c”,func=”??”,args=[]},thread-id=”1″,stopped-threads=”all”
    -data-evaluate-expression “\*\(\(unsigned\ \*\)0x3fff8014\)”
    ^done,value=”0″
    restore C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x20000.bin binary 0x3ffe8008 0x0 0x10000
    &”restore C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x20000.bin binary 0x3ffe8008 0x0 0x10000\n”
    ~”Restoring binary file C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x20000.bin into memory (0x3ffe8008 to 0x3fff8008)\n”
    ^done
    flushregs
    &”flushregs\n”
    ~”Register cache flushed.\n”
    ^done
    set $epc2=0x40100074
    &”set $epc2=0x40100074\n”
    ^done
    set $ps=0x20
    &”set $ps=0x20\n”
    ^done
    set $sp=0x3fffc000
    &”set $sp=0x3fffc000\n”
    ^done
    set *((unsigned *)0x3fff8008)=2
    &”set *((unsigned *)0x3fff8008)=2\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8008″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff800c)=131072
    &”set *((unsigned *)0x3fff800c)=131072\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff800c”,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8010)=65536
    &”set *((unsigned *)0x3fff8010)=65536\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8010″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8014)=4294967295
    &”set *((unsigned *)0x3fff8014)=4294967295\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8014″,len=”0x4″
    ^done
    set $intclear=-1
    &”set $intclear=-1\n”
    ^done
    set $intenable=0
    &”set $intenable=0\n”
    ^done
    set $eps2=0x20
    &”set $eps2=0x20\n”
    ^done
    set $icountlevel=0
    &”set $icountlevel=0\n”
    ^done
    -exec-continue
    ^running
    *running,thread-id=”all”
    ~”\nProgram”
    ~” received signal SIGTRAP, Trace/breakpoint trap.\n”
    ~”0x4010013c in ?? ()\n”
    *stopped,reason=”signal-received”,signal-name=”SIGTRAP”,signal-meaning=”Trace/breakpoint trap”,frame={addr=”0x4010013c”,func=”??”,args=[]},thread-id=”1″,stopped-threads=”all”
    -data-evaluate-expression “\*\(\(unsigned\ \*\)0x3fff8014\)”
    ^done,value=”0″
    restore C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x20000.bin binary 0x3ffd8008 0x10000 0x20000
    &”restore C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x20000.bin binary 0x3ffd8008 0x10000 0x20000\n”
    ~”Restoring binary file C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x20000.bin into memory (0x3ffe8008 to 0x3fff8008)\n”
    ^done
    flushregs
    &”flushregs\n”
    ~”Register cache flushed.\n”
    ^done
    set $epc2=0x40100074
    &”set $epc2=0x40100074\n”
    ^done
    set $ps=0x20
    &”set $ps=0x20\n”
    ^done
    set $sp=0x3fffc000
    &”set $sp=0x3fffc000\n”
    ^done
    set *((unsigned *)0x3fff8008)=2
    &”set *((unsigned *)0x3fff8008)=2\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8008″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff800c)=196608
    &”set *((unsigned *)0x3fff800c)=196608\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff800c”,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8010)=65536
    &”set *((unsigned *)0x3fff8010)=65536\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8010″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8014)=4294967295
    &”set *((unsigned *)0x3fff8014)=4294967295\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8014″,len=”0x4″
    ^done
    set $intclear=-1
    &”set $intclear=-1\n”
    ^done
    set $intenable=0
    &”set $intenable=0\n”
    ^done
    set $eps2=0x20
    &”set $eps2=0x20\n”
    ^done
    set $icountlevel=0
    &”set $icountlevel=0\n”
    ^done
    -exec-continue
    ^running
    *running,thread-id=”all”
    ~”\nProgram”
    ~” received signal SIGTRAP, Trace/breakpoint trap.\n”
    ~”0x4010013c in ?? ()\n”
    *stopped,reason=”signal-received”,signal-name=”SIGTRAP”,signal-meaning=”Trace/breakpoint trap”,frame={addr=”0x4010013c”,func=”??”,args=[]},thread-id=”1″,stopped-threads=”all”
    -data-evaluate-expression “\*\(\(unsigned\ \*\)0x3fff8014\)”
    ^done,value=”0″
    restore C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x20000.bin binary 0x3ffc8008 0x20000 0x30000
    &”restore C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x20000.bin binary 0x3ffc8008 0x20000 0x30000\n”
    ~”Restoring binary file C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x20000.bin into memory (0x3ffe8008 to 0x3fff8008)\n”
    ^done
    flushregs
    &”flushregs\n”
    ~”Register cache flushed.\n”
    ^done
    set $epc2=0x40100074
    &”set $epc2=0x40100074\n”
    ^done
    set $ps=0x20
    &”set $ps=0x20\n”
    ^done
    set $sp=0x3fffc000
    &”set $sp=0x3fffc000\n”
    ^done
    set *((unsigned *)0x3fff8008)=2
    &”set *((unsigned *)0x3fff8008)=2\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8008″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff800c)=262144
    &”set *((unsigned *)0x3fff800c)=262144\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff800c”,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8010)=65536
    &”set *((unsigned *)0x3fff8010)=65536\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8010″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8014)=4294967295
    &”set *((unsigned *)0x3fff8014)=4294967295\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8014″,len=”0x4″
    ^done
    set $intclear=-1
    &”set $intclear=-1\n”
    ^done
    set $intenable=0
    &”set $intenable=0\n”
    ^done
    set $eps2=0x20
    &”set $eps2=0x20\n”
    ^done
    set $icountlevel=0
    &”set $icountlevel=0\n”
    ^done
    -exec-continue
    ^running
    *running,thread-id=”all”
    ~”\nProgram”
    ~” received signal SIGTRAP, Trace/breakpoint trap.\n”
    ~”0x4010013c in ?? ()\n”
    *stopped,reason=”signal-received”,signal-name=”SIGTRAP”,signal-meaning=”Trace/breakpoint trap”,frame={addr=”0x4010013c”,func=”??”,args=[]},thread-id=”1″,stopped-threads=”all”
    -data-evaluate-expression “\*\(\(unsigned\ \*\)0x3fff8014\)”
    ^done,value=”0″
    restore C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x20000.bin binary 0x3ffb8008 0x30000 0x37b5b
    &”restore C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x20000.bin binary 0x3ffb8008 0x30000 0x37b5b\n”
    ~”Restoring binary file C:/Users/hes/Documents/visualGdb/Projects/NodeMCUDebugTest/VisualGDB/Debug/NodeMCUDebugTest-0x20000.bin into memory (0x3ffe8008 to 0x3ffefb63)\n”
    ^done
    flushregs
    &”flushregs\n”
    ~”Register cache flushed.\n”
    ^done
    set $epc2=0x40100074
    &”set $epc2=0x40100074\n”
    ^done
    set $ps=0x20
    &”set $ps=0x20\n”
    ^done
    set $sp=0x3fffc000
    &”set $sp=0x3fffc000\n”
    ^done
    set *((unsigned *)0x3fff8008)=2
    &”set *((unsigned *)0x3fff8008)=2\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8008″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff800c)=327680
    &”set *((unsigned *)0x3fff800c)=327680\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff800c”,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8010)=31580
    &”set *((unsigned *)0x3fff8010)=31580\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8010″,len=”0x4″
    ^done
    set *((unsigned *)0x3fff8014)=4294967295
    &”set *((unsigned *)0x3fff8014)=4294967295\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fff8014″,len=”0x4″
    ^done
    set $intclear=-1
    &”set $intclear=-1\n”
    ^done
    set $intenable=0
    &”set $intenable=0\n”
    ^done
    set $eps2=0x20
    &”set $eps2=0x20\n”
    ^done
    set $icountlevel=0
    &”set $icountlevel=0\n”
    ^done
    -exec-continue
    ^running
    *running,thread-id=”all”
    ~”\nProgram”
    ~” received signal SIGTRAP, Trace/breakpoint trap.\n”
    ~”0x4010013c in ?? ()\n”
    *stopped,reason=”signal-received”,signal-name=”SIGTRAP”,signal-meaning=”Trace/breakpoint trap”,frame={addr=”0x4010013c”,func=”??”,args=[]},thread-id=”1″,stopped-threads=”all”
    -data-evaluate-expression “\*\(\(unsigned\ \*\)0x3fff8014\)”
    ^done,value=”0″
    set $ps=0x20
    &”set $ps=0x20\n”
    ^done
    set $epc2=0x40000080
    &”set $epc2=0x40000080\n”
    ^done
    set $sp=0x3fffc000
    &”set $sp=0x3fffc000\n”
    ^done
    set $vecbase=0x40000000
    &”set $vecbase=0x40000000\n”
    ^done
    set *(0x3fffc200)=0
    &”set *(0x3fffc200)=0\n”
    =memory-changed,thread-group=”i1″,addr=”0x3fffc200″,len=”0x4″
    ^done
    set $intclear=-1
    &”set $intclear=-1\n”
    ^done
    set $intenable=0
    &”set $intenable=0\n”
    ^done
    set $eps2=0x20
    &”set $eps2=0x20\n”
    ^done
    set $icountlevel=0
    &”set $icountlevel=0\n”
    ^done
    Loaded image in 10126 ms
    -break-insert -h -f *0x40100004
    ^done,bkpt={number=”2″,type=”hw breakpoint”,disp=”keep”,enabled=”y”,addr=”0x40100004″,at=”<call_user_start>”,thread-groups=[“i1″],times=”0″,original-location=”*0x40100004″}
    mon xtensa_no_interrupts_during_steps on
    &”mon xtensa_no_interrupts_during_steps on\n”
    @”Interrupt suppression during single-stepping is now enabled\n”
    ^done
    mon esp8266_autofeed_watchdog on
    &”mon esp8266_autofeed_watchdog on\n”
    @”Watchdog feeding during stops is now enabled\n”
    ^done
    info target
    &”info target\n”
    ~”Symbols from \”C:\\Users\\hes\\Documents\\visualGdb\\Projects\\NodeMCUDebugTest\\VisualGDB\\Debug\\NodeMCUDebugTest\”.\n”
    ~”Remote serial target in gdb-specific protocol:\n”
    ~”Debugging a target over a serial line.\n”
    ~”\tWhile running this, GDB does not access memory from…\n”
    ~”Local exec file:\n”
    ~”\t`C:\\Users\\hes\\Documents\\visualGdb\\Projects\\NodeMCUDebugTest\\VisualGDB\\Debug\\NodeMCUDebugTest’, file type elf32-xtensa-le.\n”
    ~”\tEntry point: 0x40100004\n”
    ~”\t0x3ffe8000 – 0x3ffe839e is .data\n”
    ~”\t0x3ffe83a0 – 0x3ffe85f0 is .rodata\n”
    ~”\t0x3ffe85f0 – 0x3ffeef60 is .bss\n”
    ~”\t0x40100000 – 0x40107311 is .text\n”
    ~”\t0x40220000 – 0x40257b5b is .irom0.text\n”
    ^done
    -data-evaluate-expression “&_estack”
    ^error,msg=”No symbol \”_estack\” in current context.”
    -data-evaluate-expression “&__StackLimit”
    ^error,msg=”No symbol \”__StackLimit\” in current context.”
    Cannot resolve the address of _estack. Skipping stack pointer validity check.
    set *((int *)0x60000900)=$com_sysprogs_esp8266_wdcfg
    &”set *((int *)0x60000900)=$com_sysprogs_esp8266_wdcfg\n”
    =memory-changed,thread-group=”i1″,addr=”0x60000900″,len=”0x4″
    ^done
    -exec-continue
    ^running
    *running,thread-id=”all”
    ~”\nProgram”
    ~” received signal SIGTRAP, Trace/breakpoint trap.\n”
    ~”0x4000dc4b in ?? ()\n”
    *stopped,reason=”signal-received”,signal-name=”SIGTRAP”,signal-meaning=”Trace/breakpoint trap”,frame={addr=”0x4000dc4b”,func=”??”,args=[]},thread-id=”1″,stopped-threads=”all”
    -break-delete 2
    ^done
    set $com_sysprogs_esp8266_wdcfg=*((int *)0x60000900)
    &”set $com_sysprogs_esp8266_wdcfg=*((int *)0x60000900)\n”
    ^done
    set *((int *)0x60000900)=0
    &”set *((int *)0x60000900)=0\n”
    =memory-changed,thread-group=”i1″,addr=”0x60000900″,len=”0x4″
    ^done
    -stack-list-frames –thread 1
    ^done,stack=[frame={level=”0″,addr=”0x4000dc4b”,func=”??”},frame={level=”1″,addr=”0x3fffff98″,func=”??”}]
    -stack-list-arguments –thread 1 0
    ^done,stack-args=[frame={level=”0″,args=[]},frame={level=”1″,args=[]}]
    -data-evaluate-expression “sizeof(void *)”
    ^done,value=”4″
    -data-evaluate-expression “sizeof(int)”
    ^done,value=”4″
    -data-evaluate-expression “sizeof(short)”
    ^done,value=”2″
    -data-evaluate-expression “sizeof(long)”
    ^done,value=”4″
    -data-evaluate-expression “sizeof(long long)”
    ^done,value=”8″
    -data-evaluate-expression “sizeof(char)”
    ^done,value=”1″
    -data-evaluate-expression “sizeof(wchar_t)”
    ^error,msg=”No symbol \”wchar_t\” in current context.”
    -data-evaluate-expression “sizeof(float)”
    ^done,value=”4″
    -data-evaluate-expression “sizeof(double)”
    ^done,value=”8″
    -data-evaluate-expression “sizeof(long double)”
    ^done,value=”8″

    #11472
    support
    Keymaster

    Hi,

    This could be caused by incompatible FLASH settings or if VisualGDB had problems resetting the board. Can you confirm that the basic LEDBlink program shown in the tutorial gets programmed and the LED actually blinks after you restart the board manually?

    If yes, what happens if you press the reset button while the debug session is active, try resuming it and then set a breakpoint in the blinking loop?

    #11479
    luffy
    Participant

    Hi,

    no the LED doesn’t blink, even after restarting manually (does that mean the NodeMCU didn’t get programmed at all?).

    I also noticed that during the image loading, the activity LED blinks shortly at the beginning and at the end but not during the loading process!

    #11482
    support
    Keymaster

    Hi,

    Strange. Does the regular (non-JTAG) NodeMCU setup work as expected? If not, the module might simply be corrupt. If yes, what happens if you program the firmware via the gdb stub and then change the debug method to JTAG and select “do not program FLASH memory”?

    #11503
    luffy
    Participant

    Hi,

    no, the regular setup doesn’t work either. I can program the chip and it says the loading was successful but then nothing happens. I did try different chips with the same result.

    I can exclude the possibility of corrupted modules, because I had success programming and debugging them using sloeber.

    Which version of the NodeMCU was the tutorial  based on? (I tried both V2 and V3 but saw no difference). Also is it possible that Windows 10 or Visual Studio 2017 are somehow not compatible with the VisualGDB plugin? It’s just that I can’t think of any other difference to the setup used in the tutorial.

    #11533
    support
    Keymaster

    Hi,

    Just to double-check, the board works with the Arduino core, but not with C/C++ projects, right? If yes, please try experimenting with the FLASH settings (mode/speed/size) via VisualGDB Project Properties to see if there is a combination of settings (start with the slowest frequency, smallest FLASH size and the dio mode) that works with the board.

    #11542
    luffy
    Participant

    Yes that is correct.

    Thank you very much for the help. I changed the mode to “dio”, and it now works perfectly (both JTAG and regular setup).

    I left the other settings at default.

Viewing 11 posts - 1 through 11 (of 11 total)
  • You must be logged in to reply to this topic.