feat(idf_monitor): move idf_monitor to separate repo

This commit is contained in:
Peter Dragun 2023-01-16 13:44:37 +01:00
parent 4e2c6ac993
commit 3e3533f918
55 changed files with 27 additions and 5787 deletions

3
.gitignore vendored
View File

@ -61,9 +61,6 @@ tools/test_apps/**/build_*_*/
tools/test_apps/**/sdkconfig tools/test_apps/**/sdkconfig
tools/test_apps/**/sdkconfig.old tools/test_apps/**/sdkconfig.old
# IDF monitor test
tools/test_idf_monitor/outputs
TEST_LOGS TEST_LOGS
# gcov coverage reports # gcov coverage reports

View File

@ -146,18 +146,6 @@ test_certificate_bundle_on_host:
- cd components/mbedtls/esp_crt_bundle/test_gen_crt_bundle/ - cd components/mbedtls/esp_crt_bundle/test_gen_crt_bundle/
- ./test_gen_crt_bundle.py - ./test_gen_crt_bundle.py
test_idf_monitor:
extends: .host_test_template
artifacts:
# save artifacts always in order to access results which were retried without consequent failure
when: always
paths:
- tools/test_idf_monitor/outputs/*
expire_in: 1 week
script:
- eval $($IDF_PATH/tools/idf_tools.py export)
- cd ${IDF_PATH}/tools/test_idf_monitor
- ./run_test_idf_monitor.py
test_idf_size: test_idf_size:
extends: .host_test_template extends: .host_test_template

View File

@ -129,9 +129,7 @@
- "tools/esp_app_trace/**/*" - "tools/esp_app_trace/**/*"
- "tools/ldgen/**/*" - "tools/ldgen/**/*"
- "tools/idf_monitor_base/*"
- "tools/idf_monitor.py" - "tools/idf_monitor.py"
- "tools/test_idf_monitor/**/*"
- "tools/idf.py" - "tools/idf.py"
- "tools/idf_py_actions/**/*" - "tools/idf_py_actions/**/*"

View File

@ -11,14 +11,12 @@ repos:
# 1 - some file extensions # 1 - some file extensions
# 2 - any file matching *test*/*expected* (for host tests, if possible use this naming pattern always) # 2 - any file matching *test*/*expected* (for host tests, if possible use this naming pattern always)
# 3 - any directory named 'testdata' # 3 - any directory named 'testdata'
# 4 - IDF monitor test data # 4 - protobuf auto-generated files
# 5 - protobuf auto-generated files
exclude: &whitespace_excludes | exclude: &whitespace_excludes |
(?x)^( (?x)^(
.+\.(md|rst|map|bin)| .+\.(md|rst|map|bin)|
.+test.*\/.*expected.*| .+test.*\/.*expected.*|
.+\/testdata\/.+| .+\/testdata\/.+|
.+test_idf_monitor\/tests\/.+|
.*_pb2.py| .*_pb2.py|
.*.pb-c.h| .*.pb-c.h|
.*.pb-c.c| .*.pb-c.c|

View File

@ -89,7 +89,7 @@ You don't need to run `idf.py build` before running `idf.py flash`, `idf.py flas
## Viewing Serial Output ## Viewing Serial Output
The `idf.py monitor` target uses the [idf_monitor tool](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/idf-monitor.html) to display serial output from Espressif SoCs. idf_monitor also has a range of features to decode crash output and interact with the device. [Check the documentation page for details](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/idf-monitor.html). The `idf.py monitor` target uses the [esp-idf-monitor tool](https://github.com/espressif/esp-idf-monitor) to display serial output from Espressif SoCs. esp-idf-monitor also has a range of features to decode crash output and interact with the device. [Check the documentation page for details](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/idf-monitor.html).
Exit the monitor by typing Ctrl-]. Exit the monitor by typing Ctrl-].

View File

@ -18,7 +18,7 @@ endif()
set(ESPTOOLPY ${python} "$ENV{ESPTOOL_WRAPPER}" "${CMAKE_CURRENT_LIST_DIR}/esptool/esptool.py" --chip ${chip_model}) set(ESPTOOLPY ${python} "$ENV{ESPTOOL_WRAPPER}" "${CMAKE_CURRENT_LIST_DIR}/esptool/esptool.py" --chip ${chip_model})
set(ESPSECUREPY ${python} "${CMAKE_CURRENT_LIST_DIR}/esptool/espsecure.py") set(ESPSECUREPY ${python} "${CMAKE_CURRENT_LIST_DIR}/esptool/espsecure.py")
set(ESPEFUSEPY ${python} "${CMAKE_CURRENT_LIST_DIR}/esptool/espefuse.py") set(ESPEFUSEPY ${python} "${CMAKE_CURRENT_LIST_DIR}/esptool/espefuse.py")
set(ESPMONITOR ${python} "${idf_path}/tools/idf_monitor.py") set(ESPMONITOR ${python} -m esp_idf_monitor)
set(ESPTOOLPY_CHIP "${chip_model}") set(ESPTOOLPY_CHIP "${chip_model}")
if(NOT CONFIG_APP_BUILD_TYPE_RAM AND CONFIG_APP_BUILD_GENERATE_BINARIES) if(NOT CONFIG_APP_BUILD_TYPE_RAM AND CONFIG_APP_BUILD_GENERATE_BINARIES)

View File

@ -4,7 +4,7 @@ IDF Monitor
:link_to_translation:`zh_CN:[中文]` :link_to_translation:`zh_CN:[中文]`
IDF Monitor is mainly a serial terminal program which relays serial data to and from the target device's serial port. It also provides some IDF-specific features. IDF Monitor uses the esp-idf-monitor_ package as a serial terminal program which relays serial data to and from the target device's serial port. It also provides some IDF-specific features.
IDF Monitor can be launched from an IDF project by running ``idf.py monitor``. IDF Monitor can be launched from an IDF project by running ``idf.py monitor``.
@ -182,12 +182,12 @@ To decode each address, IDF Monitor runs the following command in the background
.. note:: .. note::
Set environment variable ``ESP_MONITOR_DECODE`` to ``0`` or call idf_monitor.py with specific command line option: ``idf_monitor.py --disable-address-decoding`` to disable address decoding. Set environment variable ``ESP_MONITOR_DECODE`` to ``0`` or call esp_idf_monitor with specific command line option: ``python -m esp_idf_monitor --disable-address-decoding`` to disable address decoding.
Target Reset on Connection Target Reset on Connection
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
By default, IDF Monitor will reset the target when connecting to it. The reset of the target chip is performed using the DTR and RTS serial lines. To prevent IDF Monitor from automatically resetting the target on connection, call IDF Monitor with the ``--no-reset`` option (e.g., ``idf_monitor.py --no-reset``). By default, IDF Monitor will reset the target when connecting to it. The reset of the target chip is performed using the DTR and RTS serial lines. To prevent IDF Monitor from automatically resetting the target on connection, call IDF Monitor with the ``--no-reset`` option (e.g., ``idf.py monitor --no-reset``).
.. note:: .. note::
@ -281,6 +281,7 @@ Issues Observed on Windows
- When "gdb" is run, it might stall for a short time before it begins communicating with the GDBStub. - When "gdb" is run, it might stall for a short time before it begins communicating with the GDBStub.
.. _addr2line: https://sourceware.org/binutils/docs/binutils/addr2line.html .. _addr2line: https://sourceware.org/binutils/docs/binutils/addr2line.html
.. _esp-idf-monitor: https://github.com/espressif/esp-idf-monitor
.. _gdb: https://sourceware.org/gdb/download/onlinedocs/ .. _gdb: https://sourceware.org/gdb/download/onlinedocs/
.. _pySerial: https://github.com/pyserial/pyserial .. _pySerial: https://github.com/pyserial/pyserial
.. _miniterm: https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.miniterm .. _miniterm: https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.miniterm

View File

@ -21,7 +21,7 @@ Line editing feature lets users compose commands by typing them, erasing symbols
.. note:: .. note::
This feature relies on ANSI escape sequence support in the terminal application. As such, serial monitors which display raw UART data can not be used together with the line editing library. If you see ``[6n`` or similar escape sequence when running :example:`system/console` example instead of a command prompt (e.g. ``esp>`` ), it means that the serial monitor does not support escape sequences. Programs which are known to work are GNU screen, minicom, and idf_monitor.py (which can be invoked using ``idf.py monitor`` from project directory). This feature relies on ANSI escape sequence support in the terminal application. As such, serial monitors which display raw UART data can not be used together with the line editing library. If you see ``[6n`` or similar escape sequence when running :example:`system/console` example instead of a command prompt (e.g. ``esp>`` ), it means that the serial monitor does not support escape sequences. Programs which are known to work are GNU screen, minicom, and esp-idf-monitor (which can be invoked using ``idf.py monitor`` from project directory).
Here is an overview of functions provided by `linenoise <https://github.com/antirez/linenoise>`_ library. Here is an overview of functions provided by `linenoise <https://github.com/antirez/linenoise>`_ library.

View File

@ -1,4 +1,4 @@
#!/usr/bin/env bash #!/usr/bin/env bash
cd build cd build
python $IDF_PATH/components/esptool_py/esptool/esptool.py -p $1 write_flash @flash_project_args python $IDF_PATH/components/esptool_py/esptool/esptool.py -p $1 write_flash @flash_project_args
python $IDF_PATH/tools/idf_monitor.py -p $1 idf_as_lib.elf python -m esp_idf_monitor -p $1 idf_as_lib.elf

View File

@ -129,7 +129,7 @@ esp32>
The ``initialize_console()`` function in the example configures some aspects of UART relevant to the operation of the console. The ``initialize_console()`` function in the example configures some aspects of UART relevant to the operation of the console.
- **Line Endings**: The default line endings are configured to match those expected/generated by common serial monitor programs, such as `screen`, `minicom`, and the `idf_monitor.py` included in the SDK. The default behavior for these commands are: - **Line Endings**: The default line endings are configured to match those expected/generated by common serial monitor programs, such as `screen`, `minicom`, and the `esp-idf-monitor` included in the SDK. The default behavior for these commands are:
- When 'enter' key is pressed on the keyboard, `CR` (0x13) code is sent to the serial device. - When 'enter' key is pressed on the keyboard, `CR` (0x13) code is sent to the serial device.
- To move the cursor to the beginning of the next line, serial device needs to send `CR LF` (0x13 0x10) sequence. - To move the cursor to the beginning of the next line, serial device needs to send `CR LF` (0x13 0x10) sequence.

View File

@ -1720,7 +1720,6 @@ tools/test_apps/system/panic/panic_tests.py
tools/test_apps/system/panic/test_panic_util/test_panic_util.py tools/test_apps/system/panic/test_panic_util/test_panic_util.py
tools/test_apps/system/startup/app_test.py tools/test_apps/system/startup/app_test.py
tools/test_apps/system/startup/main/test_startup_main.c tools/test_apps/system/startup/main/test_startup_main.c
tools/test_idf_monitor/dummy.c
tools/unit-test-app/components/test_utils/ccomp_timer.c tools/unit-test-app/components/test_utils/ccomp_timer.c
tools/unit-test-app/components/test_utils/include/ccomp_timer.h tools/unit-test-app/components/test_utils/include/ccomp_timer.h
tools/unit-test-app/components/test_utils/private_include/ccomp_timer_impl.h tools/unit-test-app/components/test_utils/private_include/ccomp_timer_impl.h

View File

@ -109,7 +109,6 @@ tools/mkuf2.py
tools/python_version_checker.py tools/python_version_checker.py
tools/set-submodules-to-github.sh tools/set-submodules-to-github.sh
tools/test_apps/system/no_embedded_paths/check_for_file_paths.py tools/test_apps/system/no_embedded_paths/check_for_file_paths.py
tools/test_idf_monitor/run_test_idf_monitor.py
tools/test_idf_py/test_hints.py tools/test_idf_py/test_hints.py
tools/test_idf_py/test_idf_py.py tools/test_idf_py/test_idf_py.py
tools/test_idf_size/test.sh tools/test_idf_size/test.sh

View File

@ -211,8 +211,6 @@ tools/test_apps/system/panic/app_test.py
tools/test_apps/system/panic/panic_tests.py tools/test_apps/system/panic/panic_tests.py
tools/test_apps/system/panic/test_panic_util/test_panic_util.py tools/test_apps/system/panic/test_panic_util/test_panic_util.py
tools/test_apps/system/startup/app_test.py tools/test_apps/system/startup/app_test.py
tools/test_idf_monitor/idf_monitor_wrapper.py
tools/test_idf_monitor/run_test_idf_monitor.py
tools/test_idf_py/extra_path/some_ext.py tools/test_idf_py/extra_path/some_ext.py
tools/test_idf_py/idf_ext.py tools/test_idf_py/idf_ext.py
tools/test_idf_py/test_idf_extensions/test_ext/test_extension.py tools/test_idf_py/test_idf_extensions/test_ext/test_extension.py

View File

@ -104,7 +104,7 @@ function(paths_with_spaces_to_list variable_name)
endfunction() endfunction()
# #
# Output the built components to the user. Generates files for invoking idf_monitor.py # Output the built components to the user. Generates files for invoking esp_idf_monitor
# that doubles as an overview of some of the more important build properties. # that doubles as an overview of some of the more important build properties.
# #
function(__project_info test_components) function(__project_info test_components)

370
tools/idf_monitor.py Executable file → Normal file
View File

@ -1,377 +1,11 @@
#!/usr/bin/env python
# #
# esp-idf serial output monitor tool. Does some helpful things: # SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
# - Looks up hex addresses in ELF file with addr2line
# - Reset ESP32 via serial RTS line (Ctrl-T Ctrl-R)
# - Run flash build target to rebuild and flash entire project (Ctrl-T Ctrl-F)
# - Run app-flash build target to rebuild and flash app only (Ctrl-T Ctrl-A)
# - If gdbstub output is detected, gdb is automatically loaded
# - If core dump output is detected, it is converted to a human-readable report
# by espcoredump.py.
# #
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0 # SPDX-License-Identifier: Apache-2.0
# #
# Contains elements taken from miniterm "Very simple serial terminal" which
# is part of pySerial. https://github.com/pyserial/pyserial
# (C)2002-2015 Chris Liechti <cliechti@gmx.net>
#
# Originally released under BSD-3-Clause license.
#
import codecs
import io
import os
import queue
import re
import shlex
import subprocess import subprocess
import sys import sys
import threading
import time
from typing import Any, List, Optional, Type, Union
import serial
import serial.tools.list_ports
# Windows console stuff
from idf_monitor_base.ansi_color_converter import get_converter
from idf_monitor_base.argument_parser import get_parser
from idf_monitor_base.console_parser import ConsoleParser
from idf_monitor_base.console_reader import ConsoleReader
from idf_monitor_base.constants import (CTRL_C, CTRL_H, DEFAULT_PRINT_FILTER, DEFAULT_TOOLCHAIN_PREFIX,
ESPPORT_ENVIRON, EVENT_QUEUE_TIMEOUT, GDB_EXIT_TIMEOUT,
GDB_UART_CONTINUE_COMMAND, LAST_LINE_THREAD_INTERVAL, MAKEFLAGS_ENVIRON,
PANIC_DECODE_DISABLE, PANIC_IDLE, TAG_CMD, TAG_KEY, TAG_SERIAL,
TAG_SERIAL_FLUSH)
from idf_monitor_base.coredump import COREDUMP_DECODE_INFO, CoreDump
from idf_monitor_base.exceptions import SerialStopException
from idf_monitor_base.gdbhelper import GDBHelper
from idf_monitor_base.line_matcher import LineMatcher
from idf_monitor_base.logger import Logger
from idf_monitor_base.output_helpers import normal_print, yellow_print
from idf_monitor_base.serial_handler import SerialHandler, SerialHandlerNoElf, run_make
from idf_monitor_base.serial_reader import LinuxReader, SerialReader
from idf_monitor_base.web_socket_client import WebSocketClient
from serial.tools import miniterm
key_description = miniterm.key_description
class Monitor:
"""
Monitor application base class.
This was originally derived from miniterm.Miniterm, but it turned out to be easier to write from scratch for this
purpose.
Main difference is that all event processing happens in the main thread, not the worker threads.
"""
def __init__(
self,
serial_instance, # type: serial.Serial
elf_file, # type: str
print_filter, # type: str
make='make', # type: str
encrypted=False, # type: bool
reset=True, # type: bool
toolchain_prefix=DEFAULT_TOOLCHAIN_PREFIX, # type: str
eol='CRLF', # type: str
decode_coredumps=COREDUMP_DECODE_INFO, # type: str
decode_panic=PANIC_DECODE_DISABLE, # type: str
target='esp32', # type: str
websocket_client=None, # type: Optional[WebSocketClient]
enable_address_decoding=True, # type: bool
timestamps=False, # type: bool
timestamp_format='', # type: str
force_color=False # type: bool
):
self.event_queue = queue.Queue() # type: queue.Queue
self.cmd_queue = queue.Queue() # type: queue.Queue
self.console = miniterm.Console()
# if the variable is set ANSI will be printed even if we do not print to terminal
sys.stderr = get_converter(sys.stderr, decode_output=True, force_color=force_color)
self.console.output = get_converter(self.console.output, force_color=force_color)
self.console.byte_output = get_converter(self.console.byte_output, force_color=force_color)
self.elf_file = elf_file or ''
self.elf_exists = os.path.exists(self.elf_file)
self.logger = Logger(self.elf_file, self.console, timestamps, timestamp_format, b'', enable_address_decoding,
toolchain_prefix)
self.coredump = CoreDump(decode_coredumps, self.event_queue, self.logger, websocket_client,
self.elf_file) if self.elf_exists else None
# allow for possibility the "make" arg is a list of arguments (for idf.py)
self.make = make if os.path.exists(make) else shlex.split(make) # type: Any[Union[str, List[str]], str]
self.target = target
# testing hook - data from serial can make exit the monitor
if isinstance(self, SerialMonitor):
socket_mode = serial_instance.port.startswith('socket://')
self.serial = serial_instance
self.serial_reader = SerialReader(self.serial, self.event_queue, reset)
self.gdb_helper = GDBHelper(toolchain_prefix, websocket_client, self.elf_file, self.serial.port,
self.serial.baudrate) if self.elf_exists else None
else:
socket_mode = False
self.serial = subprocess.Popen([self.elf_file], stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
self.serial_reader = LinuxReader(self.serial, self.event_queue)
self.gdb_helper = None
cls = SerialHandler if self.elf_exists else SerialHandlerNoElf
self.serial_handler = cls(b'', socket_mode, self.logger, decode_panic, PANIC_IDLE, b'', target,
False, False, self.serial, encrypted, reset, self.elf_file)
self.console_parser = ConsoleParser(eol)
self.console_reader = ConsoleReader(self.console, self.event_queue, self.cmd_queue, self.console_parser,
socket_mode)
self._line_matcher = LineMatcher(print_filter)
# internal state
self._invoke_processing_last_line_timer = None # type: Optional[threading.Timer]
def __enter__(self) -> None:
""" Use 'with self' to temporarily disable monitoring behaviour """
self.serial_reader.stop()
self.console_reader.stop()
def __exit__(self, exc_type, exc_val, exc_tb) -> None: # type: ignore
raise NotImplementedError
def run_make(self, target: str) -> None:
with self:
run_make(target, self.make, self.console, self.console_parser, self.event_queue, self.cmd_queue,
self.logger)
def _pre_start(self) -> None:
self.console_reader.start()
self.serial_reader.start()
def main_loop(self) -> None:
self._pre_start()
try:
while self.console_reader.alive and self.serial_reader.alive:
try:
self._main_loop()
except KeyboardInterrupt:
yellow_print('To exit from IDF monitor please use \"Ctrl+]\". Alternatively, you can use Ctrl-T Ctrl-X to exit.')
self.serial_write(codecs.encode(CTRL_C))
except SerialStopException:
normal_print('Stopping condition has been received\n')
except KeyboardInterrupt:
pass
finally:
try:
self.console_reader.stop()
self.serial_reader.stop()
self.logger.stop_logging()
# Cancelling _invoke_processing_last_line_timer is not
# important here because receiving empty data doesn't matter.
self._invoke_processing_last_line_timer = None
except Exception: # noqa
pass
normal_print('\n')
def serial_write(self, *args: str, **kwargs: str) -> None:
raise NotImplementedError
def check_gdb_stub_and_run(self, line: bytes) -> None:
raise NotImplementedError
def invoke_processing_last_line(self) -> None:
self.event_queue.put((TAG_SERIAL_FLUSH, b''), False)
def _main_loop(self) -> None:
try:
item = self.cmd_queue.get_nowait()
except queue.Empty:
try:
item = self.event_queue.get(timeout=EVENT_QUEUE_TIMEOUT)
except queue.Empty:
return
event_tag, data = item
if event_tag == TAG_CMD:
self.serial_handler.handle_commands(data, self.target, self.run_make, self.console_reader,
self.serial_reader)
elif event_tag == TAG_KEY:
self.serial_write(codecs.encode(data))
elif event_tag == TAG_SERIAL:
self.serial_handler.handle_serial_input(data, self.console_parser, self.coredump,
self.gdb_helper, self._line_matcher,
self.check_gdb_stub_and_run)
if self._invoke_processing_last_line_timer is not None:
self._invoke_processing_last_line_timer.cancel()
self._invoke_processing_last_line_timer = threading.Timer(LAST_LINE_THREAD_INTERVAL,
self.invoke_processing_last_line)
self._invoke_processing_last_line_timer.start()
# If no further data is received in the next short period
# of time then the _invoke_processing_last_line_timer
# generates an event which will result in the finishing of
# the last line. This is fix for handling lines sent
# without EOL.
# finalizing the line when coredump is in progress causes decoding issues
# the espcoredump loader uses empty line as a sign for end-of-coredump
# line is finalized only for non coredump data
elif event_tag == TAG_SERIAL_FLUSH:
self.serial_handler.handle_serial_input(data, self.console_parser, self.coredump,
self.gdb_helper, self._line_matcher,
self.check_gdb_stub_and_run,
finalize_line=not self.coredump or not self.coredump.in_progress)
else:
raise RuntimeError('Bad event data %r' % ((event_tag, data),))
class SerialMonitor(Monitor):
def __exit__(self, exc_type, exc_val, exc_tb) -> None: # type: ignore
""" Use 'with self' to temporarily disable monitoring behaviour """
self.console_reader.start()
if self.elf_exists:
self.serial_reader.gdb_exit = self.gdb_helper.gdb_exit # write gdb_exit flag
self.serial_reader.start()
def _pre_start(self) -> None:
super()._pre_start()
if self.elf_exists:
self.gdb_helper.gdb_exit = False
self.serial_handler.start_cmd_sent = False
def serial_write(self, *args: str, **kwargs: str) -> None:
self.serial: serial.Serial
try:
self.serial.write(*args, **kwargs)
except serial.SerialException:
pass # this shouldn't happen, but sometimes port has closed in serial thread
except UnicodeEncodeError:
pass # this can happen if a non-ascii character was passed, ignoring
def check_gdb_stub_and_run(self, line: bytes) -> None: # type: ignore # The base class one is a None value
if self.gdb_helper and self.gdb_helper.check_gdb_stub_trigger(line):
with self: # disable console control
self.gdb_helper.run_gdb()
def _main_loop(self) -> None:
if self.elf_exists and self.gdb_helper.gdb_exit:
self.gdb_helper.gdb_exit = False
time.sleep(GDB_EXIT_TIMEOUT)
# Continue the program after exit from the GDB
self.serial_write(codecs.encode(GDB_UART_CONTINUE_COMMAND))
self.serial_handler.start_cmd_sent = True
super()._main_loop()
class LinuxMonitor(Monitor):
def __exit__(self, exc_type, exc_val, exc_tb) -> None: # type: ignore
""" Use 'with self' to temporarily disable monitoring behaviour """
self.console_reader.start()
self.serial_reader.start()
def serial_write(self, *args: str, **kwargs: str) -> None:
self.serial.stdin.write(*args, **kwargs)
self.serial.stdin.flush()
def check_gdb_stub_and_run(self, line: bytes) -> None:
return # fake function for linux target
def main() -> None:
parser = get_parser()
args = parser.parse_args()
# The port name is changed in cases described in the following lines. Use a local argument and
# avoid the modification of args.port.
port = args.port
# GDB uses CreateFile to open COM port, which requires the COM name to be r'\\.\COMx' if the COM
# number is larger than 10
if os.name == 'nt' and port.startswith('COM'):
port = port.replace('COM', r'\\.\COM')
yellow_print('--- WARNING: GDB cannot open serial ports accessed as COMx')
yellow_print('--- Using %s instead...' % port)
elif port.startswith('/dev/tty.') and sys.platform == 'darwin':
port = port.replace('/dev/tty.', '/dev/cu.')
yellow_print('--- WARNING: Serial ports accessed as /dev/tty.* will hang gdb if launched.')
yellow_print('--- Using %s instead...' % port)
if isinstance(args.elf_file, io.BufferedReader):
elf_file = args.elf_file.name
args.elf_file.close() # don't need this as a file
else:
elf_file = args.elf_file
# remove the parallel jobserver arguments from MAKEFLAGS, as any
# parent make is only running 1 job (monitor), so we can re-spawn
# all of the child makes we need (the -j argument remains part of
# MAKEFLAGS)
try:
makeflags = os.environ[MAKEFLAGS_ENVIRON]
makeflags = re.sub(r'--jobserver[^ =]*=[0-9,]+ ?', '', makeflags)
os.environ[MAKEFLAGS_ENVIRON] = makeflags
except KeyError:
pass # not running a make jobserver
ws = WebSocketClient(args.ws) if args.ws else None
try:
cls: Type[Monitor]
if args.target == 'linux':
serial_instance = None
cls = LinuxMonitor
yellow_print('--- idf_monitor on linux ---')
else:
serial_instance = serial.serial_for_url(port, args.baud, do_not_open=True)
serial_instance.dtr = False
serial_instance.rts = False
# Pass the actual used port to callee of idf_monitor (e.g. idf.py/cmake) through `ESPPORT` environment
# variable.
# Note that the port must be original port argument without any replacement done in IDF Monitor (idf.py
# has a check for this).
# To make sure the key as well as the value are str type, by the requirements of subprocess
espport_val = str(args.port)
os.environ.update({ESPPORT_ENVIRON: espport_val})
cls = SerialMonitor
yellow_print('--- idf_monitor on {p.name} {p.baudrate} ---'.format(p=serial_instance))
monitor = cls(serial_instance,
elf_file,
args.print_filter,
args.make,
args.encrypted,
not args.no_reset,
args.toolchain_prefix,
args.eol,
args.decode_coredumps,
args.decode_panic,
args.target,
ws,
not args.disable_address_decoding,
args.timestamps,
args.timestamp_format,
args.force_color)
yellow_print('--- Quit: {} | Menu: {} | Help: {} followed by {} ---'.format(
key_description(monitor.console_parser.exit_key),
key_description(monitor.console_parser.menu_key),
key_description(monitor.console_parser.menu_key),
key_description(CTRL_H)))
if args.print_filter != DEFAULT_PRINT_FILTER:
yellow_print('--- Print filter: {} ---'.format(args.print_filter))
monitor.main_loop()
except KeyboardInterrupt:
pass
finally:
if ws:
ws.close()
if __name__ == '__main__': if __name__ == '__main__':
main() sys.exit(subprocess.run([sys.executable, '-m', 'esp_idf_monitor'] + sys.argv[1:]).returncode)

View File

@ -1,120 +0,0 @@
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import ctypes
import os
import re
import sys
from io import TextIOBase
from typing import Any, Optional, TextIO, Union
from .output_helpers import ANSI_NORMAL
STD_OUTPUT_HANDLE = -11
STD_ERROR_HANDLE = -12
# wincon.h values
FOREGROUND_INTENSITY = 8
FOREGROUND_GREY = 7
# matches the ANSI color change sequences that IDF sends
RE_ANSI_COLOR = re.compile(b'\033\\[([01]);3([0-7])m')
# list mapping the 8 ANSI colors (the indexes) to Windows Console colors
ANSI_TO_WINDOWS_COLOR = [0, 4, 2, 6, 1, 5, 3, 7]
if os.name == 'nt':
GetStdHandle = ctypes.windll.kernel32.GetStdHandle # type: ignore
SetConsoleTextAttribute = ctypes.windll.kernel32.SetConsoleTextAttribute # type: ignore
def get_converter(orig_output_method=None, decode_output=False, force_color=False):
# type: (Any[TextIO, Optional[TextIOBase]], bool, bool) -> Union[ANSIColorConverter, Optional[TextIOBase]]
"""
Returns an ANSIColorConverter on Windows and the original output method (orig_output_method) on other platforms.
The ANSIColorConverter with decode_output=True will decode the bytes before passing them to the output
The ANSIColorConverter with force_color=True will be forced to convert ANSI in windows format
"""
if os.name == 'nt':
return ANSIColorConverter(orig_output_method, decode_output, force_color)
return orig_output_method
class ANSIColorConverter(object):
"""Class to wrap a file-like output stream, intercept ANSI color codes,
and convert them into calls to Windows SetConsoleTextAttribute.
Doesn't support all ANSI terminal code escape sequences, only the sequences IDF uses.
Ironically, in Windows this console output is normally wrapped by winpty which will then detect the console text
color changes and convert these back to ANSI color codes for MSYS' terminal to display. However this is the
least-bad working solution, as winpty doesn't support any "passthrough" mode for raw output.
"""
def __init__(self, output=None, decode_output=False, force_color=False):
# type: (TextIOBase, bool, bool) -> None
self.output = output
self.decode_output = decode_output
self.handle = GetStdHandle(STD_ERROR_HANDLE if self.output == sys.stderr else STD_OUTPUT_HANDLE)
self.matched = b''
self.force_color = force_color # always print ANSI for colors if true
def _output_write(self, data): # type: (Union[str, bytes]) -> None
try:
if self.decode_output:
self.output.write(data.decode()) # type: ignore
else:
self.output.write(data) # type: ignore
except (IOError, OSError):
# Windows 10 bug since the Fall Creators Update, sometimes writing to console randomly throws
# an exception (however, the character is still written to the screen)
# Ref https://github.com/espressif/esp-idf/issues/1163
#
# Also possible for Windows to throw an OSError error if the data is invalid for the console
# (garbage bytes, etc)
pass
except UnicodeDecodeError:
# In case of double byte Unicode characters display '?'
self.output.write('?') # type: ignore
def write(self, data): # type: ignore
if isinstance(data, bytes):
data = bytearray(data)
else:
data = bytearray(data, 'utf-8')
for b in data:
b = bytes([b])
length = len(self.matched)
if b == b'\033': # ESC
self._output_write(self.matched)
self.matched = b
elif (length == 1 and b == b'[') or (1 < length < 7):
self.matched += b
if not self.force_color and self.matched == ANSI_NORMAL.encode('latin-1'): # reset console
# Flush is required only with Python3 - switching color before it is printed would mess up the console
self.flush()
SetConsoleTextAttribute(self.handle, FOREGROUND_GREY)
self.matched = b''
elif self.force_color or len(self.matched) == 7: # could be an ANSI sequence
m = re.match(RE_ANSI_COLOR, self.matched)
if m is not None:
color = ANSI_TO_WINDOWS_COLOR[int(m.group(2))]
if m.group(1) == b'1':
color |= FOREGROUND_INTENSITY
# Flush is required only with Python3 - switching color before it is printed would mess up the console
self.flush()
SetConsoleTextAttribute(self.handle, color)
else:
self._output_write(self.matched) # not an ANSI color code, display verbatim
self.matched = b''
else:
self._output_write(b)
self.matched = b''
def flush(self): # type: () -> None
try:
self.output.flush() # type: ignore
except OSError:
# Account for Windows Console refusing to accept garbage bytes (serial noise, etc)
pass

View File

@ -1,123 +0,0 @@
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import argparse
import os
from .constants import DEFAULT_PRINT_FILTER, DEFAULT_TOOLCHAIN_PREFIX, PANIC_DECODE_BACKTRACE, PANIC_DECODE_DISABLE
from .coredump import COREDUMP_DECODE_DISABLE, COREDUMP_DECODE_INFO
def get_parser(): # type: () -> argparse.ArgumentParser
parser = argparse.ArgumentParser('idf_monitor - a serial output monitor for esp-idf')
parser.add_argument(
'--port', '-p',
help='Serial port device',
default=os.environ.get('ESPTOOL_PORT', '/dev/ttyUSB0')
)
parser.add_argument(
'--no-reset',
help='Do not reset the chip on monitor startup',
action='store_true'
)
parser.add_argument(
'--disable-address-decoding', '-d',
help="Don't print lines about decoded addresses from the application ELF file",
action='store_true',
default=os.getenv('ESP_MONITOR_DECODE') == '0'
)
parser.add_argument(
'--baud', '-b',
help='Serial port baud rate',
type=int,
default=os.getenv('IDF_MONITOR_BAUD', os.getenv('MONITORBAUD', 115200)))
parser.add_argument(
'--make', '-m',
help='Command to run make',
type=str, default='make')
parser.add_argument(
'--encrypted',
help='Use encrypted targets while running make',
action='store_true')
parser.add_argument(
'--toolchain-prefix',
help='Triplet prefix to add before cross-toolchain names',
default=DEFAULT_TOOLCHAIN_PREFIX)
parser.add_argument(
'--eol',
choices=['CR', 'LF', 'CRLF'],
type=lambda c: c.upper(),
help='End of line to use when sending to the serial port',
default='CR')
parser.add_argument(
'elf_file', help='ELF file of application',
type=lambda f: open(f, 'rb') if os.path.exists(f) else f'{f}',
nargs='?'
)
parser.add_argument(
'--print_filter',
help='Filtering string',
default=DEFAULT_PRINT_FILTER)
parser.add_argument(
'--decode-coredumps',
choices=[COREDUMP_DECODE_INFO, COREDUMP_DECODE_DISABLE],
default=COREDUMP_DECODE_INFO,
help='Handling of core dumps found in serial output'
)
parser.add_argument(
'--decode-panic',
choices=[PANIC_DECODE_BACKTRACE, PANIC_DECODE_DISABLE],
default=PANIC_DECODE_DISABLE,
help='Handling of panic handler info found in serial output'
)
parser.add_argument(
'--target',
help='Target name (used when stack dump decoding is enabled)',
default=os.environ.get('IDF_TARGET', 'esp32')
)
parser.add_argument(
'--revision',
help='Revision of the target',
type=int,
default=0
)
parser.add_argument(
'--ws',
default=os.environ.get('ESP_IDF_MONITOR_WS', None),
help='WebSocket URL for communicating with IDE tools for debugging purposes'
)
parser.add_argument(
'--timestamps',
help='Add timestamp for each line',
default=False,
action='store_true')
parser.add_argument(
'--timestamp-format',
default=os.environ.get('ESP_IDF_MONITOR_TIMESTAMP_FORMAT', '%Y-%m-%d %H:%M:%S'),
help='Set a strftime()-compatible timestamp format'
)
parser.add_argument(
'--force-color',
help='Always colored monitor output, even if output is redirected.',
default=False,
action='store_true')
return parser

View File

@ -1,59 +0,0 @@
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
#
# This file contains values (e.g. delay time, ...) that are different for each chip for a particular action.
# If adding a new device, set only values that are different from the default, e.g.:
# 'esp32s2': {
# 0: {
# 'reset': 0.35,
# }
# },
#
# for more information see the method "handle_commands" in idf_monitor.py
conf = {
# the default values were previously hardcoded in idf_monitor.py (taken from esptool.py)
'default': {
0: {
'reset': 0.2,
'enter_boot_set': 0.1,
'enter_boot_unset': 0.05,
}
},
'esp32': {
0: {
'reset': 0.2,
'enter_boot_set': 1.3,
'enter_boot_unset': 0.45,
},
100: {
'reset': 0.2,
'enter_boot_set': 0.1,
'enter_boot_unset': 0.05,
}
},
}
def get_chip_config(chip, revision=0):
# type: (str, int) -> dict
# If the config is not set in the `conf` dict for a specific chip, the `default` will be used.
# In case if only some values are specified, others are used from the `default`.
# If chip is set in `conf` but the specific revision R is missing,
# the values from highest revision lower than R are used.
# If some fields are missing, they will be taken from next lower revision or from the `default`.
default = dict(conf['default'][0])
rev_number = int(revision)
if chip not in conf.keys():
return default
chip_revisions = sorted(list(conf[chip].keys()), key=int)
for rev in chip_revisions:
if int(rev) > rev_number:
break
for key in conf[chip][rev].keys():
default[key] = conf[chip][rev][key]
return default

View File

@ -1,148 +0,0 @@
# SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import queue
import textwrap
from typing import Optional
from serial.tools import miniterm
from .constants import (CMD_APP_FLASH, CMD_ENTER_BOOT, CMD_MAKE, CMD_OUTPUT_TOGGLE, CMD_RESET, CMD_STOP,
CMD_TOGGLE_LOGGING, CMD_TOGGLE_TIMESTAMPS, CTRL_A, CTRL_F, CTRL_H, CTRL_I, CTRL_L, CTRL_P,
CTRL_R, CTRL_RBRACKET, CTRL_T, CTRL_X, CTRL_Y, TAG_CMD, TAG_KEY, __version__)
from .output_helpers import red_print
key_description = miniterm.key_description
def prompt_next_action(reason, console, console_parser, event_queue, cmd_queue):
# type: (str, miniterm.Console, ConsoleParser, queue.Queue, queue.Queue) -> None
console.setup() # set up console to trap input characters
try:
red_print('--- {}'.format(reason))
red_print(console_parser.get_next_action_text())
k = CTRL_T # ignore CTRL-T here, so people can muscle-memory Ctrl-T Ctrl-F, etc.
while k == CTRL_T:
k = console.getkey()
finally:
console.cleanup()
ret = console_parser.parse_next_action_key(k)
if ret is not None:
cmd = ret[1]
if cmd == CMD_STOP:
# the stop command should be handled last
event_queue.put(ret)
else:
cmd_queue.put(ret)
class ConsoleParser(object):
def __init__(self, eol='CRLF'): # type: (str) -> None
self.translate_eol = {
'CRLF': lambda c: c.replace('\n', '\r\n'),
'CR': lambda c: c.replace('\n', '\r'),
'LF': lambda c: c.replace('\r', '\n'),
}[eol]
self.menu_key = CTRL_T
self.exit_key = CTRL_RBRACKET
self._pressed_menu_key = False
def parse(self, key): # type: (str) -> Optional[tuple]
ret = None
if self._pressed_menu_key:
ret = self._handle_menu_key(key)
elif key == self.menu_key:
self._pressed_menu_key = True
elif key == self.exit_key:
ret = (TAG_CMD, CMD_STOP)
else:
key = self.translate_eol(key)
ret = (TAG_KEY, key)
return ret
def _handle_menu_key(self, c): # type: (str) -> Optional[tuple]
ret = None
if c == self.exit_key or c == self.menu_key: # send verbatim
ret = (TAG_KEY, c)
elif c in [CTRL_H, 'h', 'H', '?']:
red_print(self.get_help_text())
elif c == CTRL_R: # Reset device via RTS
ret = (TAG_CMD, CMD_RESET)
elif c == CTRL_F: # Recompile & upload
ret = (TAG_CMD, CMD_MAKE)
elif c in [CTRL_A, 'a', 'A']: # Recompile & upload app only
# "CTRL-A" cannot be captured with the default settings of the Windows command line, therefore, "A" can be used
# instead
ret = (TAG_CMD, CMD_APP_FLASH)
elif c == CTRL_Y: # Toggle output display
ret = (TAG_CMD, CMD_OUTPUT_TOGGLE)
elif c == CTRL_L: # Toggle saving output into file
ret = (TAG_CMD, CMD_TOGGLE_LOGGING)
elif c in [CTRL_I, 'i', 'I']: # Toggle printing timestamps
ret = (TAG_CMD, CMD_TOGGLE_TIMESTAMPS)
elif c == CTRL_P:
# to fast trigger pause without press menu key
ret = (TAG_CMD, CMD_ENTER_BOOT)
elif c in [CTRL_X, 'x', 'X']: # Exiting from within the menu
ret = (TAG_CMD, CMD_STOP)
else:
red_print('--- unknown menu character {} --'.format(key_description(c)))
self._pressed_menu_key = False
return ret
def get_help_text(self): # type: () -> str
text = """\
--- idf_monitor ({version}) - ESP-IDF monitor tool
--- based on miniterm from pySerial
---
--- {exit:8} Exit program
--- {menu:8} Menu escape key, followed by:
--- Menu keys:
--- {menu:14} Send the menu character itself to remote
--- {exit:14} Send the exit character itself to remote
--- {reset:14} Reset target board via RTS line
--- {makecmd:14} Build & flash project
--- {appmake:14} Build & flash app only
--- {output:14} Toggle output display
--- {log:14} Toggle saving output into file
--- {timestamps:14} Toggle printing timestamps
--- {pause:14} Reset target into bootloader to pause app via RTS line
--- {menuexit:14} Exit program
""".format(version=__version__,
exit=key_description(self.exit_key),
menu=key_description(self.menu_key),
reset=key_description(CTRL_R),
makecmd=key_description(CTRL_F),
appmake=key_description(CTRL_A) + ' (or A)',
output=key_description(CTRL_Y),
log=key_description(CTRL_L),
timestamps=key_description(CTRL_I) + ' (or I)',
pause=key_description(CTRL_P),
menuexit=key_description(CTRL_X) + ' (or X)')
return textwrap.dedent(text)
def get_next_action_text(self): # type: () -> str
text = """\
--- Press {} to exit monitor.
--- Press {} to build & flash project.
--- Press {} to build & flash app.
--- Press any other key to resume monitor (resets target).
""".format(key_description(self.exit_key),
key_description(CTRL_F),
key_description(CTRL_A))
return textwrap.dedent(text)
def parse_next_action_key(self, c): # type: (str) -> Optional[tuple]
ret = None
if c == self.exit_key:
ret = (TAG_CMD, CMD_STOP)
elif c == CTRL_F: # Recompile & upload
ret = (TAG_CMD, CMD_MAKE)
elif c in [CTRL_A, 'a', 'A']: # Recompile & upload app only
# "CTRL-A" cannot be captured with the default settings of the Windows command line, therefore, "A" can be used
# instead
ret = (TAG_CMD, CMD_APP_FLASH)
return ret

View File

@ -1,86 +0,0 @@
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import os
import queue
import time
from serial.tools.miniterm import Console
from .console_parser import ConsoleParser
from .constants import CMD_STOP, TAG_CMD
from .stoppable_thread import StoppableThread
class ConsoleReader(StoppableThread):
""" Read input keys from the console and push them to the queue,
until stopped.
"""
def __init__(self, console, event_queue, cmd_queue, parser, test_mode):
# type: (Console, queue.Queue, queue.Queue, ConsoleParser, bool) -> None
super(ConsoleReader, self).__init__()
self.console = console
self.event_queue = event_queue
self.cmd_queue = cmd_queue
self.parser = parser
self.test_mode = test_mode
def run(self):
# type: () -> None
self.console.setup()
try:
while self.alive:
try:
if os.name == 'nt':
# Windows kludge: because the console.cancel() method doesn't
# seem to work to unblock getkey() on the Windows implementation.
#
# So we only call getkey() if we know there's a key waiting for us.
import msvcrt
while not msvcrt.kbhit() and self.alive: # type: ignore
time.sleep(0.1)
if not self.alive:
break
elif self.test_mode:
# In testing mode the stdin is connected to PTY but is not used for input anything. For PTY
# the canceling by fcntl.ioctl isn't working and would hang in self.console.getkey().
# Therefore, we avoid calling it.
while self.alive:
time.sleep(0.1)
break
c = self.console.getkey()
except KeyboardInterrupt:
c = '\x03'
if c is not None:
ret = self.parser.parse(c)
if ret is not None:
(tag, cmd) = ret
# stop command should be executed last
if tag == TAG_CMD and cmd != CMD_STOP:
self.cmd_queue.put(ret)
else:
self.event_queue.put(ret)
finally:
self.console.cleanup()
def _cancel(self):
# type: () -> None
if os.name == 'posix' and not self.test_mode:
# this is the way cancel() is implemented in pyserial 3.3 or newer,
# older pyserial (3.1+) has cancellation implemented via 'select',
# which does not work when console sends an escape sequence response
#
# even older pyserial (<3.1) does not have this method
#
# on Windows there is a different (also hacky) fix, applied above.
#
# note that TIOCSTI is not implemented in WSL / bash-on-Windows.
# TODO: introduce some workaround to make it work there.
#
# Note: This would throw exception in testing mode when the stdin is connected to PTY.
import fcntl
import termios
fcntl.ioctl(self.console.fd, termios.TIOCSTI, b'\0')

View File

@ -1,77 +0,0 @@
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import os
import re
# Control-key characters
CTRL_A = '\x01'
CTRL_B = '\x02'
CTRL_C = '\x03'
CTRL_F = '\x06'
CTRL_H = '\x08'
CTRL_I = '\x09'
CTRL_R = '\x12'
CTRL_T = '\x14'
CTRL_Y = '\x19'
CTRL_P = '\x10'
CTRL_X = '\x18'
CTRL_L = '\x0c'
CTRL_RBRACKET = '\x1d' # Ctrl+]
# Command parsed from console inputs
CMD_STOP = 1
CMD_RESET = 2
CMD_MAKE = 3
CMD_APP_FLASH = 4
CMD_OUTPUT_TOGGLE = 5
CMD_TOGGLE_LOGGING = 6
CMD_ENTER_BOOT = 7
CMD_TOGGLE_TIMESTAMPS = 8
# Tags for tuples in queues
TAG_KEY = 0
TAG_SERIAL = 1
TAG_SERIAL_FLUSH = 2
TAG_CMD = 3
__version__ = '1.1'
# paths to scripts
PANIC_OUTPUT_DECODE_SCRIPT = os.path.join(os.path.dirname(__file__), '..', 'gdb_panic_server.py')
# regex matches an potential address
ADDRESS_RE = re.compile(r'0x[0-9a-f]{8}', re.IGNORECASE)
DEFAULT_TOOLCHAIN_PREFIX = 'xtensa-esp32-elf-'
DEFAULT_PRINT_FILTER = ''
# panic handler related messages
PANIC_START = r'Core \s*\d+ register dump:'
PANIC_END = b'ELF file SHA256:'
PANIC_STACK_DUMP = b'Stack memory:'
# panic handler decoding states
PANIC_IDLE = 0
PANIC_READING = 1
# panic handler decoding options
PANIC_DECODE_DISABLE = 'disable'
PANIC_DECODE_BACKTRACE = 'backtrace'
EVENT_QUEUE_TIMEOUT = 0.03 # timeout before raising queue.Empty exception in case of empty event queue
ESPPORT_ENVIRON = str('ESPPORT')
MAKEFLAGS_ENVIRON = 'MAKEFLAGS'
GDB_UART_CONTINUE_COMMAND = '+$c#63'
GDB_EXIT_TIMEOUT = 0.3 # time delay between exit and writing GDB_UART_CONTINUE_COMMAND
# workaround for data sent without EOL
# if no data received during the time, last line is considered finished
LAST_LINE_THREAD_INTERVAL = 0.1
MINIMAL_EN_LOW_DELAY = 0.005
RECONNECT_DELAY = 0.5 # timeout between reconnect tries
CHECK_ALIVE_FLAG_TIMEOUT = 0.25 # timeout for checking alive flags (currently used by serial reader)

View File

@ -1,132 +0,0 @@
# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import io
import os
import queue
import tempfile
from contextlib import contextmanager, redirect_stdout
from typing import Generator
from .constants import TAG_KEY
from .logger import Logger
from .output_helpers import yellow_print
from .web_socket_client import WebSocketClient
# coredump related messages
COREDUMP_UART_START = b'================= CORE DUMP START ================='
COREDUMP_UART_END = b'================= CORE DUMP END ================='
COREDUMP_UART_PROMPT = b'Press Enter to print core dump to UART...'
# coredump states
COREDUMP_IDLE = 0
COREDUMP_READING = 1
COREDUMP_DONE = 2
# coredump decoding options
COREDUMP_DECODE_DISABLE = 'disable'
COREDUMP_DECODE_INFO = 'info'
class CoreDump:
def __init__(self, decode_coredumps, event_queue, logger, websocket_client, elf_file):
# type: (str, queue.Queue, Logger, WebSocketClient, str) -> None
self._coredump_buffer = b''
self._decode_coredumps = decode_coredumps
self.event_queue = event_queue
self._reading_coredump = COREDUMP_IDLE
self.logger = logger
self.websocket_client = websocket_client
self.elf_file = elf_file
@property
def in_progress(self) -> bool:
return bool(self._coredump_buffer)
def _process_coredump(self): # type: () -> None
if self._decode_coredumps != COREDUMP_DECODE_INFO:
raise NotImplementedError('process_coredump: %s not implemented' % self._decode_coredumps)
coredump_file = None
# On Windows, the temporary file can't be read unless it is closed.
# Set delete=False and delete the file manually later.
with tempfile.NamedTemporaryFile(mode='wb', delete=False) as coredump_file:
coredump_file.write(self._coredump_buffer)
coredump_file.flush()
if self.websocket_client:
self.logger.output_enabled = True
yellow_print('Communicating through WebSocket')
self.websocket_client.send({'event': 'coredump',
'file': coredump_file.name,
'prog': self.elf_file})
yellow_print('Waiting for debug finished event')
self.websocket_client.wait([('event', 'debug_finished')])
yellow_print('Communications through WebSocket is finished')
else:
try:
import esp_coredump
except ImportError as e:
yellow_print('Failed to parse core dump info: '
'Module {} is not installed \n\n'.format(e.name))
self.logger.output_enabled = True
self.logger.print(COREDUMP_UART_START + b'\n')
self.logger.print(self._coredump_buffer)
# end line will be printed in handle_serial_input
else:
coredump = esp_coredump.CoreDump(core=coredump_file.name, core_format='b64', prog=self.elf_file)
f = io.StringIO()
with redirect_stdout(f):
coredump.info_corefile()
output = f.getvalue()
self.logger.output_enabled = True
self.logger.print(output.encode('utf-8'))
self.logger.output_enabled = False # Will be reenabled in check_coredump_trigger_after_print
if coredump_file is not None:
try:
os.unlink(coredump_file.name)
except OSError as e:
yellow_print('Couldn\'t remote temporary core dump file ({})'.format(e))
def _check_coredump_trigger_before_print(self, line): # type: (bytes) -> None
if self._decode_coredumps == COREDUMP_DECODE_DISABLE:
return
if COREDUMP_UART_PROMPT in line:
yellow_print('Initiating core dump!')
self.event_queue.put((TAG_KEY, '\n'))
return
if COREDUMP_UART_START in line:
yellow_print('Core dump started (further output muted)')
self._reading_coredump = COREDUMP_READING
self._coredump_buffer = b''
self.logger.output_enabled = False
return
if COREDUMP_UART_END in line:
self._reading_coredump = COREDUMP_DONE
yellow_print('\nCore dump finished!')
self._process_coredump()
return
if self._reading_coredump == COREDUMP_READING:
kb = 1024
buffer_len_kb = len(self._coredump_buffer) // kb
self._coredump_buffer += line.replace(b'\r', b'') + b'\n'
new_buffer_len_kb = len(self._coredump_buffer) // kb
if new_buffer_len_kb > buffer_len_kb:
yellow_print('Received %3d kB...' % new_buffer_len_kb, newline='\r')
def _check_coredump_trigger_after_print(self): # type: () -> None
if self._decode_coredumps == COREDUMP_DECODE_DISABLE:
return
# Re-enable output after the last line of core dump has been consumed
if not self.logger.output_enabled and self._reading_coredump == COREDUMP_DONE:
self._reading_coredump = COREDUMP_IDLE
self.logger.output_enabled = True
self._coredump_buffer = b''
@contextmanager
def check(self, line): # type: (bytes) -> Generator
self._check_coredump_trigger_before_print(line)
try:
yield
finally:
self._check_coredump_trigger_after_print()

View File

@ -1,8 +0,0 @@
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
class SerialStopException(Exception):
"""
This exception is used for stopping the IDF monitor in testing mode.
"""
pass

View File

@ -1,134 +0,0 @@
# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import os
import re
import subprocess
import sys
import tempfile
from .constants import PANIC_OUTPUT_DECODE_SCRIPT
from .logger import Logger
from .output_helpers import normal_print, red_print, yellow_print
from .web_socket_client import WebSocketClient
class GDBHelper:
def __init__(self, toolchain_prefix, websocket_client, elf_file, port, baud_rate):
# type: (str, WebSocketClient, str, int, int) -> None
self._gdb_buffer = b'' # type: bytes
self._gdb_exit = False # type: bool
self.toolchain_prefix = toolchain_prefix
self.websocket_client = websocket_client
self.elf_file = elf_file
self.port = port
self.baud_rate = baud_rate
@property
def gdb_buffer(self): # type: () -> bytes
return self._gdb_buffer
@gdb_buffer.setter
def gdb_buffer(self, value): # type: (bytes) -> None
self._gdb_buffer = value
@property
def gdb_exit(self): # type: () -> bool
return self._gdb_exit
@gdb_exit.setter
def gdb_exit(self, value): # type: (bool) -> None
self._gdb_exit = value
def run_gdb(self):
# type: () -> None
normal_print('')
try:
cmd = ['%sgdb' % self.toolchain_prefix,
'-ex', 'set serial baud %d' % self.baud_rate,
'-ex', 'target remote %s' % self.port,
self.elf_file]
# Here we handling GDB as a process
# Open GDB process
try:
process = subprocess.Popen(cmd, cwd='.')
except KeyboardInterrupt:
pass
# We ignore Ctrl+C interrupt form external process abd wait response util GDB will be finished.
while True:
try:
process.wait()
break
except KeyboardInterrupt:
pass # We ignore the Ctrl+C
self.gdb_exit = True
except OSError as e:
red_print('%s: %s' % (' '.join(cmd), e))
except KeyboardInterrupt:
pass # happens on Windows, maybe other OSes
finally:
try:
# on Linux, maybe other OSes, gdb sometimes seems to be alive even after wait() returns...
process.terminate()
except Exception: # noqa
pass
try:
# also on Linux, maybe other OSes, gdb sometimes exits uncleanly and breaks the tty mode
subprocess.call(['stty', 'sane'])
except Exception: # noqa
pass # don't care if there's no stty, we tried...
def check_gdb_stub_trigger(self, line):
# type: (bytes) -> bool
line = self.gdb_buffer + line
self.gdb_buffer = b''
m = re.search(b'\\$(T..)#(..)', line) # look for a gdb "reason" for a break
if m is not None:
try:
chsum = sum(ord(bytes([p])) for p in m.group(1)) & 0xFF
calc_chsum = int(m.group(2), 16)
except ValueError: # payload wasn't valid hex digits
return False
if chsum == calc_chsum:
if self.websocket_client:
yellow_print('Communicating through WebSocket')
self.websocket_client.send({'event': 'gdb_stub',
'port': self.port,
'prog': self.elf_file})
yellow_print('Waiting for debug finished event')
self.websocket_client.wait([('event', 'debug_finished')])
yellow_print('Communications through WebSocket is finished')
else:
return True
else:
red_print('Malformed gdb message... calculated checksum %02x received %02x' % (chsum, calc_chsum))
return False
def process_panic_output(self, panic_output, logger, target): # type: (bytes, Logger, str) -> None
panic_output_file = None
try:
# On Windows, the temporary file can't be read unless it is closed.
# Set delete=False and delete the file manually later.
with tempfile.NamedTemporaryFile(mode='wb', delete=False) as panic_output_file:
panic_output_file.write(panic_output)
panic_output_file.flush()
cmd = [self.toolchain_prefix + 'gdb',
'--batch', '-n',
self.elf_file,
'-ex', "target remote | \"{python}\" \"{script}\" --target {target} \"{output_file}\""
.format(python=sys.executable,
script=PANIC_OUTPUT_DECODE_SCRIPT,
target=target,
output_file=panic_output_file.name),
'-ex', 'bt']
output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
yellow_print('\nBacktrace:\n\n')
logger.print(output) # noqa: E999
except subprocess.CalledProcessError as e:
yellow_print('Failed to run gdb_panic_server.py script: {}\n{}\n\n'.format(e, e.output))
logger.print(panic_output)
finally:
if panic_output_file is not None:
try:
os.unlink(panic_output_file.name)
except OSError as e:
yellow_print('Couldn\'t remove temporary panic output file ({})'.format(e))

View File

@ -1,60 +0,0 @@
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import re
class LineMatcher(object):
"""
Assembles a dictionary of filtering rules based on the --print_filter
argument of idf_monitor. Then later it is used to match lines and
determine whether they should be shown on screen or not.
"""
LEVEL_N = 0
LEVEL_E = 1
LEVEL_W = 2
LEVEL_I = 3
LEVEL_D = 4
LEVEL_V = 5
level = {'N': LEVEL_N, 'E': LEVEL_E, 'W': LEVEL_W, 'I': LEVEL_I, 'D': LEVEL_D,
'V': LEVEL_V, '*': LEVEL_V, '': LEVEL_V}
def __init__(self, print_filter):
# type: (str) -> None
self._dict = dict()
self._re = re.compile(r'^(?:\033\[[01];?[0-9]+m?)?([EWIDV]) \([0-9]+\) ([^:]+): ')
items = print_filter.split()
if len(items) == 0:
self._dict['*'] = self.LEVEL_V # default is to print everything
for f in items:
s = f.split(r':')
if len(s) == 1:
# specifying no warning level defaults to verbose level
lev = self.LEVEL_V
elif len(s) == 2:
if len(s[0]) == 0:
raise ValueError('No tag specified in filter ' + f)
try:
lev = self.level[s[1].upper()]
except KeyError:
raise ValueError('Unknown warning level in filter ' + f)
else:
raise ValueError('Missing ":" in filter ' + f)
self._dict[s[0]] = lev
def match(self, line):
# type: (str) -> bool
try:
m = self._re.search(line)
if m:
lev = self.level[m.group(1)]
if m.group(2) in self._dict:
return self._dict[m.group(2)] >= lev
return self._dict.get('*', self.LEVEL_N) >= lev
except (KeyError, IndexError):
# Regular line written with something else than ESP_LOG*
# or an empty line.
pass
# We need something more than "*.N" for printing.
return self._dict.get('*', self.LEVEL_N) > self.LEVEL_N

View File

@ -1,127 +0,0 @@
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import datetime
import os
import re
from typing import BinaryIO, Callable, Optional, Union # noqa: F401
from serial.tools import miniterm # noqa: F401
from .constants import ADDRESS_RE
from .output_helpers import lookup_pc_address, red_print, yellow_print
from .pc_address_matcher import PcAddressMatcher
class Logger:
def __init__(self, elf_file, console, timestamps, timestamp_format, pc_address_buffer, enable_address_decoding,
toolchain_prefix):
# type: (str, miniterm.Console, bool, str, bytes, bool, str) -> None
self.log_file = None # type: Optional[BinaryIO]
self._output_enabled = True # type: bool
self.elf_file = elf_file
self.console = console
self.timestamps = timestamps
self.timestamp_format = timestamp_format
self._pc_address_buffer = pc_address_buffer
self.enable_address_decoding = enable_address_decoding
self.toolchain_prefix = toolchain_prefix
self.pc_address_matcher = PcAddressMatcher(self.elf_file) if enable_address_decoding else None
@property
def pc_address_buffer(self): # type: () -> bytes
return self._pc_address_buffer
@pc_address_buffer.setter
def pc_address_buffer(self, value): # type: (bytes) -> None
self._pc_address_buffer = value
@property
def output_enabled(self): # type: () -> bool
return self._output_enabled
@output_enabled.setter
def output_enabled(self, value): # type: (bool) -> None
self._output_enabled = value
@property
def log_file(self): # type: () -> Optional[BinaryIO]
return self._log_file
@log_file.setter
def log_file(self, value): # type: (Optional[BinaryIO]) -> None
self._log_file = value
def toggle_logging(self): # type: () -> None
if self._log_file:
self.stop_logging()
else:
self.start_logging()
def toggle_timestamps(self): # type: () -> None
self.timestamps = not self.timestamps
def start_logging(self): # type: () -> None
if not self._log_file:
name = 'log.{}.{}.txt'.format(os.path.splitext(os.path.basename(self.elf_file))[0],
datetime.datetime.now().strftime('%Y%m%d%H%M%S'))
try:
self.log_file = open(name, 'wb+')
yellow_print('\nLogging is enabled into file {}'.format(name))
except Exception as e: # noqa
red_print('\nLog file {} cannot be created: {}'.format(name, e))
def stop_logging(self): # type: () -> None
if self._log_file:
try:
name = self._log_file.name
self._log_file.close()
yellow_print('\nLogging is disabled and file {} has been closed'.format(name))
except Exception as e: # noqa
red_print('\nLog file cannot be closed: {}'.format(e))
finally:
self._log_file = None
def print(self, string, console_printer=None): # noqa: E999
# type: (Union[str, bytes], Optional[Callable]) -> None
if console_printer is None:
console_printer = self.console.write_bytes
if self.timestamps and (self._output_enabled or self._log_file):
t = datetime.datetime.now().strftime(self.timestamp_format)
# "string" is not guaranteed to be a full line. Timestamps should be only at the beginning of lines.
if isinstance(string, type(u'')):
search_patt = '\n'
replacement = '\n' + t + ' '
else:
search_patt = b'\n' # type: ignore
replacement = b'\n' + t.encode('ascii') + b' ' # type: ignore
string = string.replace(search_patt, replacement) # type: ignore
if self._output_enabled:
console_printer(string)
if self._log_file:
try:
if isinstance(string, type(u'')):
string = string.encode() # type: ignore
self._log_file.write(string) # type: ignore
except Exception as e:
red_print('\nCannot write to file: {}'.format(e))
# don't fill-up the screen with the previous errors (probably consequent prints would fail also)
self.stop_logging()
def output_toggle(self): # type: () -> None
self.output_enabled = not self.output_enabled
yellow_print('\nToggle output display: {}, Type Ctrl-T Ctrl-Y to show/disable output again.'.format(
self.output_enabled))
def handle_possible_pc_address_in_line(self, line): # type: (bytes) -> None
line = self._pc_address_buffer + line
self._pc_address_buffer = b''
if not self.enable_address_decoding:
return
for m in re.finditer(ADDRESS_RE, line.decode(errors='ignore')):
num = m.group()
if self.pc_address_matcher.is_executable_address(int(num, 16)):
translation = lookup_pc_address(num, self.toolchain_prefix, self.elf_file)
if translation:
self.print(translation, console_printer=yellow_print)

View File

@ -1,41 +0,0 @@
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import subprocess
import sys
from typing import BinaryIO, Callable, Optional, Union # noqa: F401
# ANSI terminal codes (if changed, regular expressions in LineMatcher need to be updated)
ANSI_RED = '\033[1;31m'
ANSI_YELLOW = '\033[0;33m'
ANSI_NORMAL = '\033[0m'
def color_print(message, color, newline='\n'): # type: (str, str, Optional[str]) -> None
""" Print a message to stderr with colored highlighting """
sys.stderr.write('%s%s%s%s' % (color, message, ANSI_NORMAL, newline))
sys.stderr.flush()
def normal_print(message): # type: (str) -> None
sys.stderr.write(ANSI_NORMAL + message)
def yellow_print(message, newline='\n'): # type: (str, Optional[str]) -> None
color_print(message, ANSI_YELLOW, newline)
def red_print(message, newline='\n'): # type: (str, Optional[str]) -> None
color_print(message, ANSI_RED, newline)
def lookup_pc_address(pc_addr, toolchain_prefix, elf_file): # type: (str, str, str) -> Optional[str]
cmd = ['%saddr2line' % toolchain_prefix, '-pfiaC', '-e', elf_file, pc_addr]
try:
translation = subprocess.check_output(cmd, cwd='.')
if b'?? ??:0' not in translation:
return translation.decode()
except OSError as e:
red_print('%s: %s' % (' '.join(cmd), e))
return None

View File

@ -1,60 +0,0 @@
# SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
from elftools.elf.constants import SH_FLAGS
from elftools.elf.elffile import ELFFile
class PcAddressMatcher(object):
"""
Class for detecting potential addresses which will consequently run through the external addr2line command to
identify and print information about it.
The input to this class is the path to the ELF file. Addresses of sections with executable flag are stored and
used later for lookup.
"""
def __init__(self, elf_path): # type: (str) -> None
self.intervals = []
try:
with open(elf_path, 'rb') as f:
# Is this an ELF file?
elf_magic = f.read(4)
if elf_magic != b'\x7fELF':
# Probably not an ELF file
# (could be Mach-O format on macOS, for example)
raise NotImplementedError()
f.seek(0)
elf = ELFFile(f)
for section in elf.iter_sections():
if section['sh_flags'] & SH_FLAGS.SHF_EXECINSTR:
start = section['sh_addr']
size = section['sh_size']
end = start + size
self.intervals.append((start, end))
except FileNotFoundError:
# ELF file is just an optional argument
pass
except NotImplementedError:
pass
# sort them in order to have faster lookup
self.intervals = sorted(self.intervals)
def is_executable_address(self, addr): # type: (int) -> bool
"""
Returns True/False if "addr" is in one of the ELF sections with executable flag set.
"""
for start, end in self.intervals:
if start > addr:
# The intervals are sorted. This means that loop can end because all remaining intervals starts are
# greater than the current start
return False
if start <= addr < end:
return True
return False

View File

@ -1,265 +0,0 @@
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import hashlib
import os
import queue # noqa: F401
import re
import subprocess
import time
from typing import Callable, Optional
import serial # noqa: F401
from serial.tools import miniterm # noqa: F401
from .chip_specific_config import get_chip_config
from .console_parser import ConsoleParser, prompt_next_action # noqa: F401
from .console_reader import ConsoleReader # noqa: F401
from .constants import (CMD_APP_FLASH, CMD_ENTER_BOOT, CMD_MAKE, CMD_OUTPUT_TOGGLE, CMD_RESET, CMD_STOP,
CMD_TOGGLE_LOGGING, CMD_TOGGLE_TIMESTAMPS, PANIC_DECODE_DISABLE, PANIC_END, PANIC_IDLE,
PANIC_READING, PANIC_STACK_DUMP, PANIC_START)
from .coredump import CoreDump
from .exceptions import SerialStopException
from .gdbhelper import GDBHelper
from .line_matcher import LineMatcher
from .logger import Logger
from .output_helpers import yellow_print
from .serial_reader import Reader
def get_sha256(filename, block_size=65536): # type: (str, int) -> str
sha256 = hashlib.sha256()
with open(filename, 'rb') as f:
for block in iter(lambda: f.read(block_size), b''):
sha256.update(block)
return sha256.hexdigest()
def run_make(target, make, console, console_parser, event_queue, cmd_queue, logger):
# type: (str, str, miniterm.Console, ConsoleParser, queue.Queue, queue.Queue, Logger) -> None
if isinstance(make, list):
popen_args = make + [target]
else:
popen_args = [make, target]
yellow_print('Running %s...' % ' '.join(popen_args))
p = subprocess.Popen(popen_args, env=os.environ)
try:
p.wait()
except KeyboardInterrupt:
p.wait()
if p.returncode != 0:
prompt_next_action('Build failed', console, console_parser, event_queue, cmd_queue)
else:
logger.output_enabled = True
class SerialHandler:
"""
The class is responsible for buffering serial input and performing corresponding commands.
"""
def __init__(self, last_line_part, serial_check_exit, logger, decode_panic, reading_panic, panic_buffer, target,
force_line_print, start_cmd_sent, serial_instance, encrypted, reset, elf_file):
# type: (bytes, bool, Logger, str, int, bytes,str, bool, bool, serial.Serial, bool, bool, str) -> None
self._last_line_part = last_line_part
self._serial_check_exit = serial_check_exit
self.logger = logger
self._decode_panic = decode_panic
self._reading_panic = reading_panic
self._panic_buffer = panic_buffer
self.target = target
self._force_line_print = force_line_print
self.start_cmd_sent = start_cmd_sent
self.serial_instance = serial_instance
self.encrypted = encrypted
self.reset = reset
self.elf_file = elf_file
def handle_serial_input(self, data, console_parser, coredump, gdb_helper, line_matcher,
check_gdb_stub_and_run, finalize_line=False):
# type: (bytes, ConsoleParser, CoreDump, Optional[GDBHelper], LineMatcher, Callable, bool) -> None
# Remove "+" after Continue command
if self.start_cmd_sent:
self.start_cmd_sent = False
pos = data.find(b'+')
if pos != -1:
data = data[(pos + 1):]
sp = data.split(b'\n')
if self._last_line_part != b'':
# add unprocessed part from previous "data" to the first line
sp[0] = self._last_line_part + sp[0]
self._last_line_part = b''
if sp[-1] != b'':
# last part is not a full line
self._last_line_part = sp.pop()
for line in sp:
if line == b'':
continue
if self._serial_check_exit and line == console_parser.exit_key.encode('latin-1'):
raise SerialStopException()
if gdb_helper:
self.check_panic_decode_trigger(line, gdb_helper)
with coredump.check(line):
if self._force_line_print or line_matcher.match(line.decode(errors='ignore')):
self.logger.print(line + b'\n')
self.compare_elf_sha256(line.decode(errors='ignore'))
self.logger.handle_possible_pc_address_in_line(line)
check_gdb_stub_and_run(line)
self._force_line_print = False
# Now we have the last part (incomplete line) in _last_line_part. By
# default we don't touch it and just wait for the arrival of the rest
# of the line. But after some time when we didn't received it we need
# to make a decision.
force_print_or_matched = any((
self._force_line_print,
(finalize_line and line_matcher.match(self._last_line_part.decode(errors='ignore')))
))
if self._last_line_part != b'' and force_print_or_matched:
self._force_line_print = True
self.logger.print(self._last_line_part)
self.logger.handle_possible_pc_address_in_line(self._last_line_part)
check_gdb_stub_and_run(self._last_line_part)
# It is possible that the incomplete line cuts in half the PC
# address. A small buffer is kept and will be used the next time
# handle_possible_pc_address_in_line is invoked to avoid this problem.
# ADDRESS_RE matches 10 character long addresses. Therefore, we
# keep the last 9 characters.
self.logger.pc_address_buffer = self._last_line_part[-9:]
# GDB sequence can be cut in half also. GDB sequence is 7
# characters long, therefore, we save the last 6 characters.
if gdb_helper:
gdb_helper.gdb_buffer = self._last_line_part[-6:]
self._last_line_part = b''
# else: keeping _last_line_part and it will be processed the next time
# handle_serial_input is invoked
def check_panic_decode_trigger(self, line, gdb_helper): # type: (bytes, GDBHelper) -> None
if self._decode_panic == PANIC_DECODE_DISABLE:
return
if self._reading_panic == PANIC_IDLE and re.search(PANIC_START, line.decode('ascii', errors='ignore')):
self._reading_panic = PANIC_READING
yellow_print('Stack dump detected')
if self._reading_panic == PANIC_READING and PANIC_STACK_DUMP in line:
self.logger.output_enabled = False
if self._reading_panic == PANIC_READING:
self._panic_buffer += line.replace(b'\r', b'') + b'\n'
if self._reading_panic == PANIC_READING and PANIC_END in line:
self._reading_panic = PANIC_IDLE
self.logger.output_enabled = True
gdb_helper.process_panic_output(self._panic_buffer, self.logger, self.target)
self._panic_buffer = b''
def compare_elf_sha256(self, line): # type: (str) -> None
elf_sha256_matcher = re.compile(
r'ELF file SHA256:\s+(?P<sha256_flashed>[a-z0-9]+)'
)
file_sha256_flashed_match = re.search(elf_sha256_matcher, line)
if not file_sha256_flashed_match:
return
file_sha256_flashed = file_sha256_flashed_match.group('sha256_flashed')
if not os.path.exists(self.elf_file):
yellow_print(f'ELF file not found. '
f"You need to build & flash the project before running 'monitor', "
f'and the binary on the device must match the one in the build directory exactly. ')
else:
file_sha256_build = get_sha256(self.elf_file)
if file_sha256_flashed not in f'{file_sha256_build}':
yellow_print(f'Warning: checksum mismatch between flashed and built applications. '
f'Checksum of built application is {file_sha256_build}')
def handle_commands(self, cmd, chip, run_make_func, console_reader, serial_reader):
# type: (int, str, Callable, ConsoleReader, Reader) -> None
config = get_chip_config(chip)
reset_delay = config['reset']
enter_boot_set = config['enter_boot_set']
enter_boot_unset = config['enter_boot_unset']
high = False
low = True
if chip == 'linux':
if cmd in [CMD_RESET,
CMD_MAKE,
CMD_APP_FLASH,
CMD_ENTER_BOOT]:
yellow_print('linux target does not support this command')
return
if cmd == CMD_STOP:
console_reader.stop()
serial_reader.stop()
elif cmd == CMD_RESET:
self.serial_instance.setRTS(low) # EN=LOW, chip in reset
self.serial_instance.setDTR(self.serial_instance.dtr) # usbser.sys workaround
time.sleep(reset_delay)
self.serial_instance.setRTS(high) # EN=HIGH, chip out of reset
self.serial_instance.setDTR(self.serial_instance.dtr) # usbser.sys workaround
self.logger.output_enabled = True
elif cmd == CMD_MAKE:
run_make_func('encrypted-flash' if self.encrypted else 'flash')
elif cmd == CMD_APP_FLASH:
run_make_func('encrypted-app-flash' if self.encrypted else 'app-flash')
elif cmd == CMD_OUTPUT_TOGGLE:
self.logger.output_toggle()
elif cmd == CMD_TOGGLE_LOGGING:
self.logger.toggle_logging()
elif cmd == CMD_TOGGLE_TIMESTAMPS:
self.logger.toggle_timestamps()
elif cmd == CMD_ENTER_BOOT:
yellow_print('Pause app (enter bootloader mode), press Ctrl-T Ctrl-R to restart')
self.serial_instance.setDTR(high) # IO0=HIGH
self.serial_instance.setRTS(low) # EN=LOW, chip in reset
self.serial_instance.setDTR(self.serial_instance.dtr) # usbser.sys workaround
time.sleep(enter_boot_set) # timeouts taken from esptool.py, includes esp32r0 workaround. defaults: 0.1
self.serial_instance.setDTR(low) # IO0=LOW
self.serial_instance.setRTS(high) # EN=HIGH, chip out of reset
self.serial_instance.setDTR(self.serial_instance.dtr) # usbser.sys workaround
time.sleep(enter_boot_unset) # timeouts taken from esptool.py, includes esp32r0 workaround. defaults: 0.05
self.serial_instance.setDTR(high) # IO0=HIGH, done
else:
raise RuntimeError('Bad command data %d' % cmd) # type: ignore
class SerialHandlerNoElf(SerialHandler):
# This method avoids using 'gdb_helper,' 'coredump' and 'handle_possible_pc_address_in_line'
# where the elf file is required to be passed
def handle_serial_input(self, data, console_parser, coredump, gdb_helper, line_matcher,
check_gdb_stub_and_run, finalize_line=False):
# type: (bytes, ConsoleParser, CoreDump, Optional[GDBHelper], LineMatcher, Callable, bool) -> None
if self.start_cmd_sent:
self.start_cmd_sent = False
pos = data.find(b'+')
if pos != -1:
data = data[(pos + 1):]
sp = data.split(b'\n')
if self._last_line_part != b'':
# add unprocessed part from previous "data" to the first line
sp[0] = self._last_line_part + sp[0]
self._last_line_part = b''
if sp[-1] != b'':
# last part is not a full line
self._last_line_part = sp.pop()
for line in sp:
if line == b'':
continue
if self._serial_check_exit and line == console_parser.exit_key.encode('latin-1'):
raise SerialStopException()
self.logger.print(line + b'\n')
self.compare_elf_sha256(line.decode(errors='ignore'))
self._force_line_print = False
force_print_or_matched = any((
self._force_line_print,
(finalize_line and line_matcher.match(self._last_line_part.decode(errors='ignore')))
))
if self._last_line_part != b'' and force_print_or_matched:
self._force_line_print = True
self.logger.print(self._last_line_part)

View File

@ -1,126 +0,0 @@
# SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import queue
import subprocess
import sys
import time
import serial
from .constants import CHECK_ALIVE_FLAG_TIMEOUT, MINIMAL_EN_LOW_DELAY, RECONNECT_DELAY, TAG_SERIAL
from .output_helpers import red_print, yellow_print
from .stoppable_thread import StoppableThread
class Reader(StoppableThread):
""" Output Reader base class """
class SerialReader(Reader):
""" Read serial data from the serial port and push to the
event queue, until stopped.
"""
def __init__(self, serial_instance, event_queue, reset):
# type: (serial.Serial, queue.Queue, bool) -> None
super(SerialReader, self).__init__()
self.baud = serial_instance.baudrate
self.serial = serial_instance
self.event_queue = event_queue
self.gdb_exit = False
self.reset = reset
if not hasattr(self.serial, 'cancel_read'):
# enable timeout for checking alive flag,
# if cancel_read not available
self.serial.timeout = CHECK_ALIVE_FLAG_TIMEOUT
def run(self):
# type: () -> None
if not self.serial.is_open:
self.serial.baudrate = self.baud
# We can come to this thread at startup or from external application line GDB.
# If we come from GDB we would like to continue to run without reset.
high = False
low = True
self.serial.dtr = low # Non reset state
self.serial.rts = high # IO0=HIGH
self.serial.dtr = self.serial.dtr # usbser.sys workaround
# Current state not reset the target!
self.serial.open()
if not self.gdb_exit and self.reset:
self.serial.dtr = high # Set dtr to reset state (affected by rts)
self.serial.rts = low # Set rts/dtr to the reset state
self.serial.dtr = self.serial.dtr # usbser.sys workaround
# Add a delay to meet the requirements of minimal EN low time (2ms for ESP32-C3)
time.sleep(MINIMAL_EN_LOW_DELAY)
elif not self.reset:
self.serial.setDTR(high) # IO0=HIGH, default state
self.gdb_exit = False
self.serial.rts = high # Set rts/dtr to the working state
self.serial.dtr = self.serial.dtr # usbser.sys workaround
try:
while self.alive:
try:
data = self.serial.read(self.serial.in_waiting or 1)
except (serial.serialutil.SerialException, IOError) as e:
data = b''
# self.serial.open() was successful before, therefore, this is an issue related to
# the disappearance of the device
red_print(e)
yellow_print('Waiting for the device to reconnect', newline='')
self.serial.close()
while self.alive: # so that exiting monitor works while waiting
try:
time.sleep(RECONNECT_DELAY)
if not self.reset:
self.serial.dtr = low # Non reset state
self.serial.rts = high # IO0=HIGH
self.serial.dtr = self.serial.dtr # usbser.sys workaround
self.serial.open()
break # device connected
except serial.serialutil.SerialException:
yellow_print('.', newline='')
sys.stderr.flush()
yellow_print('') # go to new line
if data:
self.event_queue.put((TAG_SERIAL, data), False)
finally:
self.serial.close()
def _cancel(self):
# type: () -> None
if hasattr(self.serial, 'cancel_read'):
try:
self.serial.cancel_read()
except Exception: # noqa
pass
class LinuxReader(Reader):
""" Read data from the subprocess that runs runnable and push to the
event queue, until stopped.
"""
def __init__(self, process, event_queue):
# type: (subprocess.Popen, queue.Queue) -> None
super().__init__()
self.proc = process
self.event_queue = event_queue
self._stdout = iter(self.proc.stdout.readline, b'') # type: ignore
def run(self): # type: () -> None
try:
while self.alive:
for line in self._stdout:
if line:
self.event_queue.put((TAG_SERIAL, line), False)
finally:
self.proc.terminate()
def _cancel(self): # type: () -> None
self.proc.terminate()

View File

@ -1,57 +0,0 @@
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import threading
from typing import Optional
class StoppableThread(object):
"""
Provide a Thread-like class which can be 'cancelled' via a subclass-provided
cancellation method.
Can be started and stopped multiple times.
Isn't an instance of type Thread because Python Thread objects can only be run once
"""
def __init__(self):
# type: () -> None
self._thread = None # type: Optional[threading.Thread]
@property
def alive(self):
# type: () -> bool
"""
Is 'alive' whenever the internal thread object exists
"""
return self._thread is not None
def start(self):
# type: () -> None
if self._thread is None:
self._thread = threading.Thread(target=self._run_outer)
self._thread.start()
def _cancel(self):
# type: () -> None
pass # override to provide cancellation functionality
def run(self):
# type: () -> None
pass # override for the main thread behaviour
def _run_outer(self):
# type: () -> None
try:
self.run()
finally:
self._thread = None
def stop(self):
# type: () -> None
if self._thread is not None:
old_thread = self._thread
self._thread = None
self._cancel()
old_thread.join()

View File

@ -1,98 +0,0 @@
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import json
import time
from .output_helpers import red_print, yellow_print
try:
import websocket
except ImportError:
# This is needed for IDE integration only.
pass
class WebSocketClient(object):
"""
WebSocket client used to advertise debug events to WebSocket server by sending and receiving JSON-serialized
dictionaries.
Advertisement of debug event:
{'event': 'gdb_stub', 'port': '/dev/ttyUSB1', 'prog': 'build/elf_file'} for GDB Stub, or
{'event': 'coredump', 'file': '/tmp/xy', 'prog': 'build/elf_file'} for coredump,
where 'port' is the port for the connected device, 'prog' is the full path to the ELF file and 'file' is the
generated coredump file.
Expected end of external debugging:
{'event': 'debug_finished'}
"""
RETRIES = 3
CONNECTION_RETRY_DELAY = 1
def __init__(self, url): # type: (str) -> None
self.url = url
self._connect()
def _connect(self): # type: () -> None
"""
Connect to WebSocket server at url
"""
self.close()
for _ in range(self.RETRIES):
try:
self.ws = websocket.create_connection(self.url)
break # success
except NameError:
raise RuntimeError('Please install the websocket_client package for IDE integration!')
except Exception as e: # noqa
red_print('WebSocket connection error: {}'.format(e))
time.sleep(self.CONNECTION_RETRY_DELAY)
else:
raise RuntimeError('Cannot connect to WebSocket server')
def close(self): # type: () -> None
try:
self.ws.close()
except AttributeError:
# Not yet connected
pass
except Exception as e: # noqa
red_print('WebSocket close error: {}'.format(e))
def send(self, payload_dict): # type: (dict) -> None
"""
Serialize payload_dict in JSON format and send it to the server
"""
for _ in range(self.RETRIES):
try:
self.ws.send(json.dumps(payload_dict))
yellow_print('WebSocket sent: {}'.format(payload_dict))
break
except Exception as e: # noqa
red_print('WebSocket send error: {}'.format(e))
self._connect()
else:
raise RuntimeError('Cannot send to WebSocket server')
def wait(self, expect_iterable): # type: (list) -> None
"""
Wait until a dictionary in JSON format is received from the server with all (key, value) tuples from
expect_iterable.
"""
for _ in range(self.RETRIES):
try:
r = self.ws.recv()
except Exception as e:
red_print('WebSocket receive error: {}'.format(e))
self._connect()
continue
obj = json.loads(r)
if all([k in obj and obj[k] == v for k, v in expect_iterable]):
yellow_print('WebSocket received: {}'.format(obj))
break
red_print('WebSocket expected: {}, received: {}'.format(dict(expect_iterable), obj))
else:
raise RuntimeError('Cannot receive from WebSocket server')

View File

@ -5,10 +5,9 @@ import json
import os import os
import signal import signal
import sys import sys
from typing import Any, Dict, List from typing import Any, Dict, List, Optional
import click import click
from idf_monitor_base.output_helpers import yellow_print
from idf_py_actions.global_options import global_options from idf_py_actions.global_options import global_options
from idf_py_actions.tools import (PropertyDict, RunTool, ensure_build_directory, get_default_serial_port, from idf_py_actions.tools import (PropertyDict, RunTool, ensure_build_directory, get_default_serial_port,
get_sdkconfig_value, run_target) get_sdkconfig_value, run_target)
@ -33,6 +32,12 @@ PORT = {
} }
def yellow_print(message, newline='\n'): # type: (str, Optional[str]) -> None
"""Print a message to stderr with yellow highlighting """
sys.stderr.write('%s%s%s%s' % ('\033[0;33m', message, '\033[0m', newline))
sys.stderr.flush()
def action_extensions(base_actions: Dict, project_path: str) -> Dict: def action_extensions(base_actions: Dict, project_path: str) -> Dict:
def _get_project_desc(ctx: click.core.Context, args: PropertyDict) -> Any: def _get_project_desc(ctx: click.core.Context, args: PropertyDict) -> Any:
desc_path = os.path.join(args.build_dir, 'project_description.json') desc_path = os.path.join(args.build_dir, 'project_description.json')
@ -81,7 +86,7 @@ def action_extensions(base_actions: Dict, project_path: str) -> Dict:
def monitor(action: str, ctx: click.core.Context, args: PropertyDict, print_filter: str, monitor_baud: str, encrypted: bool, def monitor(action: str, ctx: click.core.Context, args: PropertyDict, print_filter: str, monitor_baud: str, encrypted: bool,
no_reset: bool, timestamps: bool, timestamp_format: str, force_color: bool) -> None: no_reset: bool, timestamps: bool, timestamp_format: str, force_color: bool) -> None:
""" """
Run idf_monitor.py to watch build output Run esp_idf_monitor to watch build output
""" """
project_desc = _get_project_desc(ctx, args) project_desc = _get_project_desc(ctx, args)
elf_file = os.path.join(args.build_dir, project_desc['app_elf']) elf_file = os.path.join(args.build_dir, project_desc['app_elf'])

View File

@ -10,6 +10,7 @@ idf-component-manager
esp-coredump esp-coredump
esptool esptool
esp-idf-kconfig esp-idf-kconfig
esp-idf-monitor
# gdb extensions dependencies # gdb extensions dependencies
freertos_gdb freertos_gdb

View File

@ -12,11 +12,10 @@ from pytest_embedded import Dut
@pytest.mark.generic @pytest.mark.generic
@pytest.mark.supported_targets @pytest.mark.supported_targets
def test_monitor_addr_lookup(config: str, dut: Dut) -> None: def test_monitor_addr_lookup(config: str, dut: Dut) -> None:
# The port needs to be closed because idf_monitor.py will connect to it # The port needs to be closed because esp_idf_monitor will connect to it
dut.serial.stop_redirect_thread() dut.serial.stop_redirect_thread()
monitor_py = os.path.join(os.environ['IDF_PATH'], 'tools', 'idf_monitor.py') monitor_cmd = ' '.join([sys.executable, '-m', 'esp_idf_monitor', os.path.join(dut.app.binary_path, 'monitor_addr_lookup.elf'),
monitor_cmd = ' '.join([sys.executable, monitor_py, os.path.join(dut.app.binary_path, 'monitor_addr_lookup.elf'),
'--port', str(dut.serial.port)]) '--port', str(dut.serial.port)])
monitor_log_path = os.path.join(dut.logdir, 'monitor.txt') monitor_log_path = os.path.join(dut.logdir, 'monitor.txt')

View File

@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Unlicense OR CC0-1.0 # SPDX-License-Identifier: Unlicense OR CC0-1.0
import json import json
import logging import logging
@ -70,11 +70,10 @@ class WebSocketServer(object):
@pytest.mark.generic @pytest.mark.generic
@pytest.mark.parametrize('config', ['gdb_stub', 'coredump'], indirect=True) @pytest.mark.parametrize('config', ['gdb_stub', 'coredump'], indirect=True)
def test_monitor_ide_integration(config: str, dut: Dut) -> None: def test_monitor_ide_integration(config: str, dut: Dut) -> None:
# The port needs to be closed because idf_monitor.py will connect to it # The port needs to be closed because esp_idf_monitor will connect to it
dut.serial.stop_redirect_thread() dut.serial.stop_redirect_thread()
monitor_py = os.path.join(os.environ['IDF_PATH'], 'tools', 'idf_monitor.py') monitor_cmd = ' '.join([sys.executable, '-m', 'esp_idf_monitor', os.path.join(dut.app.binary_path, 'panic.elf'),
monitor_cmd = ' '.join([sys.executable, monitor_py, os.path.join(dut.app.binary_path, 'panic.elf'),
'--port', str(dut.serial.port), '--port', str(dut.serial.port),
'--ws', f'ws://{WebSocketServer.HOST}:{WebSocketServer.PORT}']) '--ws', f'ws://{WebSocketServer.HOST}:{WebSocketServer.PORT}'])
monitor_log_path = os.path.join(dut.logdir, 'monitor.txt') monitor_log_path = os.path.join(dut.logdir, 'monitor.txt')

View File

@ -1,28 +0,0 @@
# The purpose of this Makefile is to build dummy ELF files required to run idf_monitor tests.
# Make sure the toolchains are in the PATH:
PREFIX_XTENSA ?= xtensa-esp32-elf-
PREFIX_RISCV ?= riscv32-esp-elf-
PROG_XTENSA := dummy_xtensa.elf
PROG_RISCV := dummy_riscv.elf
CPPFLAGS_XTENSA := -DTASK_NAME_OFFSET=52
CPPFLAGS_RISCV := -DTASK_NAME_OFFSET=52
all: $(PROG_XTENSA) $(PROG_RISCV)
$(PROG_XTENSA): dummy.c
$(PREFIX_XTENSA)gcc $(CPPFLAGS_XTENSA) --specs=nosys.specs -o $@ -g $^
chmod -x $@
# ^ chmod is there so that we don't have to add ELF files to executables list
$(PROG_RISCV): dummy.c
$(PREFIX_RISCV)gcc $(CPPFLAGS_RISCV) --specs=nosys.specs -o $@ -g $^
chmod -x $@
clean:
rm -f $(PROG_XTENSA) $(PROG_RISCV)
.PHONY: clean all

View File

@ -1,8 +0,0 @@
# Project for testing the IDF monitor
Use `run_test_idf_monitor.py` in order to run the test.
New tests can be added into `test_list` of `run_test_idf_monitor.py` and placing the corresponding files into the
`tests` directory.
Note: The `idf_monitor` is tested with dummy ELF files. Run `make` to build the ELF files for supported architectures.

View File

@ -1,13 +0,0 @@
/* Produces a minimal ELF file for espcoredump tests */
typedef struct {
char stuff[TASK_NAME_OFFSET];
char pcTaskName[16];
} TCB_t;
TCB_t foo;
int main(void)
{
return 0;
}

View File

@ -1,60 +0,0 @@
# SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
from __future__ import unicode_literals
import argparse
import sys
import threading
import time
from io import open
import serial
try:
import idf_monitor
except ImportError:
sys.path.append('..')
import idf_monitor
def monitor_serial_reader_state(serial_reader, file_to_create):
"""
The purpose of this wrapper is to monitor the serial reader state of idf_monitor.py. file_to_create is created
after the serial reader thread has been started. The existence of this file will indicate to
run_test_idf_monitor.py that idf_monitor.py is ready to process inputs.
"""
while not serial_reader.serial.is_open or not serial_reader.alive:
time.sleep(1)
with open(file_to_create, 'w', encoding='utf-8'):
pass
def main():
parser = argparse.ArgumentParser('Wrapper for idf_monitor used for testing')
parser.add_argument('--port')
parser.add_argument('--print_filter')
parser.add_argument('--serial_alive_file')
parser.add_argument('--toolchain-prefix')
parser.add_argument('--decode-panic', default='disable')
parser.add_argument('--target', default=None)
parser.add_argument('--elf-file')
args = parser.parse_args()
serial_instance = serial.serial_for_url(args.port, 115200, do_not_open=True)
monitor = idf_monitor.SerialMonitor(serial_instance, args.elf_file, args.print_filter, 'make',
toolchain_prefix=args.toolchain_prefix, eol='CR',
decode_panic=args.decode_panic, target=args.target)
sys.stderr.write('Monitor instance has been created.\n')
monitor_thread = threading.Thread(target=monitor_serial_reader_state,
args=(monitor.serial_reader, args.serial_alive_file))
monitor_thread.start()
sys.stderr.write('Monitoring thread has been created.\n')
monitor.main_loop()
sys.stderr.write('Monitor loop exited.\n')
monitor_thread.join(60)
sys.stderr.write('Monitoring thread joined.\n')
if __name__ == '__main__':
main()

View File

@ -1,212 +0,0 @@
#!/usr/bin/env python
#
# SPDX-FileCopyrightText: 2018-2022 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import errno
import filecmp
import os
import pty
import re
import socket
import subprocess
import sys
import tempfile
import threading
import time
from io import open
XTENSA_ARGS = '--toolchain-prefix xtensa-esp32-elf-'
RISCV_ARGS = '--decode-panic backtrace --target esp32c3 --toolchain-prefix riscv32-esp-elf-'
test_list = (
# Add new tests here. All files should be placed in IN_DIR. Columns are
# Input file Filter string File with expected output Timeout ELF file Extra args
('in1.txt', '', 'in1f1.txt', 60, 'dummy_xtensa.elf', XTENSA_ARGS),
('in1.txt', '*:V', 'in1f1.txt', 60, 'dummy_xtensa.elf', XTENSA_ARGS),
('in1.txt', 'hello_world', 'in1f2.txt', 60, 'dummy_xtensa.elf', XTENSA_ARGS),
('in1.txt', '*:N', 'in1f3.txt', 60, 'dummy_xtensa.elf', XTENSA_ARGS),
('in2.txt', 'boot mdf_device_handle:I mesh:E vfs:I', 'in2f1.txt', 420, 'dummy_xtensa.elf', XTENSA_ARGS),
('in2.txt', 'vfs', 'in2f2.txt', 420, 'dummy_xtensa.elf', XTENSA_ARGS),
('core1.txt', '', 'core1_out.txt', 60, 'dummy_xtensa.elf', XTENSA_ARGS),
('riscv_panic1.txt', '', 'riscv_panic1_out.txt', 60, 'dummy_riscv.elf', RISCV_ARGS),
)
IN_DIR = 'tests/' # tests are in this directory
OUT_DIR = 'outputs/' # test results are written to this directory (kept only for debugging purposes)
ERR_OUT = 'monitor_error_output.'
IDF_MONITOR_WAPPER = 'idf_monitor_wrapper.py'
SERIAL_ALIVE_FILE = '/tmp/serial_alive' # the existence of this file signalize that idf_monitor is ready to receive
# connection related to communicating with idf_monitor through sockets
HOST = 'localhost'
# blocking socket operations are used with timeout:
SOCKET_TIMEOUT = 30
# the test is restarted after failure (idf_monitor has to be killed):
RETRIES_PER_TEST = 2
COREDUMP_VERSION_REGEX = r'espcoredump\.py v\d+\.[\d\w-]+(\.[\d\w-]+)?'
def remove_coredump_version_string(file_path):
with open(file_path, 'r') as file:
init_text = file.read()
modified_text = re.sub(COREDUMP_VERSION_REGEX, '', init_text, re.MULTILINE)
if not init_text != modified_text:
return None
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
temp_file.write(modified_text.encode())
return temp_file.name
def monitor_timeout(process):
if process.poll() is None:
# idf_monitor_wrapper is still running
try:
process.kill()
print('\tidf_monitor_wrapper was killed because it did not finish in time.')
except OSError as e:
if e.errno == errno.ESRCH:
# ignores a possible race condition which can occur when the process exits between poll() and kill()
pass
else:
raise
class TestRunner(object):
def __enter__(self):
self.serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.serversocket.bind((HOST, 0))
self.port = self.serversocket.getsockname()[1]
self.serversocket.listen(5)
return self
def __exit__(self, type, value, traceback):
try:
self.serversocket.shutdown(socket.SHUT_RDWR)
self.serversocket.close()
print('Socket was closed successfully')
except (OSError, socket.error):
pass
def accept_connection(self):
""" returns a socket for sending the input for idf_monitor which must be closed before calling this again. """
(clientsocket, address) = self.serversocket.accept()
# exception will be thrown here if the idf_monitor didn't connect in time
return clientsocket
def test_iteration(runner, test):
try:
# Make sure that the file doesn't exist. It will be recreated by idf_monitor_wrapper.py
os.remove(SERIAL_ALIVE_FILE)
except OSError:
pass
print('\nRunning test on {} with filter "{}" and expecting {}'.format(test[0], test[1], test[2]))
try:
with open(OUT_DIR + test[2], 'w', encoding='utf-8') as o_f, \
tempfile.NamedTemporaryFile(dir=OUT_DIR, prefix=ERR_OUT, mode='w', delete=False) as e_f:
monitor_cmd = [sys.executable, IDF_MONITOR_WAPPER,
'--port', 'socket://{}:{}?logging=debug'.format(HOST, runner.port),
'--print_filter', test[1],
'--serial_alive_file', SERIAL_ALIVE_FILE,
'--elf-file', test[4]]
monitor_cmd += test[5].split()
(master_fd, slave_fd) = pty.openpty()
print('\t', ' '.join(monitor_cmd), sep='')
print('\tstdout="{}" stderr="{}" stdin="{}"'.format(o_f.name, e_f.name, os.ttyname(slave_fd)))
print('\tMonitor timeout: {} seconds'.format(test[3]))
start = time.time()
# the server socket is alive so idf_monitor can start now
proc = subprocess.Popen(monitor_cmd, stdin=slave_fd, stdout=o_f, stderr=e_f, close_fds=True, bufsize=0)
# - idf_monitor's stdin needs to be connected to some pseudo-tty in docker image even when it is not
# used at all
# - setting bufsize is needed because the default value is different on Python 2 and 3
# - the default close_fds is also different on Python 2 and 3
monitor_watchdog = threading.Timer(test[3], monitor_timeout, [proc])
monitor_watchdog.start()
client = runner.accept_connection()
# The connection is ready but idf_monitor cannot yet receive data (the serial reader thread is not running).
# This seems to happen on Ubuntu 16.04 LTS and is not related to the version of Python or pyserial.
# Updating to Ubuntu 18.04 LTS also helps but here, a workaround is used: A wrapper is used for IDF monitor
# which checks the serial reader thread and creates a file when it is running.
while not os.path.isfile(SERIAL_ALIVE_FILE) and proc.poll() is None:
print('\tSerial reader is not ready. Do a sleep...')
time.sleep(1)
# Only now can we send the inputs:
with open(IN_DIR + test[0], 'rb') as f:
print('\tSending {} to the socket'.format(f.name))
for chunk in iter(lambda: f.read(1024), b''):
client.sendall(chunk)
idf_exit_sequence = b'\x1d\n'
print('\tSending <exit> to the socket')
client.sendall(idf_exit_sequence)
close_end_time = start + 0.75 * test[3] # time when the process is close to be killed
while True:
ret = proc.poll()
if ret is not None:
break
if time.time() > close_end_time:
# The process isn't finished yet so we are starting to send additional exit sequences because maybe
# the other end didn't received it.
print('\tSending additional <exit> to the socket')
client.sendall(idf_exit_sequence)
time.sleep(1)
end = time.time()
print('\tidf_monitor exited after {:.2f} seconds'.format(end - start))
if ret < 0:
raise RuntimeError('idf_monitor was terminated by signal {}'.format(-ret))
# idf_monitor needs to end before the socket is closed in order to exit without an exception.
finally:
if monitor_watchdog:
monitor_watchdog.cancel()
os.close(slave_fd)
os.close(master_fd)
if client:
client.close()
print('\tThe client was closed successfully')
f1 = IN_DIR + test[2]
f2 = OUT_DIR + test[2]
temp_f1, temp_f2 = remove_coredump_version_string(f1), remove_coredump_version_string(f2)
print('\tdiff {} {}'.format(f1, f2))
if temp_f1 and temp_f2:
f1, f2 = temp_f1, temp_f2
if filecmp.cmp(f1, f2, shallow=False):
print('\tTest has passed')
else:
raise RuntimeError('The contents of the files are different. Please examine the artifacts.')
def main():
gstart = time.time()
if not os.path.exists(OUT_DIR):
os.mkdir(OUT_DIR)
socket.setdefaulttimeout(SOCKET_TIMEOUT)
for test in test_list:
for i in range(RETRIES_PER_TEST):
with TestRunner() as runner:
# Each test (and each retry) is run with a different port (and server socket). This is done for
# the CI run where retry with a different socket is necessary to pass the test. According to the
# experiments, retry with the same port (and server socket) is not sufficient.
try:
test_iteration(runner, test)
# no more retries if test_iteration exited without an exception
break
except Exception as e:
if i < RETRIES_PER_TEST - 1:
print('Test has failed with exception:', e)
print('Another attempt will be made.')
else:
raise
gend = time.time()
print('Execution took {:.2f} seconds\n'.format(gend - gstart))
if __name__ == '__main__':
main()

View File

@ -1,344 +0,0 @@
I (195) boot: Loaded app from partition at offset 0x10000
I (195) boot: Disabling RNG early entropy source...
I (196) cpu_start: Pro cpu up.
I (200) cpu_start: Application information:
I (205) cpu_start: Project name: hello_world
I (210) cpu_start: App version: v4.2-dev-172-gc9cc694dbb-dirty
I (217) cpu_start: Compile time: Feb 6 2020 17:57:45
I (223) cpu_start: ELF file SHA256: 83cfeb53c9c00c61...
I (229) cpu_start: ESP-IDF: v4.2-dev-172-gc9cc694dbb-dirty
I (236) cpu_start: Starting app cpu, entry point is 0x40081010
I (0) cpu_start: App cpu up.
I (246) heap_init: Initializing. RAM available for dynamic allocation:
I (253) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (259) heap_init: At 3FFB3F58 len 0002C0A8 (176 KiB): DRAM
I (265) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (272) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (278) heap_init: At 40089AC8 len 00016538 (89 KiB): IRAM
I (284) cpu_start: Pro cpu start user code
I (303) spi_flash: detected chip: generic
I (303) spi_flash: flash io: dio
W (303) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (314) esp_core_dump_uart: Init core dump to UART
I (319) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Guru Meditation Error: Core 0 panic'ed (StoreProhibited). Exception was unhandled.
Core 0 register dump:
PC : 0x400e37f7 PS : 0x00060430 A0 : 0x800d0c31 A1 : 0x3ffb5db0
A2 : 0x00000001 A3 : 0x00000001 A4 : 0x00000001 A5 : 0x00060023
A6 : 0x00000001 A7 : 0x00060023 A8 : 0x00000001 A9 : 0x00000000
A10 : 0x7fffffff A11 : 0x8001f880 A12 : 0x06ff1ff8 A13 : 0x00000000
A14 : 0x3ffb7d80 A15 : 0x00000000 SAR : 0x00000014 EXCCAUSE: 0x0000001d
EXCVADDR: 0x00000001 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000
ELF file SHA256: 83cfeb53c9c00c61c4e52674e43654e4b452b7592075920977e491e06a4488d8
Backtrace: 0x400e37f4:0x3ffb5db0 0x400d0c2e:0x3ffb5dd0 0x40087015:0x3ffb5df0
I (401) esp_core_dump_uart: Press Enter to print core dump to UART...
Core Dump detected!
I (434) esp_core_dump_uart: Print core dump to uart...
I (434) esp_core_dump_elf: Found tasks: 8
================= CORE DUMP START =================
9C0AAAABAAAIAAAAXAEAAAAAAAA=
f0VMRgEBAQAAAAAAAAAAAAQAXgABAAAAAAAAADQAAAAAAAAAAAAAADQAIAASACgA
AAAAAA==
BAAAAHQCAAAAAAAAAAAAAAATAAAAEwAABgAAAAAAAAA=
AQAAAHQVAACAXvs/gF77P1wBAABcAQAABgAAAAAAAAA=
AQAAANAWAADwXPs/8Fz7P4gBAACIAQAABgAAAAAAAAA=
AQAAAFgYAABIbfs/SG37P1wBAABcAQAABgAAAAAAAAA=
AQAAALQZAAAgbPs/IGz7PyABAAAgAQAABgAAAAAAAAA=
AQAAANQaAADkZfs/5GX7P1wBAABcAQAABgAAAAAAAAA=
AQAAADAcAACwZPs/sGT7PywBAAAsAQAABgAAAAAAAAA=
AQAAAFwdAACgd/s/oHf7P1wBAABcAQAABgAAAAAAAAA=
AQAAALgeAADQdfs/0HX7P8gBAADIAQAABgAAAAAAAAA=
AQAAAIAgAADwS/s/8Ev7P1wBAABcAQAABgAAAAAAAAA=
AQAAANwhAABASvs/QEr7P6gBAACoAQAABgAAAAAAAAA=
AQAAAIQjAAC0+vo/tPr6P1wBAABcAQAABgAAAAAAAAA=
AQAAAOAkAADg+Po/4Pj6P8wBAADMAQAABgAAAAAAAAA=
AQAAAKwmAAB8R/s/fEf7P1wBAABcAQAABgAAAAAAAAA=
AQAAAAgoAADQRfs/0EX7P6QBAACkAQAABgAAAAAAAAA=
AQAAAKwpAACQ/fo/kP36P1wBAABcAQAABgAAAAAAAAA=
AQAAAAgrAACwQfs/sEH7P8ABAADAAQAABgAAAAAAAAA=
BAAAAMgsAAAAAAAAAAAAABQBAAAUAQAABgAAAAAAAAA=
CAAAAEwCAAABAAAA
Q09SRQAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgF77PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9zcOQCAEBgAAAAAAAAAAAAAAAAAUAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEMDYCwXfs/
AQAAAAEAAAABAAAAIwAGAAEAAAAjAAYAAQAAAAAAAAD///9/gPgBgPgf/wYAAAAA
gH37PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA
CAAAAEwCAAABAAAA
Q09SRQAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASG37PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHAIQCAABQAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgbPs/
AAAAAAAAAAAAAAAAAAAAAMCCCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA
CAAAAEwCAAABAAAA
Q09SRQAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5GX7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHAIQCAABQAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwZfs/
AAAAAAAAAAAAAAAAAAAAAMCCCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA
CAAAAEwCAAABAAAA
Q09SRQAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoHf7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxBIIQCAABgAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaYCICQdvs/
AAAAAAAAAADwbvs/AAAAAAEAAAAjDgYAxBIIgHB2+z/cAPA/AQAAAAgA+z9gS/s/
/AwNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA
CAAAAEwCAAABAAAA
Q09SRQAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8Ev7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxBIIQCAABgAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADuRCIAAS/s/
AAAAAAEAAACE/fo/AAAAAAEAAAACAAAAxBIIgOBK+z/cAPA/AQAAAAgA+z8jAAYA
AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA
CAAAAEwCAAABAAAA
Q09SRQAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtPr6PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxBIIQCAABgAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB+CICg+fo/
AAAAAAAAAAAQNfs/vDf7PwIAAADQN/s/xBIIgID5+j/cAPA/AQAAAAgA+z8jAAYA
AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA
CAAAAEwCAAABAAAA
Q09SRQAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfEf7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEH4IQCACBgAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsaCICQRvs/
mP/6PwAAAADg//o/AAAAAAEAAAABAAAAEH4IgHBG+z8BAAAABAAAABQ1+z8KAAAA
AACAABwA9D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA
CAAAAEwCAAABAAAA
Q09SRQAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkP36PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxBIIQCAOBgAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB+CIBwQvs/
AAAAAAAAAAAQNfs/oDr+PwMAAAAjBQYAxBIIgFBC+z/cAPA/AQAAAAgA+z8jAAYA
AQAAACMFBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA
UF37PxBe+z+Ly+SRODP7Pzgz+z+AXvs/MDP7PxgAAACXBQ54SQvlZoBe+z8AAAAA
AQAAAHxO+z9tYWluANFl1b9gbhUZORAAAAAAAHhe+z8BAAAAAAAAAAAAAAAAAAAA
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAk5ND
776t3vc3DkAwBAYAMQwNgLBd+z8BAAAAAQAAAAEAAAAjAAYAAQAAACMABgABAAAA
AAAAAP///3+A+AGA+B//BgAAAACAffs/AAAAABQAAAAdAAAAAQAAAAAAAAAAAAAA
AAAAAPgf/wYAAAAAPB4IQAgL+z8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAABhwCIDQXfs/AAAAAAAAAAAYcAiA0F37PwAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADwXfs/zAsNQAAAAAAjAAYAODP7P4Be+z8AAAAA
AAAAABBe+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAcXvs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAA=
IGz7P+Bs+z8qbFI9JDP7P+xl+z9Ibfs/HDP7PxkAAACM49VXeSoll0ht+z8AAAAA
AAAAAERn+z9JRExFMQCFkbfvDgtV1KkAAQAAAEBt+z8AAAAAAAAAAAAAAAAAAAAA
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAvl21
oB4IQBBwCEAwAAUAAAAAAOBs+z8AAAAAAAAAAAAAAAAAAAAAwIIIQAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADAbPs/wIIIQAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAOBs+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAADsbPs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
sGT7P3Bl+z/HSTugUG37PyQz+z/kZfs/HDP7PxkAAAA1aB3HlRMz9ORl+z8AAAAA
AAAAAOBf+z9JRExFMAB5I/hhScYuItcAAAAAANxl+z8AAAAAAAAAAAAAAAAAAAAA
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAADuXO
oB4IQBBwCEAwAAUAAAAAAHBl+z8AAAAAAAAAAAAAAAAAAAAAwIIIQAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAGgS+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAB8Zfs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA
0HX7PzB3+z8AAAAAEDP7PxAz+z+gd/s/CDP7PxgAAADUbvs/1G77P6B3+z/Mbvs/
AQAAAJxv+z9UbXIgU3ZjAA1db2P9pUIAAAAAAJh3+z8BAAAAAAAAAAAAAAAAAAAA
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAFysf
oB4IQMQSCEAwAAYABpgIgJB2+z8AAAAAAAAAAPBu+z8AAAAAAQAAACMOBgDEEgiA
cHb7P9wA8D8BAAAACAD7P2BL+z/8DA1AAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA
AAAAAKQgCEBgS/s/mHIIQCgk+z8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAKAeCEAQcAhAMAAFAAAAAADzmAiAsHb7Pxw1+z8AAAAA
AAAAAOSYCEAAAAAAAAAAABhwCIDgdvs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACMABgABAAAAIwAGAAAAAAAQd/s/5JgIQAAAAAABAAAAAAAAAAAAAAAAAAAA
IwAGADgz+z+AXvs/AAAAAAAAAAAwd/s/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPHf7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
QEr7P4BL+z9GPj4tuDL7P7gy+z/wS/s/sDL7PxQAAABM4/eNY9P4VPBL+z8AAAAA
BQAAAOxI+z9kcG9ydADgytnG+juR2iwAAAAAAOhL+z8FAAAAAAAAAAAAAAAAAAAA
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAGA9Z
oB4IQMQSCEAwAAYAO5EIgABL+z8AAAAAAQAAAIT9+j8AAAAAAQAAAAIAAADEEgiA
4Er7P9wA8D8BAAAACAD7PyMABgABAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA
AAAAAKQgCEAjAAYAmHIIQHj4+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAD8DA1AAAAAAAAAAABcDQ2AIEv7P/BL+z8AAAAA
AAAAAAAAAAAAAAAAAAAAABhwCIBAS/s/AQAAAAAAABDwS/s/IwAGAAEAAAAjAAYA
AAAAAGBL+z/8DA1AAAAAABoAAACIM/s/8Ev7PwAAAAAAAAAAgEv7PwAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIxL+z8AAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
4Pj6P0D6+j/c8+jFhEf7P5j9+j+0+vo/mDL7PwMAAACI6vo/iOr6P7T6+j+A6vo/
FgAAALDq+j9lc3BfdGltZXIAmI0iFV0AAAAAAKz6+j8WAAAAAAAAAAAAAAAAAAAA
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAOT5O
oB4IQMQSCEAwAAYAEH4IgKD5+j8AAAAAAAAAABA1+z+8N/s/AgAAANA3+z/EEgiA
gPn6P9wA8D8BAAAACAD7PyMABgABAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA
AAAAAKQgCEAjAAYAmHIIQDin+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAKAeCEAQcAhAMAAFAAAAAABLHw2AwPn6P1zq+j8AAAAA
AAAAADgfDUAAAAAAAAAAABhwCIAA+vo/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
/////wAAAAAAAAAAAAAAAKTq+j8AAAAAAQAAACMOBgAAAAAAIPr6PzgfDUAAAAAA
IwAGANw0+z+0+vo/AAAAAAAAAABA+vo/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATPr6PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
0EX7PxBH+z8+sA1HoDL7P7z6+j98R/s/mDL7PwEAAADE//o/xP/6P3xH+z+8//o/
GAAAAHhD+z9pcGMxAHSb12QdtYvfmTkAAQAAAHRH+z8YAAAAAAAAAAAAAAAAAAAA
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAjAAz
oB4IQBB+CEAwAgYAKxoIgJBG+z+Y//o/AAAAAOD/+j8AAAAAAQAAAAEAAAAQfgiA
cEb7PwEAAAAEAAAAFDX7PwoAAAAAAIAAHAD0PwAAAAD//wAAAAAAAAAAAAAAAAAA
AAAAAKQgCEAKAAAAmHIIQAj0+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAD4GQhAAQAAAAAAAAAYcAiA0Eb7PwEAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAPBG+z/4GQhAAQAAACAHBgAENfs/fEf7PwAAAAAAAAAAEEf7PwAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAFwQCICAff4/KAAAACgAAAAAAAAAAAAAABxH+z8AAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
sEH7PxBD+z8En2QMvPr6P6Ay+z+Q/fo/mDL7PwEAAABo/fo/aP36P5D9+j9g/fo/
GAAAAHQ/+z9pcGMwAGHBu8ov8v26vbcAAAAAAHBD+z8YAAAAAAAAAAAAAAAAAAAA
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAsXYs
oB4IQMQSCEAwDgYAEH4IgHBC+z8AAAAAAAAAABA1+z+gOv4/AwAAACMFBgDEEgiA
UEL7P9wA8D8BAAAACAD7PyMABgABAAAAIwUGAAAAAAD//wAAAAAAAAAAAAAAAAAA
AAAAAKQgCEAjAAYAmHIIQAjw+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAKAeCEAQcAhAMAAFAAAAAAArGgiAkEL7Pzz9+j8AAAAA
AAAAAPgZCEAAAAAAAAAAABhwCIDQQvs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
/////wAAAAAAAAAAAAAAAIT9+j8AAAAAAQAAAAIAAAAAAAAA8EL7P/gZCEAAAAAA
IwMGAAQ1+z+Q/fo/AQAAAAAAAAAQQ/s/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
2Q8IgGA7/j+AMvs/BQAAAAAAAAAAAAAAHEP7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAA==
FAAAAEgAAABKIAAA
RVNQX0NPUkVfRFVNUF9JTkZPAAA=
AAEAADgzY2ZlYjUzYzljMDBjNjFjNGU1MjY3NGU0MzY1NGU0YjQ1MmI3NTkyMDc1
OTIwOTc3ZTQ5MWUwNmE0NDg4ZDgAAAAA
DAAAAJQAAAClAgAA
RVhUUkFfSU5GTwAA
gF77P+gAAAAdAAAA7gAAAAEAAADCAAAAAAAAAMMAAAAAAAAAxAAAAAAAAADFAAAA
AAAAAMYAAAAAAAAAsQAAAL84DkCyAAAAAAAAALMAAAAAAAAAtAAAAAAAAAC1AAAA
AAAAALYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAA==
Fj6ctQ==
================= CORE DUMP END =================
I (1859) esp_core_dump_uart: Core dump has been written to uart.
Rebooting...
ets Jun 8 2016 00:22:57
rst:0xc (SW_CPU_RESET),boot:0x1e (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:4
load:0x3fff0034,len:7148
load:0x40078000,len:14220
ho 0 tail 12 room 4
load:0x40080400,len:4584
0x40080400: _init at ??:?

View File

@ -1,192 +0,0 @@
I (195) boot: Loaded app from partition at offset 0x10000
I (195) boot: Disabling RNG early entropy source...
I (196) cpu_start: Pro cpu up.
I (200) cpu_start: Application information:
I (205) cpu_start: Project name: hello_world
I (210) cpu_start: App version: v4.2-dev-172-gc9cc694dbb-dirty
I (217) cpu_start: Compile time: Feb 6 2020 17:57:45
I (223) cpu_start: ELF file SHA256: 83cfeb53c9c00c61...
I (229) cpu_start: ESP-IDF: v4.2-dev-172-gc9cc694dbb-dirty
I (236) cpu_start: Starting app cpu, entry point is 0x40081010
I (0) cpu_start: App cpu up.
I (246) heap_init: Initializing. RAM available for dynamic allocation:
I (253) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (259) heap_init: At 3FFB3F58 len 0002C0A8 (176 KiB): DRAM
I (265) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (272) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (278) heap_init: At 40089AC8 len 00016538 (89 KiB): IRAM
I (284) cpu_start: Pro cpu start user code
I (303) spi_flash: detected chip: generic
I (303) spi_flash: flash io: dio
W (303) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (314) esp_core_dump_uart: Init core dump to UART
I (319) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Guru Meditation Error: Core 0 panic'ed (StoreProhibited). Exception was unhandled.
Core 0 register dump:
PC : 0x400e37f7 PS : 0x00060430 A0 : 0x800d0c31 A1 : 0x3ffb5db0
A2 : 0x00000001 A3 : 0x00000001 A4 : 0x00000001 A5 : 0x00060023
A6 : 0x00000001 A7 : 0x00060023 A8 : 0x00000001 A9 : 0x00000000
A10 : 0x7fffffff A11 : 0x8001f880 A12 : 0x06ff1ff8 A13 : 0x00000000
A14 : 0x3ffb7d80 A15 : 0x00000000 SAR : 0x00000014 EXCCAUSE: 0x0000001d
EXCVADDR: 0x00000001 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000
ELF file SHA256: 83cfeb53c9c00c61c4e52674e43654e4b452b7592075920977e491e06a4488d8
Backtrace: 0x400e37f4:0x3ffb5db0 0x400d0c2e:0x3ffb5dd0 0x40087015:0x3ffb5df0
I (401) esp_core_dump_uart: Press Enter to print core dump to UART...
Core Dump detected!
I (434) esp_core_dump_uart: Print core dump to uart...
I (434) esp_core_dump_elf: Found tasks: 8
===============================================================
==================== ESP32 CORE DUMP START ====================
Crashed task handle: 0x3ffb5e80, name: 'main', GDB name: 'process 1073438336'
================== CURRENT THREAD REGISTERS ===================
exccause 0x1d (StoreProhibitedCause)
excvaddr 0x1
epc1 0x400e38bf
epc2 0x0
epc3 0x0
epc4 0x0
epc5 0x0
epc6 0x0
eps2 0x0
eps3 0x0
eps4 0x0
eps5 0x0
eps6 0x0
pc 0x400e37f7 0x400e37f7
lbeg 0x0 0
lend 0x0 0
lcount 0x0 0
sar 0x14 20
ps 0x60420 394272
threadptr <unavailable>
br <unavailable>
scompare1 <unavailable>
acclo <unavailable>
acchi <unavailable>
m0 <unavailable>
m1 <unavailable>
m2 <unavailable>
m3 <unavailable>
expstate <unavailable>
f64r_lo <unavailable>
f64r_hi <unavailable>
f64s <unavailable>
fcr <unavailable>
fsr <unavailable>
a0 0x800d0c31 -2146628559
a1 0x3ffb5db0 1073438128
a2 0x1 1
a3 0x1 1
a4 0x1 1
a5 0x60023 393251
a6 0x1 1
a7 0x60023 393251
a8 0x1 1
a9 0x0 0
a10 0x7fffffff 2147483647
a11 0x8001f880 -2147354496
a12 0x6ff1ff8 117383160
a13 0x0 0
a14 0x3ffb7d80 1073446272
a15 0x0 0
==================== CURRENT THREAD STACK =====================
#0 0x400e37f7 in ?? ()
#1 0x400d0c31 in ?? ()
#2 0x40087018 in ?? ()
======================== THREADS INFO =========================
Id Target Id Frame
* 1 process 1073438336 0x400e37f7 in ?? ()
2 process 1073442120 0x40087010 in ?? ()
3 process 1073440228 0x40087010 in ?? ()
4 process 1073444768 0x400812c4 in ?? ()
5 process 1073433584 0x400812c4 in ?? ()
6 process 1073412788 0x400812c4 in ?? ()
7 process 1073432444 0x40087e10 in ?? ()
8 process 1073413520 0x400812c4 in ?? ()
==================== THREAD 1 (TCB: 0x3ffb5e80, name: 'main') =====================
#0 0x400e37f7 in ?? ()
#1 0x400d0c31 in ?? ()
#2 0x40087018 in ?? ()
==================== THREAD 2 (TCB: 0x3ffb6d48, name: 'IDLE1') =====================
#0 0x40087010 in ?? ()
==================== THREAD 3 (TCB: 0x3ffb65e4, name: 'IDLE0') =====================
#0 0x40087010 in ?? ()
==================== THREAD 4 (TCB: 0x3ffb77a0, name: 'Tmr Svc') =====================
#0 0x400812c4 in ?? ()
#1 0x40089806 in ?? ()
#2 0x400898f3 in ?? ()
#3 0x40087018 in ?? ()
==================== THREAD 5 (TCB: 0x3ffb4bf0, name: 'dport') =====================
#0 0x400812c4 in ?? ()
#1 0x4008913b in ?? ()
#2 0x400d0d5c in ?? ()
#3 0x40087018 in ?? ()
==================== THREAD 6 (TCB: 0x3ffafab4, name: 'esp_timer') =====================
#0 0x400812c4 in ?? ()
#1 0x40087e10 in ?? ()
#2 0x400d1f4b in ?? ()
#3 0x40087018 in ?? ()
==================== THREAD 7 (TCB: 0x3ffb477c, name: 'ipc1') =====================
#0 0x40087e10 in ?? ()
#1 0x40081a2b in ?? ()
#2 0x40087018 in ?? ()
==================== THREAD 8 (TCB: 0x3ffafd90, name: 'ipc0') =====================
#0 0x400812c4 in ?? ()
#1 0x40087e10 in ?? ()
#2 0x40081a2b in ?? ()
#3 0x40087018 in ?? ()
======================= ALL MEMORY REGIONS ========================
Name Address Size Attrs
.text 0x400074 0x133 R XA
.eh_frame 0x4001a8 0x4 R A
.ctors 0x4011ac 0x8 RW A
.dtors 0x4011b4 0x8 RW A
.data 0x4011bc 0x4 RW A
.coredump.tasks.data 0x3ffb5e80 0x15c RW
.coredump.tasks.data 0x3ffb5cf0 0x188 RW
.coredump.tasks.data 0x3ffb6d48 0x15c RW
.coredump.tasks.data 0x3ffb6c20 0x120 RW
.coredump.tasks.data 0x3ffb65e4 0x15c RW
.coredump.tasks.data 0x3ffb64b0 0x12c RW
.coredump.tasks.data 0x3ffb77a0 0x15c RW
.coredump.tasks.data 0x3ffb75d0 0x1c8 RW
.coredump.tasks.data 0x3ffb4bf0 0x15c RW
.coredump.tasks.data 0x3ffb4a40 0x1a8 RW
.coredump.tasks.data 0x3ffafab4 0x15c RW
.coredump.tasks.data 0x3ffaf8e0 0x1cc RW
.coredump.tasks.data 0x3ffb477c 0x15c RW
.coredump.tasks.data 0x3ffb45d0 0x1a4 RW
.coredump.tasks.data 0x3ffafd90 0x15c RW
.coredump.tasks.data 0x3ffb41b0 0x1c0 RW
===================== ESP32 CORE DUMP END =====================
===============================================================
Done!
I (1859) esp_core_dump_uart: Core dump has been written to uart.
Rebooting...
ets Jun 8 2016 00:22:57
rst:0xc (SW_CPU_RESET),boot:0x1e (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:4
load:0x3fff0034,len:7148
load:0x40078000,len:14220
ho 0 tail 12 room 4
load:0x40080400,len:4584
0x40080400: _init at ??:?

View File

@ -1,91 +0,0 @@
ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:5728
ho 0 tail 12 room 4
load:0x40078000,len:0
load:0x40078000,len:14944
entry 0x4007862c
I (30) boot: ESP-IDF v3.1-dev-1320-gec1fb521b-dirty 2nd stage bootloader
I (30) boot: compile time 09:31:02
I (40) boot: Enabling RNG early entropy source...
I (41) boot: SPI Speed : 40MHz
I (41) boot: SPI Mode : DIO
I (45) boot: SPI Flash Size : 4MB
I (49) boot: Partition Table:
I (53) boot: ## Label Usage Type ST Offset Length
I (60) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (68) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (75) boot: 2 factory factory app 00 00 00010000 00100000
I (83) boot: End of partition table
I (87) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x058ac ( 22700) map
I (104) esp_image: segment 1: paddr=0x000158d4 vaddr=0x3ffb0000 size=0x022a0 ( 8864) load
I (108) esp_image: segment 2: paddr=0x00017b7c vaddr=0x40080000 size=0x00400 ( 1024) load
0x40080000: _iram_start at /home/dragon/esp/esp-idf/components/freertos/xtensa_vectors.S:1685

I (114) esp_image: segment 3: paddr=0x00017f84 vaddr=0x40080400 size=0x0808c ( 32908) load
I (136) esp_image: segment 4: paddr=0x00020018 vaddr=0x400d0018 size=0x11e88 ( 73352) map
0x400d0018: _flash_cache_start at ??:?

I (162) esp_image: segment 5: paddr=0x00031ea8 vaddr=0x4008848c size=0x00670 ( 1648) load
0x4008848c: esp_rom_spiflash_program_page_internal at /home/dragon/esp/esp-idf/components/spi_flash/spi_flash_rom_patch.c:412

I (163) esp_image: segment 6: paddr=0x00032520 vaddr=0x400c0000 size=0x00000 ( 0) load
I (174) boot: Loaded app from partition at offset 0x10000
I (175) boot: Disabling RNG early entropy source...
I (180) cpu_start: Pro cpu up.
I (184) cpu_start: Starting app cpu, entry point is 0x40080e54
0x40080e54: call_start_cpu1 at /home/dragon/esp/esp-idf/components/esp32/cpu_start.c:225

I (0) cpu_start: App cpu up.
I (195) heap_init: Initializing. RAM available for dynamic allocation:
D (201) heap_init: New heap initialised at 0x3ffae6e0
I (206) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
D (212) heap_init: New heap initialised at 0x3ffb32f0
I (218) heap_init: At 3FFB32F0 len 0002CD10 (179 KiB): DRAM
I (224) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM
I (230) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
D (237) heap_init: New heap initialised at 0x40088afc
I (242) heap_init: At 40088AFC len 00017504 (93 KiB): IRAM
I (248) cpu_start: Pro cpu start user code
D (260) clk: RTC_SLOW_CLK calibration value: 3181466
D (269) intr_alloc: Connected src 46 to int 2 (cpu 0)
D (270) intr_alloc: Connected src 57 to int 3 (cpu 0)
D (271) intr_alloc: Connected src 24 to int 9 (cpu 0)
I (276) cpu_start: Starting scheduler on PRO CPU.
D (0) intr_alloc: Connected src 25 to int 2 (cpu 1)
I (0) cpu_start: Starting scheduler on APP CPU.
D (291) heap_init: New heap initialised at 0x3ffe0440
D (301) heap_init: New heap initialised at 0x3ffe4350
D (311) intr_alloc: Connected src 16 to int 12 (cpu 0)
D (311) hello_world: debug1
W (311) hello_world: warning1
V (321) hello_world: verbose1
E (321) hello_world: error1
I (321) hello_world: info1
regular printf
D (331) another_world: another debug
I (331) example: Periodic timer called, time since boot: 507065 us
V (341) another_world: another verbose another very long
W (341) another_world: another warning very long
V (351) another_world: another verbose
E (351) another_world: another error
I (361) another_world: Register 0x40080000
0x40080000: _iram_start at /home/dragon/esp/esp-idf/components/freertos/xtensa_vectors.S:1685

D (361) hello_world: debug2
W (371) hello_world: warning2
V (371) hello_world: verbose2
E (371) hello_world: error2
I (381) hello_world: info2
noeol 0x400800000x40080000: _iram_start at /home/dragon/esp/esp-idf/components/freertos/xtensa_vectors.S:1685



View File

@ -1,86 +0,0 @@
ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:5728
ho 0 tail 12 room 4
load:0x40078000,len:0
load:0x40078000,len:14944
entry 0x4007862c
I (30) boot: ESP-IDF v3.1-dev-1320-gec1fb521b-dirty 2nd stage bootloader
I (30) boot: compile time 09:31:02
I (40) boot: Enabling RNG early entropy source...
I (41) boot: SPI Speed : 40MHz
I (41) boot: SPI Mode : DIO
I (45) boot: SPI Flash Size : 4MB
I (49) boot: Partition Table:
I (53) boot: ## Label Usage Type ST Offset Length
I (60) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (68) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (75) boot: 2 factory factory app 00 00 00010000 00100000
I (83) boot: End of partition table
I (87) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x058ac ( 22700) map
I (104) esp_image: segment 1: paddr=0x000158d4 vaddr=0x3ffb0000 size=0x022a0 ( 8864) load
I (108) esp_image: segment 2: paddr=0x00017b7c vaddr=0x40080000 size=0x00400 ( 1024) load
0x40080000: _iram_start at /home/dragon/esp/esp-idf/components/freertos/xtensa_vectors.S:1685

I (114) esp_image: segment 3: paddr=0x00017f84 vaddr=0x40080400 size=0x0808c ( 32908) load
I (136) esp_image: segment 4: paddr=0x00020018 vaddr=0x400d0018 size=0x11e88 ( 73352) map
0x400d0018: _flash_cache_start at ??:?

I (162) esp_image: segment 5: paddr=0x00031ea8 vaddr=0x4008848c size=0x00670 ( 1648) load
0x4008848c: esp_rom_spiflash_program_page_internal at /home/dragon/esp/esp-idf/components/spi_flash/spi_flash_rom_patch.c:412

I (163) esp_image: segment 6: paddr=0x00032520 vaddr=0x400c0000 size=0x00000 ( 0) load
I (174) boot: Loaded app from partition at offset 0x10000
I (175) boot: Disabling RNG early entropy source...
I (180) cpu_start: Pro cpu up.
I (184) cpu_start: Starting app cpu, entry point is 0x40080e54
0x40080e54: call_start_cpu1 at /home/dragon/esp/esp-idf/components/esp32/cpu_start.c:225

I (0) cpu_start: App cpu up.
I (195) heap_init: Initializing. RAM available for dynamic allocation:
D (201) heap_init: New heap initialised at 0x3ffae6e0
I (206) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
D (212) heap_init: New heap initialised at 0x3ffb32f0
I (218) heap_init: At 3FFB32F0 len 0002CD10 (179 KiB): DRAM
I (224) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM
I (230) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
D (237) heap_init: New heap initialised at 0x40088afc
I (242) heap_init: At 40088AFC len 00017504 (93 KiB): IRAM
I (248) cpu_start: Pro cpu start user code
D (260) clk: RTC_SLOW_CLK calibration value: 3181466
D (269) intr_alloc: Connected src 46 to int 2 (cpu 0)
D (270) intr_alloc: Connected src 57 to int 3 (cpu 0)
D (271) intr_alloc: Connected src 24 to int 9 (cpu 0)
I (276) cpu_start: Starting scheduler on PRO CPU.
D (0) intr_alloc: Connected src 25 to int 2 (cpu 1)
I (0) cpu_start: Starting scheduler on APP CPU.
D (291) heap_init: New heap initialised at 0x3ffe0440
D (301) heap_init: New heap initialised at 0x3ffe4350
D (311) intr_alloc: Connected src 16 to int 12 (cpu 0)
D (311) hello_world: debug1
W (311) hello_world: warning1
V (321) hello_world: verbose1
E (321) hello_world: error1
I (321) hello_world: info1
regular printf
D (331) another_world: another debug
I (331) example: Periodic timer called, time since boot: 507065 us
V (341) another_world: another verbose another very long
W (341) another_world: another warning very long
V (351) another_world: another verbose
E (351) another_world: another error
I (361) another_world: Register 0x40080000
0x40080000: _iram_start at /home/dragon/esp/esp-idf/components/freertos/xtensa_vectors.S:1685

D (361) hello_world: debug2
W (371) hello_world: warning2
V (371) hello_world: verbose2
E (371) hello_world: error2
I (381) hello_world: info2
noeol 0x400800000x40080000: _iram_start at /home/dragon/esp/esp-idf/components/freertos/xtensa_vectors.S:1685



View File

@ -1,10 +0,0 @@
D (311) hello_world: debug1
W (311) hello_world: warning1
V (321) hello_world: verbose1
E (321) hello_world: error1
I (321) hello_world: info1
D (361) hello_world: debug2
W (371) hello_world: warning2
V (371) hello_world: verbose2
E (371) hello_world: error2
I (381) hello_world: info2

File diff suppressed because it is too large Load Diff

View File

@ -1,54 +0,0 @@
E (39) boot: Factory app partition is not bootable
I (730) mdf_device_handle: [mdf_device_init_handle, 897]:******************* SYSTEM INFO *******************
I (740) mdf_device_handle: [mdf_device_init_handle, 898]:idf version : v3.1-dev-1188-g0c43ac8
I (749) mdf_device_handle: [mdf_device_init_handle, 901]:device version : light_004384-0.5.25.1-1
I (759) mdf_device_handle: [mdf_device_init_handle, 902]:compile time : May 26 2018 00:22:11
I (769) mdf_device_handle: [mdf_device_init_handle, 903]:free heap : 120948 B
I (777) mdf_device_handle: [mdf_device_init_handle, 904]:CPU cores : 2
I (785) mdf_device_handle: [mdf_device_init_handle, 907]:function : WiFi/BT/BLE
I (793) mdf_device_handle: [mdf_device_init_handle, 908]:silicon revision : 0
I (801) mdf_device_handle: [mdf_device_init_handle, 910]:flash : 4 MB external
I (810) mdf_device_handle: [mdf_device_init_handle, 911]:***************************************************
E (45488) mesh: [esp_mesh_push_to_nwk_queue,5360] null args
I (50495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 00:00:00:00:00:00, mac:30:ae:a4:00:43:84, layer: -1, free heap: 87712, compile time: May 26 2018 00:22:11
I (55495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 88452, compile time: May 26 2018 00:22:11
I (60495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71792, compile time: May 26 2018 00:22:11
I (65495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71792, compile time: May 26 2018 00:22:11
I (70495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71680, compile time: May 26 2018 00:22:11
I (75495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71680, compile time: May 26 2018 00:22:11
I (80495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71680, compile time: May 26 2018 00:22:11
I (85495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71680, compile time: May 26 2018 00:22:11
I (90495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71680, compile time: May 26 2018 00:22:11
I (95498) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71468, compile time: May 26 2018 00:22:11
I (100495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71264, compile time: May 26 2018 00:22:11
I (105495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 69120, compile time: May 26 2018 00:22:11
I (110495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 64408, compile time: May 26 2018 00:22:11
I (115495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 64408, compile time: May 26 2018 00:22:11
I (120495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 64408, compile time: May 26 2018 00:22:11
I (125495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 64408, compile time: May 26 2018 00:22:11
I (130495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 64408, compile time: May 26 2018 00:22:11
I (135495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 64408, compile time: May 26 2018 00:22:11
I (140495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 62196, compile time: May 26 2018 00:22:11
I (145495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 62196, compile time: May 26 2018 00:22:11
I (150495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 62196, compile time: May 26 2018 00:22:11
I (155495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 62196, compile time: May 26 2018 00:22:11
I (160495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 62196, compile time: May 26 2018 00:22:11
I (165495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 62196, compile time: May 26 2018 00:22:11
I (170495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60008, compile time: May 26 2018 00:22:11
I (175495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60008, compile time: May 26 2018 00:22:11
I (180495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60008, compile time: May 26 2018 00:22:11
I (185495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60008, compile time: May 26 2018 00:22:11
I (190495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60008, compile time: May 26 2018 00:22:11
I (195495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60008, compile time: May 26 2018 00:22:11
I (200495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11
I (205495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11
I (210495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11
I (215495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11
I (220495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11
I (225495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11
I (230495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11
I (235495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11
I (240495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11
I (245495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11
I (250495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11
I (255495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11

View File

@ -1,995 +0,0 @@
D (318) vfs: esp_vfs_register_fd_range is successful for range <54; 64) and VFS ID 1
D (59342) vfs: esp_vfs_select starts with nfds = 55
D (59343) vfs: FDs in readfds =
D (59343) vfs: 54
D (59355) vfs: calling socket_select with the following FDs
D (59356) vfs: FDs in readfds =
D (59356) vfs: 54
D (59857) vfs: socket_select returned 0 and the FDs are the following
D (59858) vfs: FDs in readfds =
D (59858) vfs: esp_vfs_select returns 0
D (59869) vfs: FDs in readfds =
D (59870) vfs: esp_vfs_select starts with nfds = 55
D (59871) vfs: FDs in readfds =
D (59871) vfs: 54
D (59882) vfs: calling socket_select with the following FDs
D (59883) vfs: FDs in readfds =
D (59884) vfs: 54
D (60384) vfs: socket_select returned 0 and the FDs are the following
D (60385) vfs: FDs in readfds =
D (60385) vfs: esp_vfs_select returns 0
D (60396) vfs: FDs in readfds =
D (60397) vfs: esp_vfs_select starts with nfds = 55
D (60397) vfs: FDs in readfds =
D (60408) vfs: 54
D (60409) vfs: calling socket_select with the following FDs
D (60409) vfs: FDs in readfds =
D (60410) vfs: 54
D (60921) vfs: socket_select returned 0 and the FDs are the following
D (60922) vfs: FDs in readfds =
D (60922) vfs: esp_vfs_select returns 0
D (60933) vfs: FDs in readfds =
D (60934) vfs: esp_vfs_select starts with nfds = 55
D (60935) vfs: FDs in readfds =
D (60935) vfs: 54
D (60946) vfs: calling socket_select with the following FDs
D (60947) vfs: FDs in readfds =
D (60947) vfs: 54
D (61458) vfs: socket_select returned 0 and the FDs are the following
D (61459) vfs: FDs in readfds =
D (61460) vfs: esp_vfs_select returns 0
D (61471) vfs: FDs in readfds =
D (61471) vfs: esp_vfs_select starts with nfds = 55
D (61472) vfs: FDs in readfds =
D (61483) vfs: 54
D (61483) vfs: calling socket_select with the following FDs
D (61484) vfs: FDs in readfds =
D (61484) vfs: 54
D (61995) vfs: socket_select returned 0 and the FDs are the following
D (61996) vfs: FDs in readfds =
D (61996) vfs: esp_vfs_select returns 0
D (62007) vfs: FDs in readfds =
D (62008) vfs: esp_vfs_select starts with nfds = 55
D (62008) vfs: FDs in readfds =
D (62019) vfs: 54
D (62021) vfs: calling socket_select with the following FDs
D (62021) vfs: FDs in readfds =
D (62022) vfs: 54
D (62523) vfs: socket_select returned 0 and the FDs are the following
D (62524) vfs: FDs in readfds =
D (62524) vfs: esp_vfs_select returns 0
D (62535) vfs: FDs in readfds =
D (62536) vfs: esp_vfs_select starts with nfds = 55
D (62536) vfs: FDs in readfds =
D (62547) vfs: 54
D (62548) vfs: calling socket_select with the following FDs
D (62548) vfs: FDs in readfds =
D (62549) vfs: 54
D (63060) vfs: socket_select returned 0 and the FDs are the following
D (63061) vfs: FDs in readfds =
D (63061) vfs: esp_vfs_select returns 0
D (63072) vfs: FDs in readfds =
D (63073) vfs: esp_vfs_select starts with nfds = 55
D (63073) vfs: FDs in readfds =
D (63084) vfs: 54
D (63085) vfs: calling socket_select with the following FDs
D (63086) vfs: FDs in readfds =
D (63086) vfs: 54
D (63597) vfs: socket_select returned 0 and the FDs are the following
D (63599) vfs: FDs in readfds =
D (63599) vfs: esp_vfs_select returns 0
D (63610) vfs: FDs in readfds =
D (63611) vfs: esp_vfs_select starts with nfds = 55
D (63611) vfs: FDs in readfds =
D (63612) vfs: 54
D (63623) vfs: calling socket_select with the following FDs
D (63623) vfs: FDs in readfds =
D (63624) vfs: 54
D (64134) vfs: socket_select returned 0 and the FDs are the following
D (64135) vfs: FDs in readfds =
D (64135) vfs: esp_vfs_select returns 0
D (64146) vfs: FDs in readfds =
D (64147) vfs: esp_vfs_select starts with nfds = 55
D (64147) vfs: FDs in readfds =
D (64158) vfs: 54
D (64159) vfs: calling socket_select with the following FDs
D (64159) vfs: FDs in readfds =
D (64160) vfs: 54
D (64671) vfs: socket_select returned 0 and the FDs are the following
D (64672) vfs: FDs in readfds =
D (64674) vfs: esp_vfs_select returns 0
D (64674) vfs: FDs in readfds =
D (64685) vfs: esp_vfs_select starts with nfds = 55
D (64686) vfs: FDs in readfds =
D (64686) vfs: 54
D (64697) vfs: calling socket_select with the following FDs
D (64699) vfs: FDs in readfds =
D (64699) vfs: 54
D (65200) vfs: socket_select returned 0 and the FDs are the following
D (65201) vfs: FDs in readfds =
D (65201) vfs: esp_vfs_select returns 0
D (65212) vfs: FDs in readfds =
D (65213) vfs: esp_vfs_select starts with nfds = 55
D (65213) vfs: FDs in readfds =
D (65224) vfs: 54
D (65225) vfs: calling socket_select with the following FDs
D (65227) vfs: FDs in readfds =
D (65227) vfs: 54
D (65728) vfs: socket_select returned 0 and the FDs are the following
D (65729) vfs: FDs in readfds =
D (65729) vfs: esp_vfs_select returns 0
D (65740) vfs: FDs in readfds =
D (65741) vfs: esp_vfs_select starts with nfds = 55
D (65741) vfs: FDs in readfds =
D (65752) vfs: 54
D (65753) vfs: calling socket_select with the following FDs
D (65753) vfs: FDs in readfds =
D (65754) vfs: 54
D (66265) vfs: socket_select returned 0 and the FDs are the following
D (66266) vfs: FDs in readfds =
D (66266) vfs: esp_vfs_select returns 0
D (66277) vfs: FDs in readfds =
D (66278) vfs: esp_vfs_select starts with nfds = 55
D (66278) vfs: FDs in readfds =
D (66289) vfs: 54
D (66290) vfs: calling socket_select with the following FDs
D (66291) vfs: FDs in readfds =
D (66291) vfs: 54
D (66802) vfs: socket_select returned 0 and the FDs are the following
D (66803) vfs: FDs in readfds =
D (66803) vfs: esp_vfs_select returns 0
D (66814) vfs: FDs in readfds =
D (66815) vfs: esp_vfs_select starts with nfds = 55
D (66816) vfs: FDs in readfds =
D (66816) vfs: 54
D (66827) vfs: calling socket_select with the following FDs
D (66828) vfs: FDs in readfds =
D (66828) vfs: 54
D (67339) vfs: socket_select returned 0 and the FDs are the following
D (67340) vfs: FDs in readfds =
D (67340) vfs: esp_vfs_select returns 0
D (67351) vfs: FDs in readfds =
D (67352) vfs: esp_vfs_select starts with nfds = 55
D (67353) vfs: FDs in readfds =
D (67353) vfs: 54
D (67364) vfs: calling socket_select with the following FDs
D (67365) vfs: FDs in readfds =
D (67365) vfs: 54
D (67877) vfs: socket_select returned 0 and the FDs are the following
D (67878) vfs: FDs in readfds =
D (67879) vfs: esp_vfs_select returns 0
D (67889) vfs: FDs in readfds =
D (67890) vfs: esp_vfs_select starts with nfds = 55
D (67891) vfs: FDs in readfds =
D (67901) vfs: 54
D (67902) vfs: calling socket_select with the following FDs
D (67903) vfs: FDs in readfds =
D (67903) vfs: 54
D (68414) vfs: socket_select returned 0 and the FDs are the following
D (68415) vfs: FDs in readfds =
D (68415) vfs: esp_vfs_select returns 0
D (68417) vfs: FDs in readfds =
D (68428) vfs: esp_vfs_select starts with nfds = 55
D (68428) vfs: FDs in readfds =
D (68429) vfs: 54
D (68440) vfs: calling socket_select with the following FDs
D (68440) vfs: FDs in readfds =
D (68441) vfs: 54
D (68941) vfs: socket_select returned 0 and the FDs are the following
D (68942) vfs: FDs in readfds =
D (68942) vfs: esp_vfs_select returns 0
D (68953) vfs: FDs in readfds =
D (68954) vfs: esp_vfs_select starts with nfds = 55
D (68954) vfs: FDs in readfds =
D (68965) vfs: 54
D (68966) vfs: calling socket_select with the following FDs
D (68966) vfs: FDs in readfds =
D (68967) vfs: 54
D (69478) vfs: socket_select returned 0 and the FDs are the following
D (69479) vfs: FDs in readfds =
D (69480) vfs: esp_vfs_select returns 0
D (69490) vfs: FDs in readfds =
D (69491) vfs: esp_vfs_select starts with nfds = 55
D (69492) vfs: FDs in readfds =
D (69492) vfs: 54
D (69503) vfs: calling socket_select with the following FDs
D (69504) vfs: FDs in readfds =
D (69504) vfs: 54
D (70015) vfs: socket_select returned 0 and the FDs are the following
D (70016) vfs: FDs in readfds =
D (70016) vfs: esp_vfs_select returns 0
D (70027) vfs: FDs in readfds =
D (70028) vfs: esp_vfs_select starts with nfds = 55
D (70028) vfs: FDs in readfds =
D (70040) vfs: 54
D (70041) vfs: calling socket_select with the following FDs
D (70042) vfs: FDs in readfds =
D (70042) vfs: 54
D (70553) vfs: socket_select returned 0 and the FDs are the following
D (70554) vfs: FDs in readfds =
D (70555) vfs: esp_vfs_select returns 0
D (70566) vfs: FDs in readfds =
D (70566) vfs: esp_vfs_select starts with nfds = 55
D (70567) vfs: FDs in readfds =
D (70578) vfs: 54
D (70578) vfs: calling socket_select with the following FDs
D (70579) vfs: FDs in readfds =
D (70590) vfs: 54
D (71091) vfs: socket_select returned 0 and the FDs are the following
D (71092) vfs: FDs in readfds =
D (71092) vfs: esp_vfs_select returns 0
D (71103) vfs: FDs in readfds =
D (71104) vfs: esp_vfs_select starts with nfds = 55
D (71104) vfs: FDs in readfds =
D (71115) vfs: 54
D (71116) vfs: calling socket_select with the following FDs
D (71116) vfs: FDs in readfds =
D (71117) vfs: 54
D (71628) vfs: socket_select returned 0 and the FDs are the following
D (71629) vfs: FDs in readfds =
D (71630) vfs: esp_vfs_select returns 0
D (71640) vfs: FDs in readfds =
D (71641) vfs: esp_vfs_select starts with nfds = 55
D (71642) vfs: FDs in readfds =
D (71642) vfs: 54
D (71653) vfs: calling socket_select with the following FDs
D (71654) vfs: FDs in readfds =
D (71654) vfs: 54
D (72165) vfs: socket_select returned 0 and the FDs are the following
D (72166) vfs: FDs in readfds =
D (72166) vfs: esp_vfs_select returns 0
D (72177) vfs: FDs in readfds =
D (72178) vfs: esp_vfs_select starts with nfds = 55
D (72178) vfs: FDs in readfds =
D (72190) vfs: 54
D (72191) vfs: calling socket_select with the following FDs
D (72191) vfs: FDs in readfds =
D (72192) vfs: 54
D (72692) vfs: socket_select returned 0 and the FDs are the following
D (72693) vfs: FDs in readfds =
D (72693) vfs: esp_vfs_select returns 0
D (72704) vfs: FDs in readfds =
D (72705) vfs: esp_vfs_select starts with nfds = 55
D (72705) vfs: FDs in readfds =
D (72716) vfs: 54
D (72717) vfs: calling socket_select with the following FDs
D (72718) vfs: FDs in readfds =
D (72718) vfs: 54
D (73229) vfs: socket_select returned 0 and the FDs are the following
D (73231) vfs: FDs in readfds =
D (73231) vfs: esp_vfs_select returns 0
D (73242) vfs: FDs in readfds =
D (73243) vfs: esp_vfs_select starts with nfds = 55
D (73243) vfs: FDs in readfds =
D (73254) vfs: 54
D (73255) vfs: calling socket_select with the following FDs
D (73255) vfs: FDs in readfds =
D (73266) vfs: 54
D (73767) vfs: socket_select returned 0 and the FDs are the following
D (73768) vfs: FDs in readfds =
D (73768) vfs: esp_vfs_select returns 0
D (73779) vfs: FDs in readfds =
D (73780) vfs: esp_vfs_select starts with nfds = 55
D (73780) vfs: FDs in readfds =
D (73791) vfs: 54
D (73792) vfs: calling socket_select with the following FDs
D (73793) vfs: FDs in readfds =
D (73793) vfs: 54
D (74304) vfs: socket_select returned 0 and the FDs are the following
D (74305) vfs: FDs in readfds =
D (74305) vfs: esp_vfs_select returns 0
D (74316) vfs: FDs in readfds =
D (74317) vfs: esp_vfs_select starts with nfds = 55
D (74317) vfs: FDs in readfds =
D (74328) vfs: 54
D (74329) vfs: calling socket_select with the following FDs
D (74330) vfs: FDs in readfds =
D (74330) vfs: 54
D (74841) vfs: socket_select returned 0 and the FDs are the following
D (74842) vfs: FDs in readfds =
D (74842) vfs: esp_vfs_select returns 0
D (74853) vfs: FDs in readfds =
D (74854) vfs: esp_vfs_select starts with nfds = 55
D (74854) vfs: FDs in readfds =
D (74865) vfs: 54
D (74866) vfs: calling socket_select with the following FDs
D (74867) vfs: FDs in readfds =
D (74868) vfs: 54
D (75368) vfs: socket_select returned 0 and the FDs are the following
D (75369) vfs: FDs in readfds =
D (75369) vfs: esp_vfs_select returns 0
D (75380) vfs: FDs in readfds =
D (75381) vfs: esp_vfs_select starts with nfds = 55
D (75381) vfs: FDs in readfds =
D (75392) vfs: 54
D (75393) vfs: calling socket_select with the following FDs
D (75394) vfs: FDs in readfds =
D (75394) vfs: 54
D (75905) vfs: socket_select returned 0 and the FDs are the following
D (75906) vfs: FDs in readfds =
D (75906) vfs: esp_vfs_select returns 0
D (75917) vfs: FDs in readfds =
D (75918) vfs: esp_vfs_select starts with nfds = 55
D (75918) vfs: FDs in readfds =
D (75929) vfs: 54
D (75930) vfs: calling socket_select with the following FDs
D (75931) vfs: FDs in readfds =
D (75931) vfs: 54
D (76442) vfs: socket_select returned 0 and the FDs are the following
D (76443) vfs: FDs in readfds =
D (76444) vfs: esp_vfs_select returns 0
D (76454) vfs: FDs in readfds =
D (76455) vfs: esp_vfs_select starts with nfds = 55
D (76456) vfs: FDs in readfds =
D (76456) vfs: 54
D (76467) vfs: calling socket_select with the following FDs
D (76468) vfs: FDs in readfds =
D (76468) vfs: 54
D (76979) vfs: socket_select returned 0 and the FDs are the following
D (76980) vfs: FDs in readfds =
D (76980) vfs: esp_vfs_select returns 0
D (76991) vfs: FDs in readfds =
D (76992) vfs: esp_vfs_select starts with nfds = 55
D (76992) vfs: FDs in readfds =
D (77003) vfs: 54
D (77004) vfs: calling socket_select with the following FDs
D (77004) vfs: FDs in readfds =
D (77005) vfs: 54
D (77516) vfs: socket_select returned 0 and the FDs are the following
D (77517) vfs: FDs in readfds =
D (77517) vfs: esp_vfs_select returns 0
D (77528) vfs: FDs in readfds =
D (77529) vfs: esp_vfs_select starts with nfds = 55
D (77529) vfs: FDs in readfds =
D (77540) vfs: 54
D (77541) vfs: calling socket_select with the following FDs
D (77542) vfs: FDs in readfds =
D (77542) vfs: 54
D (78053) vfs: socket_select returned 0 and the FDs are the following
D (78054) vfs: FDs in readfds =
D (78054) vfs: esp_vfs_select returns 0
D (78065) vfs: FDs in readfds =
D (78066) vfs: esp_vfs_select starts with nfds = 55
D (78066) vfs: FDs in readfds =
D (78077) vfs: 54
D (78078) vfs: calling socket_select with the following FDs
D (78078) vfs: FDs in readfds =
D (78079) vfs: 54
D (78590) vfs: socket_select returned 0 and the FDs are the following
D (78591) vfs: FDs in readfds =
D (78591) vfs: esp_vfs_select returns 0
D (78602) vfs: FDs in readfds =
D (78603) vfs: esp_vfs_select starts with nfds = 55
D (78604) vfs: FDs in readfds =
D (78604) vfs: 54
D (78615) vfs: calling socket_select with the following FDs
D (78616) vfs: FDs in readfds =
D (78616) vfs: 54
D (79127) vfs: socket_select returned 0 and the FDs are the following
D (79128) vfs: FDs in readfds =
D (79128) vfs: esp_vfs_select returns 0
D (79139) vfs: FDs in readfds =
D (79140) vfs: esp_vfs_select starts with nfds = 55
D (79140) vfs: FDs in readfds =
D (79151) vfs: 54
D (79152) vfs: calling socket_select with the following FDs
D (79152) vfs: FDs in readfds =
D (79153) vfs: 54
D (79664) vfs: socket_select returned 0 and the FDs are the following
D (79665) vfs: FDs in readfds =
D (79665) vfs: esp_vfs_select returns 0
D (79676) vfs: FDs in readfds =
D (79677) vfs: esp_vfs_select starts with nfds = 55
D (79677) vfs: FDs in readfds =
D (79688) vfs: 54
D (79689) vfs: calling socket_select with the following FDs
D (79689) vfs: FDs in readfds =
D (79690) vfs: 54
D (80201) vfs: socket_select returned 0 and the FDs are the following
D (80202) vfs: FDs in readfds =
D (80202) vfs: esp_vfs_select returns 0
D (80213) vfs: FDs in readfds =
D (80214) vfs: esp_vfs_select starts with nfds = 55
D (80214) vfs: FDs in readfds =
D (80225) vfs: 54
D (80226) vfs: calling socket_select with the following FDs
D (80226) vfs: FDs in readfds =
D (80227) vfs: 54
D (80738) vfs: socket_select returned 0 and the FDs are the following
D (80739) vfs: FDs in readfds =
D (80739) vfs: esp_vfs_select returns 0
D (80750) vfs: FDs in readfds =
D (80751) vfs: esp_vfs_select starts with nfds = 55
D (80751) vfs: FDs in readfds =
D (80752) vfs: 54
D (80763) vfs: calling socket_select with the following FDs
D (80763) vfs: FDs in readfds =
D (80764) vfs: 54
D (81275) vfs: socket_select returned 0 and the FDs are the following
D (81276) vfs: FDs in readfds =
D (81276) vfs: esp_vfs_select returns 0
D (81287) vfs: FDs in readfds =
D (81288) vfs: esp_vfs_select starts with nfds = 55
D (81288) vfs: FDs in readfds =
D (81299) vfs: 54
D (81300) vfs: calling socket_select with the following FDs
D (81301) vfs: FDs in readfds =
D (81301) vfs: 54
D (81812) vfs: socket_select returned 0 and the FDs are the following
D (81813) vfs: FDs in readfds =
D (81813) vfs: esp_vfs_select returns 0
D (81824) vfs: FDs in readfds =
D (81825) vfs: esp_vfs_select starts with nfds = 55
D (81825) vfs: FDs in readfds =
D (81836) vfs: 54
D (81837) vfs: calling socket_select with the following FDs
D (81837) vfs: FDs in readfds =
D (81838) vfs: 54
D (82349) vfs: socket_select returned 0 and the FDs are the following
D (82350) vfs: FDs in readfds =
D (82350) vfs: esp_vfs_select returns 0
D (82361) vfs: FDs in readfds =
D (82362) vfs: esp_vfs_select starts with nfds = 55
D (82362) vfs: FDs in readfds =
D (82373) vfs: 54
D (82374) vfs: calling socket_select with the following FDs
D (82374) vfs: FDs in readfds =
D (82375) vfs: 54
D (82886) vfs: socket_select returned 0 and the FDs are the following
D (82887) vfs: FDs in readfds =
D (82887) vfs: esp_vfs_select returns 0
D (82898) vfs: FDs in readfds =
D (82899) vfs: esp_vfs_select starts with nfds = 55
D (82899) vfs: FDs in readfds =
D (82910) vfs: 54
D (82911) vfs: calling socket_select with the following FDs
D (82912) vfs: FDs in readfds =
D (82912) vfs: 54
D (83423) vfs: socket_select returned 0 and the FDs are the following
D (83424) vfs: FDs in readfds =
D (83424) vfs: esp_vfs_select returns 0
D (83435) vfs: FDs in readfds =
D (83436) vfs: esp_vfs_select starts with nfds = 55
D (83436) vfs: FDs in readfds =
D (83447) vfs: 54
D (83448) vfs: calling socket_select with the following FDs
D (83449) vfs: FDs in readfds =
D (83449) vfs: 54
D (83960) vfs: socket_select returned 0 and the FDs are the following
D (83961) vfs: FDs in readfds =
D (83961) vfs: esp_vfs_select returns 0
D (83972) vfs: FDs in readfds =
D (83973) vfs: esp_vfs_select starts with nfds = 55
D (83973) vfs: FDs in readfds =
D (83984) vfs: 54
D (83985) vfs: calling socket_select with the following FDs
D (83986) vfs: FDs in readfds =
D (83986) vfs: 54
D (84497) vfs: socket_select returned 0 and the FDs are the following
D (84498) vfs: FDs in readfds =
D (84498) vfs: esp_vfs_select returns 0
D (84509) vfs: FDs in readfds =
D (84510) vfs: esp_vfs_select starts with nfds = 55
D (84511) vfs: FDs in readfds =
D (84521) vfs: 54
D (84522) vfs: calling socket_select with the following FDs
D (84523) vfs: FDs in readfds =
D (84523) vfs: 54
D (85035) vfs: socket_select returned 0 and the FDs are the following
D (85047) vfs: FDs in readfds =
D (85048) vfs: esp_vfs_select returns 0
D (85059) vfs: FDs in readfds =
D (85059) vfs: esp_vfs_select starts with nfds = 55
D (85060) vfs: FDs in readfds =
D (85071) vfs: 54
D (85071) vfs: calling socket_select with the following FDs
D (85072) vfs: FDs in readfds =
D (85083) vfs: 54
D (85583) vfs: socket_select returned 0 and the FDs are the following
D (85584) vfs: FDs in readfds =
D (85584) vfs: esp_vfs_select returns 0
D (85595) vfs: FDs in readfds =
D (85596) vfs: esp_vfs_select starts with nfds = 55
D (85596) vfs: FDs in readfds =
D (85607) vfs: 54
D (85608) vfs: calling socket_select with the following FDs
D (85608) vfs: FDs in readfds =
D (85609) vfs: 54
D (86120) vfs: socket_select returned 0 and the FDs are the following
D (86121) vfs: FDs in readfds =
D (86121) vfs: esp_vfs_select returns 0
D (86132) vfs: FDs in readfds =
D (86133) vfs: esp_vfs_select starts with nfds = 55
D (86133) vfs: FDs in readfds =
D (86144) vfs: 54
D (86145) vfs: calling socket_select with the following FDs
D (86145) vfs: FDs in readfds =
D (86146) vfs: 54
D (86657) vfs: socket_select returned 0 and the FDs are the following
D (86658) vfs: FDs in readfds =
D (86658) vfs: esp_vfs_select returns 0
D (86669) vfs: FDs in readfds =
D (86670) vfs: esp_vfs_select starts with nfds = 55
D (86670) vfs: FDs in readfds =
D (86681) vfs: 54
D (86682) vfs: calling socket_select with the following FDs
D (86683) vfs: FDs in readfds =
D (86683) vfs: 54
D (87194) vfs: socket_select returned 0 and the FDs are the following
D (87195) vfs: FDs in readfds =
D (87196) vfs: esp_vfs_select returns 0
D (87206) vfs: FDs in readfds =
D (87207) vfs: esp_vfs_select starts with nfds = 55
D (87208) vfs: FDs in readfds =
D (87208) vfs: 54
D (87219) vfs: calling socket_select with the following FDs
D (87220) vfs: FDs in readfds =
D (87220) vfs: 54
D (87731) vfs: socket_select returned 0 and the FDs are the following
D (87732) vfs: FDs in readfds =
D (87732) vfs: esp_vfs_select returns 0
D (87743) vfs: FDs in readfds =
D (87744) vfs: esp_vfs_select starts with nfds = 55
D (87744) vfs: FDs in readfds =
D (87755) vfs: 54
D (87756) vfs: calling socket_select with the following FDs
D (87757) vfs: FDs in readfds =
D (87757) vfs: 54
D (88268) vfs: socket_select returned 0 and the FDs are the following
D (88269) vfs: FDs in readfds =
D (88269) vfs: esp_vfs_select returns 0
D (88281) vfs: FDs in readfds =
D (88281) vfs: esp_vfs_select starts with nfds = 55
D (88282) vfs: FDs in readfds =
D (88283) vfs: 54
D (88294) vfs: calling socket_select with the following FDs
D (88294) vfs: FDs in readfds =
D (88295) vfs: 54
D (88795) vfs: socket_select returned 0 and the FDs are the following
D (88796) vfs: FDs in readfds =
D (88796) vfs: esp_vfs_select returns 0
D (88807) vfs: FDs in readfds =
D (88808) vfs: esp_vfs_select starts with nfds = 55
D (88809) vfs: FDs in readfds =
D (88819) vfs: 54
D (88820) vfs: calling socket_select with the following FDs
D (88821) vfs: FDs in readfds =
D (88821) vfs: 54
D (89332) vfs: socket_select returned 0 and the FDs are the following
D (89333) vfs: FDs in readfds =
D (89333) vfs: esp_vfs_select returns 0
D (89344) vfs: FDs in readfds =
D (89345) vfs: esp_vfs_select starts with nfds = 55
D (89346) vfs: FDs in readfds =
D (89346) vfs: 54
D (89357) vfs: calling socket_select with the following FDs
D (89358) vfs: FDs in readfds =
D (89358) vfs: 54
D (89869) vfs: socket_select returned 0 and the FDs are the following
D (89870) vfs: FDs in readfds =
D (89871) vfs: esp_vfs_select returns 0
D (89881) vfs: FDs in readfds =
D (89882) vfs: esp_vfs_select starts with nfds = 55
D (89883) vfs: FDs in readfds =
D (89893) vfs: 54
D (89894) vfs: calling socket_select with the following FDs
D (89895) vfs: FDs in readfds =
D (89895) vfs: 54
D (90406) vfs: socket_select returned 0 and the FDs are the following
D (90407) vfs: FDs in readfds =
D (90407) vfs: esp_vfs_select returns 0
D (90418) vfs: FDs in readfds =
D (90419) vfs: esp_vfs_select starts with nfds = 55
D (90419) vfs: FDs in readfds =
D (90430) vfs: 54
D (90432) vfs: calling socket_select with the following FDs
D (90432) vfs: FDs in readfds =
D (90433) vfs: 54
D (90933) vfs: socket_select returned 0 and the FDs are the following
D (90934) vfs: FDs in readfds =
D (90935) vfs: esp_vfs_select returns 0
D (90945) vfs: FDs in readfds =
D (90946) vfs: esp_vfs_select starts with nfds = 55
D (90947) vfs: FDs in readfds =
D (90957) vfs: 54
D (90958) vfs: calling socket_select with the following FDs
D (90959) vfs: FDs in readfds =
D (90959) vfs: 54
D (91470) vfs: socket_select returned 0 and the FDs are the following
D (91471) vfs: FDs in readfds =
D (91471) vfs: esp_vfs_select returns 0
D (91482) vfs: FDs in readfds =
D (91483) vfs: esp_vfs_select starts with nfds = 55
D (91483) vfs: FDs in readfds =
D (91494) vfs: 54
D (91495) vfs: calling socket_select with the following FDs
D (91496) vfs: FDs in readfds =
D (91496) vfs: 54
D (92007) vfs: socket_select returned 0 and the FDs are the following
D (92009) vfs: FDs in readfds =
D (92009) vfs: esp_vfs_select returns 0
D (92010) vfs: FDs in readfds =
D (92021) vfs: esp_vfs_select starts with nfds = 55
D (92022) vfs: FDs in readfds =
D (92022) vfs: 54
D (92033) vfs: calling socket_select with the following FDs
D (92034) vfs: FDs in readfds =
D (92034) vfs: 54
D (92535) vfs: socket_select returned 0 and the FDs are the following
D (92536) vfs: FDs in readfds =
D (92536) vfs: esp_vfs_select returns 0
D (92547) vfs: FDs in readfds =
D (92548) vfs: esp_vfs_select starts with nfds = 55
D (92548) vfs: FDs in readfds =
D (92559) vfs: 54
D (92560) vfs: calling socket_select with the following FDs
D (92560) vfs: FDs in readfds =
D (92561) vfs: 54
D (93072) vfs: socket_select returned 0 and the FDs are the following
D (93073) vfs: FDs in readfds =
D (93073) vfs: esp_vfs_select returns 0
D (93084) vfs: FDs in readfds =
D (93085) vfs: esp_vfs_select starts with nfds = 55
D (93085) vfs: FDs in readfds =
D (93096) vfs: 54
D (93097) vfs: calling socket_select with the following FDs
D (93098) vfs: FDs in readfds =
D (93098) vfs: 54
D (93609) vfs: socket_select returned 0 and the FDs are the following
D (93610) vfs: FDs in readfds =
D (93610) vfs: esp_vfs_select returns 0
D (93621) vfs: FDs in readfds =
D (93622) vfs: esp_vfs_select starts with nfds = 55
D (93622) vfs: FDs in readfds =
D (93633) vfs: 54
D (93634) vfs: calling socket_select with the following FDs
D (93634) vfs: FDs in readfds =
D (93635) vfs: 54
D (94146) vfs: socket_select returned 0 and the FDs are the following
D (94147) vfs: FDs in readfds =
D (94147) vfs: esp_vfs_select returns 0
D (94158) vfs: FDs in readfds =
D (94159) vfs: esp_vfs_select starts with nfds = 55
D (94160) vfs: FDs in readfds =
D (94160) vfs: 54
D (94171) vfs: calling socket_select with the following FDs
D (94172) vfs: FDs in readfds =
D (94172) vfs: 54
D (94683) vfs: socket_select returned 0 and the FDs are the following
D (94684) vfs: FDs in readfds =
D (94684) vfs: esp_vfs_select returns 0
D (94695) vfs: FDs in readfds =
D (94696) vfs: esp_vfs_select starts with nfds = 55
D (94696) vfs: FDs in readfds =
D (94707) vfs: 54
D (94708) vfs: calling socket_select with the following FDs
D (94708) vfs: FDs in readfds =
D (94709) vfs: 54
D (95220) vfs: socket_select returned 0 and the FDs are the following
D (95221) vfs: FDs in readfds =
D (95221) vfs: esp_vfs_select returns 0
D (95232) vfs: FDs in readfds =
D (95233) vfs: esp_vfs_select starts with nfds = 55
D (95234) vfs: FDs in readfds =
D (95234) vfs: 54
D (95245) vfs: calling socket_select with the following FDs
D (95246) vfs: FDs in readfds =
D (95246) vfs: 54
D (95757) vfs: socket_select returned 0 and the FDs are the following
D (95758) vfs: FDs in readfds =
D (95758) vfs: esp_vfs_select returns 0
D (95769) vfs: FDs in readfds =
D (95770) vfs: esp_vfs_select starts with nfds = 55
D (95770) vfs: FDs in readfds =
D (95781) vfs: 54
D (95782) vfs: calling socket_select with the following FDs
D (95782) vfs: FDs in readfds =
D (95783) vfs: 54
D (96049) vfs: socket_select returned 1 and the FDs are the following
D (96051) vfs: FDs in readfds =
D (96051) vfs: 54
D (96051) vfs: esp_vfs_select returns 1
D (96063) vfs: FDs in readfds =
D (96063) vfs: 54
D (96077) vfs: esp_vfs_select starts with nfds = 58
D (96078) vfs: FDs in readfds =
D (96088) vfs: 54
D (96088) vfs: 57
D (96089) vfs: calling socket_select with the following FDs
D (96090) vfs: FDs in readfds =
D (96101) vfs: 54
D (96102) vfs: 57
D (96102) vfs: socket_select returned 1 and the FDs are the following
D (96103) vfs: FDs in readfds =
D (96113) vfs: 57
D (96114) vfs: esp_vfs_select returns 1
D (96114) vfs: FDs in readfds =
D (96115) vfs: 57
D (96179) vfs: esp_vfs_select starts with nfds = 58
D (96180) vfs: FDs in readfds =
D (96181) vfs: 54
D (96181) vfs: 57
D (96192) vfs: calling socket_select with the following FDs
D (96194) vfs: FDs in readfds =
D (96194) vfs: 54
D (96194) vfs: 57
D (96583) vfs: socket_select returned 1 and the FDs are the following
D (96584) vfs: FDs in readfds =
D (96585) vfs: 57
D (96585) vfs: esp_vfs_select returns 1
D (96596) vfs: FDs in readfds =
D (96596) vfs: 57
D (96624) vfs: esp_vfs_select starts with nfds = 55
D (96626) vfs: FDs in readfds =
D (96626) vfs: 54
D (96627) vfs: calling socket_select with the following FDs
D (96638) vfs: FDs in readfds =
D (96638) vfs: 54
D (96986) vfs: socket_select returned 1 and the FDs are the following
D (96988) vfs: FDs in readfds =
D (96988) vfs: 54
D (96989) vfs: esp_vfs_select returns 1
D (96999) vfs: FDs in readfds =
D (97000) vfs: 54
D (97013) vfs: esp_vfs_select starts with nfds = 59
D (97014) vfs: FDs in readfds =
D (97025) vfs: 54
D (97025) vfs: 58
D (97026) vfs: calling socket_select with the following FDs
D (97026) vfs: FDs in readfds =
D (97037) vfs: 54
D (97038) vfs: 58
D (97038) vfs: socket_select returned 1 and the FDs are the following
D (97049) vfs: FDs in readfds =
D (97051) vfs: 58
D (97051) vfs: esp_vfs_select returns 1
D (97052) vfs: FDs in readfds =
D (97052) vfs: 58
D (97207) vfs: esp_vfs_select starts with nfds = 59
D (97218) vfs: FDs in readfds =
D (97219) vfs: 54
D (97219) vfs: 58
D (97220) vfs: calling socket_select with the following FDs
D (97231) vfs: FDs in readfds =
D (97232) vfs: 54
D (97232) vfs: 58
D (97356) vfs: socket_select returned 1 and the FDs are the following
D (97358) vfs: FDs in readfds =
D (97358) vfs: 58
D (97358) vfs: esp_vfs_select returns 1
D (97369) vfs: FDs in readfds =
D (97370) vfs: 58
D (97397) vfs: esp_vfs_select starts with nfds = 55
D (97398) vfs: FDs in readfds =
D (97398) vfs: 54
D (97399) vfs: calling socket_select with the following FDs
D (97410) vfs: FDs in readfds =
D (97410) vfs: 54
D (97911) vfs: socket_select returned 0 and the FDs are the following
D (97912) vfs: FDs in readfds =
D (97912) vfs: esp_vfs_select returns 0
D (97923) vfs: FDs in readfds =
D (97924) vfs: esp_vfs_select starts with nfds = 55
D (97925) vfs: FDs in readfds =
D (97925) vfs: 54
D (97936) vfs: calling socket_select with the following FDs
D (97937) vfs: FDs in readfds =
D (97937) vfs: 54
D (98448) vfs: socket_select returned 0 and the FDs are the following
D (98449) vfs: FDs in readfds =
D (98449) vfs: esp_vfs_select returns 0
D (98460) vfs: FDs in readfds =
D (98461) vfs: esp_vfs_select starts with nfds = 55
D (98462) vfs: FDs in readfds =
D (98472) vfs: 54
D (98473) vfs: calling socket_select with the following FDs
D (98474) vfs: FDs in readfds =
D (98474) vfs: 54
D (98985) vfs: socket_select returned 0 and the FDs are the following
D (98986) vfs: FDs in readfds =
D (98986) vfs: esp_vfs_select returns 0
D (98997) vfs: FDs in readfds =
D (98998) vfs: esp_vfs_select starts with nfds = 55
D (98998) vfs: FDs in readfds =
D (99009) vfs: 54
D (99010) vfs: calling socket_select with the following FDs
D (99011) vfs: FDs in readfds =
D (99011) vfs: 54
D (99522) vfs: socket_select returned 0 and the FDs are the following
D (99523) vfs: FDs in readfds =
D (99523) vfs: esp_vfs_select returns 0
D (99534) vfs: FDs in readfds =
D (99535) vfs: esp_vfs_select starts with nfds = 55
D (99536) vfs: FDs in readfds =
D (99536) vfs: 54
D (99547) vfs: calling socket_select with the following FDs
D (99548) vfs: FDs in readfds =
D (99548) vfs: 54
D (100059) vfs: socket_select returned 0 and the FDs are the following
D (100060) vfs: FDs in readfds =
D (100060) vfs: esp_vfs_select returns 0
D (100071) vfs: FDs in readfds =
D (100072) vfs: esp_vfs_select starts with nfds = 55
D (100072) vfs: FDs in readfds =
D (100083) vfs: 54
D (100084) vfs: calling socket_select with the following FDs
D (100085) vfs: FDs in readfds =
D (100085) vfs: 54
D (100596) vfs: socket_select returned 0 and the FDs are the following
D (100597) vfs: FDs in readfds =
D (100597) vfs: esp_vfs_select returns 0
D (100608) vfs: FDs in readfds =
D (100610) vfs: esp_vfs_select starts with nfds = 55
D (100610) vfs: FDs in readfds =
D (100611) vfs: 54
D (100622) vfs: calling socket_select with the following FDs
D (100623) vfs: FDs in readfds =
D (100623) vfs: 54
D (101124) vfs: socket_select returned 0 and the FDs are the following
D (101125) vfs: FDs in readfds =
D (101126) vfs: esp_vfs_select returns 0
D (101137) vfs: FDs in readfds =
D (101137) vfs: esp_vfs_select starts with nfds = 55
D (101138) vfs: FDs in readfds =
D (101149) vfs: 54
D (101149) vfs: calling socket_select with the following FDs
D (101150) vfs: FDs in readfds =
D (101151) vfs: 54
D (101661) vfs: socket_select returned 0 and the FDs are the following
D (101662) vfs: FDs in readfds =
D (101662) vfs: esp_vfs_select returns 0
D (101673) vfs: FDs in readfds =
D (101674) vfs: esp_vfs_select starts with nfds = 55
D (101674) vfs: FDs in readfds =
D (101685) vfs: 54
D (101686) vfs: calling socket_select with the following FDs
D (101687) vfs: FDs in readfds =
D (101687) vfs: 54
D (102198) vfs: socket_select returned 0 and the FDs are the following
D (102199) vfs: FDs in readfds =
D (102200) vfs: esp_vfs_select returns 0
D (102210) vfs: FDs in readfds =
D (102211) vfs: esp_vfs_select starts with nfds = 55
D (102212) vfs: FDs in readfds =
D (102222) vfs: 54
D (102223) vfs: calling socket_select with the following FDs
D (102224) vfs: FDs in readfds =
D (102224) vfs: 54
D (102735) vfs: socket_select returned 0 and the FDs are the following
D (102736) vfs: FDs in readfds =
D (102736) vfs: esp_vfs_select returns 0
D (102747) vfs: FDs in readfds =
D (102748) vfs: esp_vfs_select starts with nfds = 55
D (102749) vfs: FDs in readfds =
D (102750) vfs: 54
D (102761) vfs: calling socket_select with the following FDs
D (102761) vfs: FDs in readfds =
D (102762) vfs: 54
D (103207) vfs: socket_select returned 1 and the FDs are the following
D (103208) vfs: FDs in readfds =
D (103208) vfs: 54
D (103209) vfs: esp_vfs_select returns 1
D (103220) vfs: FDs in readfds =
D (103220) vfs: 54
D (103234) vfs: esp_vfs_select starts with nfds = 60
D (103235) vfs: FDs in readfds =
D (103246) vfs: 54
D (103246) vfs: 59
D (103247) vfs: calling socket_select with the following FDs
D (103248) vfs: FDs in readfds =
D (103259) vfs: 54
D (103259) vfs: 59
D (103259) vfs: socket_select returned 1 and the FDs are the following
D (103271) vfs: FDs in readfds =
D (103271) vfs: 59
D (103272) vfs: esp_vfs_select returns 1
D (103272) vfs: FDs in readfds =
D (103283) vfs: 59
D (103336) vfs: esp_vfs_select starts with nfds = 60
D (103336) vfs: FDs in readfds =
D (103337) vfs: 54
D (103347) vfs: 59
D (103348) vfs: calling socket_select with the following FDs
D (103349) vfs: FDs in readfds =
D (103349) vfs: 54
D (103360) vfs: 59
D (103860) vfs: socket_select returned 0 and the FDs are the following
D (103861) vfs: FDs in readfds =
D (103861) vfs: esp_vfs_select returns 0
D (103872) vfs: FDs in readfds =
D (103873) vfs: esp_vfs_select starts with nfds = 60
D (103874) vfs: FDs in readfds =
D (103884) vfs: 54
D (103885) vfs: 59
D (103886) vfs: calling socket_select with the following FDs
D (103887) vfs: FDs in readfds =
D (103898) vfs: 54
D (103898) vfs: 59
D (104399) vfs: socket_select returned 0 and the FDs are the following
D (104400) vfs: FDs in readfds =
D (104400) vfs: esp_vfs_select returns 0
D (104412) vfs: FDs in readfds =
D (104412) vfs: esp_vfs_select starts with nfds = 60
D (104413) vfs: FDs in readfds =
D (104424) vfs: 54
D (104424) vfs: 59
D (104425) vfs: calling socket_select with the following FDs
D (104425) vfs: FDs in readfds =
D (104436) vfs: 54
D (104437) vfs: 59
D (104937) vfs: socket_select returned 0 and the FDs are the following
D (104938) vfs: FDs in readfds =
D (104939) vfs: esp_vfs_select returns 0
D (104949) vfs: FDs in readfds =
D (104950) vfs: esp_vfs_select starts with nfds = 60
D (104951) vfs: FDs in readfds =
D (104961) vfs: 54
D (104961) vfs: 59
D (104962) vfs: calling socket_select with the following FDs
D (104963) vfs: FDs in readfds =
D (104974) vfs: 54
D (104974) vfs: 59
D (105475) vfs: socket_select returned 0 and the FDs are the following
D (105476) vfs: FDs in readfds =
D (105476) vfs: esp_vfs_select returns 0
D (105487) vfs: FDs in readfds =
D (105488) vfs: esp_vfs_select starts with nfds = 60
D (105489) vfs: FDs in readfds =
D (105499) vfs: 54
D (105500) vfs: 59
D (105500) vfs: calling socket_select with the following FDs
D (105503) vfs: FDs in readfds =
D (105504) vfs: 54
D (105514) vfs: 59
D (105560) vfs: socket_select returned 1 and the FDs are the following
D (105562) vfs: FDs in readfds =
D (105562) vfs: 59
D (105563) vfs: esp_vfs_select returns 1
D (105573) vfs: FDs in readfds =
D (105574) vfs: 59
D (105601) vfs: esp_vfs_select starts with nfds = 55
D (105602) vfs: FDs in readfds =
D (105603) vfs: 54
D (105614) vfs: calling socket_select with the following FDs
D (105614) vfs: FDs in readfds =
D (105615) vfs: 54
D (106115) vfs: socket_select returned 0 and the FDs are the following
D (106116) vfs: FDs in readfds =
D (106117) vfs: esp_vfs_select returns 0
D (106127) vfs: FDs in readfds =
D (106128) vfs: esp_vfs_select starts with nfds = 55
D (106129) vfs: FDs in readfds =
D (106140) vfs: 54
D (106140) vfs: calling socket_select with the following FDs
D (106141) vfs: FDs in readfds =
D (106142) vfs: 54
D (106652) vfs: socket_select returned 0 and the FDs are the following
D (106653) vfs: FDs in readfds =
D (106653) vfs: esp_vfs_select returns 0
D (106664) vfs: FDs in readfds =
D (106665) vfs: esp_vfs_select starts with nfds = 55
D (106666) vfs: FDs in readfds =
D (106677) vfs: 54
D (106678) vfs: calling socket_select with the following FDs
D (106679) vfs: FDs in readfds =
D (106690) vfs: 54
D (106690) vfs: socket_select returned 1 and the FDs are the following
D (106691) vfs: FDs in readfds =
D (106702) vfs: 54
D (106702) vfs: esp_vfs_select returns 1
D (106703) vfs: FDs in readfds =
D (106703) vfs: 54
D (106717) vfs: esp_vfs_select starts with nfds = 61
D (106728) vfs: FDs in readfds =
D (106728) vfs: 54
D (106728) vfs: 60
D (106729) vfs: calling socket_select with the following FDs
D (106740) vfs: FDs in readfds =
D (106741) vfs: 54
D (106741) vfs: 60
D (106741) vfs: socket_select returned 1 and the FDs are the following
D (106753) vfs: FDs in readfds =
D (106754) vfs: 60
D (106754) vfs: esp_vfs_select returns 1
D (106765) vfs: FDs in readfds =
D (106766) vfs: 60

View File

@ -1,151 +0,0 @@
ESP-ROM:esp32c3-20200918
Build:Sep 18 2020
rst:0xc (RTC_SW_CPU_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
Saved PC:0x40381f24
SPIWP:0xee
mode:DOUT, clock div:2
load:0x3fcd6100,len:0x14
load:0x3fcd6114,len:0x11d8
load:0x403d0000,len:0xd0c
load:0x403d2000,len:0x1b84
entry 0x403d0062
␛[0;33mW (37) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
␛[0;33mW (184) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
␛[0;33mW (196) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.␛[0m
Enter test name: Got test name: test_abort
abort() was called at PC 0x42003863 on core 0
Core 0 register dump:
MEPC : 0x403825fa RA : 0x40382a3e SP : 0x3fc8cd5c GP : 0x3fc887e0
TP : 0xa5a5a5a5 T0 : 0x37363534 T1 : 0x7271706f T2 : 0x33323130
S0/FP : 0x00000004 S1 : 0x3fc8cdc0 A0 : 0x3fc8cd88 A1 : 0x3fc8cdbe
A2 : 0x00000000 A3 : 0x3fc8cdb5 A4 : 0x00000001 A5 : 0x3fc8a000
A6 : 0x7a797877 A7 : 0x76757473 S2 : 0xa5a5a5a5 S3 : 0xa5a5a5a5
S4 : 0xa5a5a5a5 S5 : 0xa5a5a5a5 S6 : 0xa5a5a5a5 S7 : 0xa5a5a5a5
S8 : 0xa5a5a5a5 S9 : 0xa5a5a5a5 S10 : 0xa5a5a5a5 S11 : 0xa5a5a5a5
T3 : 0x6e6d6c6b T4 : 0x6a696867 T5 : 0x66656463 T6 : 0x62613938
MSTATUS : 0x00001881 MTVEC : 0x40380001 MCAUSE : 0x00000007 MTVAL : 0x00000000
MHARTID : 0x00000000
Stack memory:
3fc8cd5c: 0xa5a5a5a5 0x3fc8ce34 0x3fc8cdbc 0x403870ce 0x00000001 0x00000004 0x3fc8aaf4 0x3fc893b0
3fc8cd7c: 0x3fc8cdc0 0x3fc893cc 0x3fc8cdbc 0x726f6261 0x20292874 0x20736177 0x6c6c6163 0x61206465
3fc8cd9c: 0x43502074 0x34783020 0x33303032 0x20333638 0x63206e6f 0x2065726f 0x00000030 0x3fc80000
3fc8cdbc: 0xa5a50030 0x30303234 0x33363833 0x42003900 0x00000001 0xa5a5a5a5 0x3fc89cc0 0x42003866
3fc8cddc: 0x3fc8a000 0x0000000a 0x420018fc 0x420039ea 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0x42012ea6
3fc8cdfc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0x40384206 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8ce1c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0x00000154 0x3fc8cd4c 0x00000349
3fc8ce3c: 0x3fc89964 0x3fc89964 0x3fc8ce34 0x3fc8995c 0x00000018 0xdf6337cf 0xbccacfdd 0x3fc8ce34
3fc8ce5c: 0x00000000 0x00000001 0x3fc8be30 0x6e69616d 0xfa3b3d00 0x3f2a8cb8 0x002d1f13 0x00000000
3fc8ce7c: 0x3fc8ce20 0x00000001 0x00000000 0x00000000 0x00000000 0x0000000b 0x3fc8a950 0x3fc8a9b8
3fc8ce9c: 0x3fc8aa20 0x00000000 0x00000000 0x00000001 0x00000000 0x00000000 0x00000000 0x42005b6c
3fc8cebc: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
3fc8cedc: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
3fc8cefc: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
3fc8cf1c: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
3fc8cf3c: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
3fc8cf5c: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
3fc8cf7c: 0x00000000 0x00000000 0x3fc8ce00 0x00000900 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8cf9c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8cfbc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8cfdc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8cffc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d01c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d03c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d05c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d07c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d09c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d0bc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d0dc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d0fc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d11c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d13c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
ELF file SHA256: 72e88c31482c8900
Rebooting...
x<EFBFBD>jESP-ROM:esp32c3-20200918
Build:Sep 18 2020
rst:0xc (RTC_SW_CPU_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
Saved PC:0x40381f24
SPIWP:0xee
mode:DOUT, clock div:2
load:0x3fcd6100,len:0x14
load:0x3fcd6114,len:0x11d8
load:0x403d0000,len:0xd0c
load:0x403d2000,len:0x1b84
entry 0x403d0062
␛[0;33mW (37) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
␛[0;33mW (184) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
␛[0;33mW (196) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.␛[0m
Enter test name: Got test name: test_illegal_instruction
Guru Meditation Error: Core 0 panic'ed (Illegal instruction). Exception was unhandled.
Core 0 register dump:
MEPC : 0x420037ce RA : 0x42003a18 SP : 0x3fc8cdec GP : 0x3fc887e0
TP : 0xa5a5a5a5 T0 : 0x7f7f7f7f T1 : 0x7f7f7f7f T2 : 0xffffffff
S0/FP : 0x3fc89cc0 S1 : 0xa5a5a5a5 A0 : 0x00000000 A1 : 0x3c022b0c
A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000000 A5 : 0x7f7f7f7f
A6 : 0x420019ee A7 : 0xa5a5a5a5 S2 : 0xa5a5a5a5 S3 : 0xa5a5a5a5
S4 : 0xa5a5a5a5 S5 : 0xa5a5a5a5 S6 : 0xa5a5a5a5 S7 : 0xa5a5a5a5
S8 : 0xa5a5a5a5 S9 : 0xa5a5a5a5 S10 : 0xa5a5a5a5 S11 : 0xa5a5a5a5
T3 : 0xa5a5a5a5 T4 : 0xa5a5a5a5 T5 : 0xa5a5a5a5 T6 : 0xa5a5a5a5
MSTATUS : 0x00001881 MTVEC : 0x40380001 MCAUSE : 0x00000002 MTVAL : 0x00000000
MHARTID : 0x00000000
Stack memory:
3fc8cdec: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0x42012ea6 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0x40384206
3fc8ce0c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8ce2c: 0xa5a5a5a5 0x00000154 0x3fc8cd4c 0x0000051e 0x3fc89964 0x3fc89964 0x3fc8ce34 0x3fc8995c
3fc8ce4c: 0x00000018 0xdf6337cf 0xbccacfdd 0x3fc8ce34 0x00000000 0x00000001 0x3fc8be30 0x6e69616d
3fc8ce6c: 0xfa3b3d00 0x3f2a8cb8 0x002d1f13 0x00000000 0x3fc8ce20 0x00000001 0x00000000 0x00000000
3fc8ce8c: 0x00000000 0x0000000b 0x3fc8a950 0x3fc8a9b8 0x3fc8aa20 0x00000000 0x00000000 0x00000001
3fc8ceac: 0x00000000 0x00000000 0x00000000 0x42005b6c 0x00000000 0x00000000 0x00000000 0x00000000
3fc8cecc: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
3fc8ceec: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
3fc8cf0c: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
3fc8cf2c: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
3fc8cf4c: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
3fc8cf6c: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x3fc8ce00 0x00000900
3fc8cf8c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8cfac: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8cfcc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8cfec: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d00c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d02c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d04c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d06c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d08c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d0ac: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d0cc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d0ec: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d10c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d12c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d14c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d16c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d18c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d1ac: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
3fc8d1cc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
ELF file SHA256: 72e88c31482c8900
Rebooting...
x<EFBFBD>jESP-ROM:esp32c3-20200918
Build:Sep 18 2020
rst:0xc (RTC_SW_CPU_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
Saved PC:0x40381f24
SPIWP:0xee
mode:DOUT, clock div:2
load:0x3fcd6100,len:0x14
load:0x3fcd6114,len:0x11d8
load:0x403d0000,len:0xd0c
load:0x403d2000,len:0x1b84
entry 0x403d0062
␛[0;33mW (37) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
␛[0;33mW (184) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
␛[0;33mW (196) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.␛[0m
Enter test name:

View File

@ -1,79 +0,0 @@
ESP-ROM:esp32c3-20200918
Build:Sep 18 2020
rst:0xc (RTC_SW_CPU_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
Saved PC:0x40381f24
SPIWP:0xee
mode:DOUT, clock div:2
load:0x3fcd6100,len:0x14
load:0x3fcd6114,len:0x11d8
load:0x403d0000,len:0xd0c
load:0x403d2000,len:0x1b84
entry 0x403d0062
␛[0;33mW (37) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
␛[0;33mW (184) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
␛[0;33mW (196) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.␛[0m
Enter test name: Got test name: test_abort
abort() was called at PC 0x42003863 on core 0
Core 0 register dump:
MEPC : 0x403825fa RA : 0x40382a3e SP : 0x3fc8cd5c GP : 0x3fc887e0
TP : 0xa5a5a5a5 T0 : 0x37363534 T1 : 0x7271706f T2 : 0x33323130
S0/FP : 0x00000004 S1 : 0x3fc8cdc0 A0 : 0x3fc8cd88 A1 : 0x3fc8cdbe
A2 : 0x00000000 A3 : 0x3fc8cdb5 A4 : 0x00000001 A5 : 0x3fc8a000
A6 : 0x7a797877 A7 : 0x76757473 S2 : 0xa5a5a5a5 S3 : 0xa5a5a5a5
S4 : 0xa5a5a5a5 S5 : 0xa5a5a5a5 S6 : 0xa5a5a5a5 S7 : 0xa5a5a5a5
S8 : 0xa5a5a5a5 S9 : 0xa5a5a5a5 S10 : 0xa5a5a5a5 S11 : 0xa5a5a5a5
T3 : 0x6e6d6c6b T4 : 0x6a696867 T5 : 0x66656463 T6 : 0x62613938
MSTATUS : 0x00001881 MTVEC : 0x40380001 MCAUSE : 0x00000007 MTVAL : 0x00000000
MHARTID : 0x00000000
0x403825fa in ?? ()
#0 0x403825fa in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
ELF file SHA256: 72e88c31482c8900
Rebooting...
x<EFBFBD>jESP-ROM:esp32c3-20200918
Build:Sep 18 2020
rst:0xc (RTC_SW_CPU_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
Saved PC:0x40381f24
SPIWP:0xee
mode:DOUT, clock div:2
load:0x3fcd6100,len:0x14
load:0x3fcd6114,len:0x11d8
load:0x403d0000,len:0xd0c
load:0x403d2000,len:0x1b84
entry 0x403d0062
␛[0;33mW (37) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
␛[0;33mW (184) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
␛[0;33mW (196) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.␛[0m
Enter test name: Got test name: test_illegal_instruction
Guru Meditation Error: Core 0 panic'ed (Illegal instruction). Exception was unhandled.
Core 0 register dump:
MEPC : 0x420037ce RA : 0x42003a18 SP : 0x3fc8cdec GP : 0x3fc887e0
TP : 0xa5a5a5a5 T0 : 0x7f7f7f7f T1 : 0x7f7f7f7f T2 : 0xffffffff
S0/FP : 0x3fc89cc0 S1 : 0xa5a5a5a5 A0 : 0x00000000 A1 : 0x3c022b0c
A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000000 A5 : 0x7f7f7f7f
A6 : 0x420019ee A7 : 0xa5a5a5a5 S2 : 0xa5a5a5a5 S3 : 0xa5a5a5a5
S4 : 0xa5a5a5a5 S5 : 0xa5a5a5a5 S6 : 0xa5a5a5a5 S7 : 0xa5a5a5a5
S8 : 0xa5a5a5a5 S9 : 0xa5a5a5a5 S10 : 0xa5a5a5a5 S11 : 0xa5a5a5a5
T3 : 0xa5a5a5a5 T4 : 0xa5a5a5a5 T5 : 0xa5a5a5a5 T6 : 0xa5a5a5a5
MSTATUS : 0x00001881 MTVEC : 0x40380001 MCAUSE : 0x00000002 MTVAL : 0x00000000
MHARTID : 0x00000000
0x420037ce in ?? ()
#0 0x420037ce in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
ELF file SHA256: 72e88c31482c8900
Rebooting...
x<EFBFBD>jESP-ROM:esp32c3-20200918
Build:Sep 18 2020
rst:0xc (RTC_SW_CPU_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
Saved PC:0x40381f24
SPIWP:0xee
mode:DOUT, clock div:2
load:0x3fcd6100,len:0x14
load:0x3fcd6114,len:0x11d8
load:0x403d0000,len:0xd0c
load:0x403d2000,len:0x1b84
entry 0x403d0062
␛[0;33mW (37) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
␛[0;33mW (184) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
␛[0;33mW (196) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.␛[0m
Enter test name: