├── tests ├── __init__.py ├── test_apps │ ├── main │ │ ├── CMakeLists.txt │ │ └── test_core_dump.c │ ├── built_apps │ │ ├── esp32.elf │ │ ├── esp32_bin.elf │ │ ├── esp32c3.elf │ │ ├── esp32c6.elf │ │ ├── esp32p4.elf │ │ ├── esp32c3_bin.elf │ │ └── esp32s3_bin.elf │ ├── sdkconfig.defaults.esp32s3 │ ├── sdkconfig.defaults │ ├── README.md │ └── CMakeLists.txt ├── build_espcoredump.sh ├── README.md ├── esp32c3 │ ├── coredump_bin.b64 │ ├── coredump.b64 │ ├── expected_output_bin │ └── expected_output ├── esp32c6 │ ├── coredump.b64 │ └── expected_output ├── esp32 │ ├── coredump_bin.b64 │ └── coredump.b64 ├── esp32p4 │ └── coredump.b64 ├── test_espcoredump.py └── esp32s3 │ └── coredump_bin.b64 ├── MANIFEST.in ├── esp_coredump ├── corefile │ ├── soc_headers │ │ ├── __init__.py │ │ ├── esp32.py │ │ ├── esp32c2.py │ │ ├── esp32c3.py │ │ ├── esp32c5.py │ │ ├── esp32c6.py │ │ ├── esp32c61.py │ │ ├── esp32h2.py │ │ ├── esp32h21.py │ │ ├── esp32h4.py │ │ ├── esp32s2.py │ │ ├── esp32s3.py │ │ └── esp32p4.py │ ├── _parse_soc_header.py │ ├── riscv.py │ ├── __init__.py │ ├── gdb.py │ ├── xtensa.py │ └── elf.py ├── tools.py ├── __init__.py ├── __main__.py └── cli_ext.py ├── .github └── workflows │ ├── dangerjs.yml │ ├── new_issues.yml │ ├── issue_comment.yml │ ├── new_prs.yml │ ├── create_gh_release.yaml │ └── release_pypi.yml ├── .pre-commit-config.yaml ├── pyproject.toml ├── README.md ├── .gitlab-ci.yml ├── CHANGELOG.md ├── .flake8 ├── .gitignore └── LICENSE /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include README.md LICENSE 2 | -------------------------------------------------------------------------------- /tests/test_apps/main/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | idf_component_register(SRC_DIRS ".") 2 | -------------------------------------------------------------------------------- /tests/test_apps/built_apps/esp32.elf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/espressif/esp-coredump/HEAD/tests/test_apps/built_apps/esp32.elf -------------------------------------------------------------------------------- /tests/test_apps/built_apps/esp32_bin.elf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/espressif/esp-coredump/HEAD/tests/test_apps/built_apps/esp32_bin.elf -------------------------------------------------------------------------------- /tests/test_apps/built_apps/esp32c3.elf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/espressif/esp-coredump/HEAD/tests/test_apps/built_apps/esp32c3.elf -------------------------------------------------------------------------------- /tests/test_apps/built_apps/esp32c6.elf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/espressif/esp-coredump/HEAD/tests/test_apps/built_apps/esp32c6.elf -------------------------------------------------------------------------------- /tests/test_apps/built_apps/esp32p4.elf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/espressif/esp-coredump/HEAD/tests/test_apps/built_apps/esp32p4.elf -------------------------------------------------------------------------------- /tests/test_apps/built_apps/esp32c3_bin.elf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/espressif/esp-coredump/HEAD/tests/test_apps/built_apps/esp32c3_bin.elf -------------------------------------------------------------------------------- /tests/test_apps/built_apps/esp32s3_bin.elf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/espressif/esp-coredump/HEAD/tests/test_apps/built_apps/esp32s3_bin.elf -------------------------------------------------------------------------------- /esp_coredump/corefile/soc_headers/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | # 6 | -------------------------------------------------------------------------------- /tests/test_apps/sdkconfig.defaults.esp32s3: -------------------------------------------------------------------------------- 1 | CONFIG_ESP_COREDUMP_DATA_FORMAT_BIN=y 2 | CONFIG_SPIRAM=y 3 | CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y 4 | CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y 5 | -------------------------------------------------------------------------------- /esp_coredump/corefile/soc_headers/esp32.py: -------------------------------------------------------------------------------- 1 | SOC_DRAM_LOW = 0x3ffae000 2 | SOC_DRAM_HIGH = 0x40000000 3 | SOC_IRAM_LOW = 0x40080000 4 | SOC_IRAM_HIGH = 0x400a0000 5 | SOC_RTC_DRAM_LOW = 0x3ff80000 6 | SOC_RTC_DRAM_HIGH = 0x3ff82000 7 | SOC_RTC_DATA_LOW = 0x50000000 8 | SOC_RTC_DATA_HIGH = 0x50002000 9 | SOC_EXTRAM_DATA_LOW = 0x3f800000 10 | SOC_EXTRAM_DATA_HIGH = 0x3fc00000 11 | -------------------------------------------------------------------------------- /esp_coredump/corefile/soc_headers/esp32c2.py: -------------------------------------------------------------------------------- 1 | SOC_IRAM_LOW = 0x4037c000 2 | SOC_IRAM_HIGH = 0x403c0000 3 | SOC_DRAM_LOW = 0x3fca0000 4 | SOC_DRAM_HIGH = 0x3fce0000 5 | SOC_RTC_DATA_LOW = 0xffffffff 6 | SOC_RTC_DATA_HIGH = 0xffffffff 7 | SOC_RTC_DRAM_LOW = 0xffffffff 8 | SOC_RTC_DRAM_HIGH = 0xffffffff 9 | SOC_EXTRAM_DATA_LOW = 0xffffffff 10 | SOC_EXTRAM_DATA_HIGH = 0xffffffff 11 | -------------------------------------------------------------------------------- /esp_coredump/corefile/soc_headers/esp32c3.py: -------------------------------------------------------------------------------- 1 | SOC_IRAM_LOW = 0x4037c000 2 | SOC_IRAM_HIGH = 0x403e0000 3 | SOC_DRAM_LOW = 0x3fc80000 4 | SOC_DRAM_HIGH = 0x3fce0000 5 | SOC_RTC_DRAM_LOW = 0x50000000 6 | SOC_RTC_DRAM_HIGH = 0x50002000 7 | SOC_RTC_DATA_LOW = 0x50000000 8 | SOC_RTC_DATA_HIGH = 0x50002000 9 | SOC_EXTRAM_DATA_LOW = 0xffffffff 10 | SOC_EXTRAM_DATA_HIGH = 0xffffffff 11 | -------------------------------------------------------------------------------- /esp_coredump/corefile/soc_headers/esp32c5.py: -------------------------------------------------------------------------------- 1 | SOC_IRAM_LOW = 0x40800000 2 | SOC_IRAM_HIGH = 0x40860000 3 | SOC_DRAM_LOW = 0x40800000 4 | SOC_DRAM_HIGH = 0x40860000 5 | SOC_RTC_DRAM_LOW = 0x50000000 6 | SOC_RTC_DRAM_HIGH = 0x50004000 7 | SOC_RTC_DATA_LOW = 0x50000000 8 | SOC_RTC_DATA_HIGH = 0x50004000 9 | SOC_EXTRAM_DATA_LOW = 0x42000000 10 | SOC_EXTRAM_DATA_HIGH = 0x44000000 11 | -------------------------------------------------------------------------------- /esp_coredump/corefile/soc_headers/esp32c6.py: -------------------------------------------------------------------------------- 1 | SOC_IRAM_LOW = 0x40800000 2 | SOC_IRAM_HIGH = 0x40880000 3 | SOC_DRAM_LOW = 0x40800000 4 | SOC_DRAM_HIGH = 0x40880000 5 | SOC_RTC_DRAM_LOW = 0x50000000 6 | SOC_RTC_DRAM_HIGH = 0x50004000 7 | SOC_RTC_DATA_LOW = 0x50000000 8 | SOC_RTC_DATA_HIGH = 0x50004000 9 | SOC_EXTRAM_DATA_LOW = 0xffffffff 10 | SOC_EXTRAM_DATA_HIGH = 0xffffffff 11 | -------------------------------------------------------------------------------- /esp_coredump/corefile/soc_headers/esp32c61.py: -------------------------------------------------------------------------------- 1 | SOC_IRAM_LOW = 0x40800000 2 | SOC_IRAM_HIGH = 0x40850000 3 | SOC_DRAM_LOW = 0x40800000 4 | SOC_DRAM_HIGH = 0x40850000 5 | SOC_RTC_DRAM_LOW = 0xffffffff 6 | SOC_RTC_DRAM_HIGH = 0xffffffff 7 | SOC_RTC_DATA_LOW = 0xffffffff 8 | SOC_RTC_DATA_HIGH = 0xffffffff 9 | SOC_EXTRAM_DATA_LOW = 0x42000000 10 | SOC_EXTRAM_DATA_HIGH = 0x44000000 11 | -------------------------------------------------------------------------------- /esp_coredump/corefile/soc_headers/esp32h2.py: -------------------------------------------------------------------------------- 1 | SOC_IRAM_LOW = 0x40800000 2 | SOC_IRAM_HIGH = 0x40850000 3 | SOC_DRAM_LOW = 0x40800000 4 | SOC_DRAM_HIGH = 0x40850000 5 | SOC_RTC_DRAM_LOW = 0x50000000 6 | SOC_RTC_DRAM_HIGH = 0x50001000 7 | SOC_RTC_DATA_LOW = 0x50000000 8 | SOC_RTC_DATA_HIGH = 0x50001000 9 | SOC_EXTRAM_DATA_LOW = 0xffffffff 10 | SOC_EXTRAM_DATA_HIGH = 0xffffffff 11 | -------------------------------------------------------------------------------- /esp_coredump/corefile/soc_headers/esp32h21.py: -------------------------------------------------------------------------------- 1 | SOC_IRAM_LOW = 0x40800000 2 | SOC_IRAM_HIGH = 0x40850000 3 | SOC_DRAM_LOW = 0x40800000 4 | SOC_DRAM_HIGH = 0x40850000 5 | SOC_RTC_DRAM_LOW = 0x50000000 6 | SOC_RTC_DRAM_HIGH = 0x50001000 7 | SOC_RTC_DATA_LOW = 0x50000000 8 | SOC_RTC_DATA_HIGH = 0x50001000 9 | SOC_EXTRAM_DATA_LOW = 0xffffffff 10 | SOC_EXTRAM_DATA_HIGH = 0xffffffff 11 | -------------------------------------------------------------------------------- /esp_coredump/corefile/soc_headers/esp32h4.py: -------------------------------------------------------------------------------- 1 | SOC_IRAM_LOW = 0x40810000 2 | SOC_IRAM_HIGH = 0x40860000 3 | SOC_DRAM_LOW = 0x40810000 4 | SOC_DRAM_HIGH = 0x40860000 5 | SOC_RTC_DRAM_LOW = 0x50000000 6 | SOC_RTC_DRAM_HIGH = 0x50004000 7 | SOC_RTC_DATA_LOW = 0x50000000 8 | SOC_RTC_DATA_HIGH = 0x50004000 9 | SOC_EXTRAM_DATA_LOW = 0x42000000 10 | SOC_EXTRAM_DATA_HIGH = 0x44000000 11 | -------------------------------------------------------------------------------- /esp_coredump/corefile/soc_headers/esp32s2.py: -------------------------------------------------------------------------------- 1 | SOC_IRAM_LOW = 0x40020000 2 | SOC_IRAM_HIGH = 0x40070000 3 | SOC_DRAM_LOW = 0x3ffb0000 4 | SOC_DRAM_HIGH = 0x40000000 5 | SOC_RTC_DRAM_LOW = 0x3ff9e000 6 | SOC_RTC_DRAM_HIGH = 0x3ffa0000 7 | SOC_RTC_DATA_LOW = 0x50000000 8 | SOC_RTC_DATA_HIGH = 0x50002000 9 | SOC_EXTRAM_DATA_LOW = 0x3f500000 10 | SOC_EXTRAM_DATA_HIGH = 0x3ff80000 11 | -------------------------------------------------------------------------------- /esp_coredump/corefile/soc_headers/esp32s3.py: -------------------------------------------------------------------------------- 1 | SOC_IRAM_LOW = 0x40370000 2 | SOC_IRAM_HIGH = 0x403e0000 3 | SOC_DRAM_LOW = 0x3fc88000 4 | SOC_DRAM_HIGH = 0x3fd00000 5 | SOC_RTC_DRAM_LOW = 0x600fe000 6 | SOC_RTC_DRAM_HIGH = 0x60100000 7 | SOC_RTC_DATA_LOW = 0x50000000 8 | SOC_RTC_DATA_HIGH = 0x50002000 9 | SOC_EXTRAM_DATA_LOW = 0x3c000000 10 | SOC_EXTRAM_DATA_HIGH = 0x3e000000 11 | -------------------------------------------------------------------------------- /esp_coredump/tools.py: -------------------------------------------------------------------------------- 1 | # 2 | # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | # 6 | import json 7 | 8 | 9 | class FatalError(Exception): 10 | pass 11 | 12 | 13 | def load_json_from_file(filename: str) -> dict: 14 | with open(filename, 'r') as file: 15 | data: dict = json.load(file) 16 | return data 17 | -------------------------------------------------------------------------------- /esp_coredump/corefile/soc_headers/esp32p4.py: -------------------------------------------------------------------------------- 1 | SOC_IRAM_LOW = 0x4ff00000 2 | SOC_IRAM_HIGH = 0x4ffc0000 3 | SOC_DRAM_LOW = 0x4ff00000 4 | SOC_DRAM_HIGH = 0x4ffc0000 5 | SOC_RTC_IRAM_LOW = 0x50108000 6 | SOC_RTC_IRAM_HIGH = 0x50110000 7 | SOC_RTC_DRAM_LOW = 0x50108000 8 | SOC_RTC_DRAM_HIGH = 0x50110000 9 | SOC_RTC_DATA_LOW = 0x50108000 10 | SOC_RTC_DATA_HIGH = 0x50110000 11 | SOC_EXTRAM_DATA_LOW = 0x48000000 12 | SOC_EXTRAM_DATA_HIGH = 0x4c000000 13 | -------------------------------------------------------------------------------- /tests/test_apps/sdkconfig.defaults: -------------------------------------------------------------------------------- 1 | CONFIG_ESP_COREDUMP_ENABLE_TO_UART=y 2 | CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y 3 | CONFIG_ESP_COREDUMP_CHECKSUM_CRC32=y 4 | CONFIG_ESP_COREDUMP_ENABLE=y 5 | CONFIG_ESP_COREDUMP_MAX_TASKS_NUM=64 6 | CONFIG_ESP_COREDUMP_UART_DELAY=0 7 | CONFIG_ESP_COREDUMP_DECODE_DISABLE=y 8 | CONFIG_ESP_COREDUMP_DECODE="disable" 9 | 10 | # Settings for reproducible builds 11 | CONFIG_APP_COMPILE_TIME_DATE=n 12 | CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y 13 | CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=1 14 | CONFIG_BOOTLOADER_LOG_LEVEL_ERROR=y 15 | -------------------------------------------------------------------------------- /.github/workflows/dangerjs.yml: -------------------------------------------------------------------------------- 1 | name: DangerJS Check 2 | on: 3 | pull_request_target: 4 | types: [opened, edited, reopened, synchronize] 5 | 6 | permissions: 7 | pull-requests: write 8 | contents: write 9 | 10 | jobs: 11 | pull-request-style-linter: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Check out PR head 15 | uses: actions/checkout@v3 16 | with: 17 | ref: ${{ github.event.pull_request.head.sha }} 18 | 19 | - name: DangerJS pull request linter 20 | uses: espressif/github-actions/danger_pr_review@master 21 | env: 22 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 23 | -------------------------------------------------------------------------------- /tests/test_apps/README.md: -------------------------------------------------------------------------------- 1 | | Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-S2 | ESP32-S3 | ESP32-P4 | 2 | | ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | 3 | 4 | # ESP-IDF Coredump Test ELFs 5 | 6 | This directory includes the test elf files for the idf coredump output test (`built_apps` folder). 7 | 8 | ## Build Process 9 | 10 | To build the apps use the following commands: 11 | 12 | ```shell 13 | $ export IDF_PATH= 14 | $ loc=$(pwd) 15 | $ bash $IDF_PATH/install.sh 16 | $ . $IDF_PATH/export.sh 17 | $ bash ./build_espcoredump.sh $loc 18 | ``` 19 | -------------------------------------------------------------------------------- /.github/workflows/new_issues.yml: -------------------------------------------------------------------------------- 1 | name: Sync issues to Jira 2 | 3 | # This workflow will be triggered when a new issue is opened 4 | on: issues 5 | 6 | jobs: 7 | sync_issues_to_jira: 8 | name: Sync issues to Jira 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@master 12 | - name: Sync GitHub issues to Jira project 13 | uses: espressif/github-actions/sync_issues_to_jira@master 14 | env: 15 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 16 | JIRA_PASS: ${{ secrets.JIRA_PASS }} 17 | JIRA_PROJECT: IDFGH 18 | JIRA_COMPONENT: coredump 19 | JIRA_URL: ${{ secrets.JIRA_URL }} 20 | JIRA_USER: ${{ secrets.JIRA_USER }} 21 | -------------------------------------------------------------------------------- /esp_coredump/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | # 6 | 7 | import os 8 | import sys 9 | 10 | try: 11 | import esptool # noqa: F401 12 | except ImportError: 13 | idf_path = os.getenv('IDF_PATH') 14 | if not idf_path or not os.path.exists(idf_path): 15 | raise ModuleNotFoundError('Please read the README file for the latest installation instructions') 16 | sys.path.insert(0, os.path.join(idf_path, 'components', 'esptool_py', 'esptool')) 17 | import esptool # noqa: F401 18 | 19 | from .coredump import CoreDump 20 | 21 | __all__ = [ 22 | 'CoreDump', 23 | ] 24 | 25 | __version__ = '1.14.0' 26 | -------------------------------------------------------------------------------- /.github/workflows/issue_comment.yml: -------------------------------------------------------------------------------- 1 | name: Sync issue comments to JIRA 2 | 3 | # This workflow will be triggered when new issue comment is created (including PR comments) 4 | on: issue_comment 5 | 6 | jobs: 7 | sync_issue_comments_to_jira: 8 | name: Sync Issue Comments to Jira 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@master 12 | - name: Sync issue comments to JIRA 13 | uses: espressif/github-actions/sync_issues_to_jira@master 14 | env: 15 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 16 | JIRA_PASS: ${{ secrets.JIRA_PASS }} 17 | JIRA_PROJECT: IDFGH 18 | JIRA_COMPONENT: coredump 19 | JIRA_URL: ${{ secrets.JIRA_URL }} 20 | JIRA_USER: ${{ secrets.JIRA_USER }} 21 | -------------------------------------------------------------------------------- /tests/test_apps/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.16) 2 | 3 | # Here for reproducible builds, we use the CI compile options to make sure they're same. 4 | # Use -ffile-prefix-map to map the local path prefix to ci path prefix 5 | 6 | set(ENV{EXTRA_CFLAGS} "-Werror -Werror=deprecated-declarations -Werror=unused-variable \ 7 | -Werror=unused-but-set-variable -Werror=unused-function -Wstrict-prototypes \ 8 | -ffile-prefix-map=$ENV{IDF_PATH}=/builds/espressif/esp-idf") 9 | 10 | set(ENV{EXTRA_CXXFLAGS} "-Werror -Werror=deprecated-declarations -Werror=unused-variable \ 11 | -Werror=unused-but-set-variable -Werror=unused-function \ 12 | -ffile-prefix-map=$ENV{IDF_PATH}=/builds/espressif/esp-idf") 13 | 14 | include($ENV{IDF_PATH}/tools/cmake/project.cmake) 15 | project(test_core_dump) 16 | -------------------------------------------------------------------------------- /.github/workflows/new_prs.yml: -------------------------------------------------------------------------------- 1 | name: Sync remain PRs to Jira 2 | 3 | # This workflow will be triggered every hour, to sync remaining PRs (i.e. PRs with zero comment) to Jira project 4 | # Note that, PRs can also get synced when new PR comment is created 5 | on: 6 | schedule: 7 | - cron: "0 * * * *" 8 | 9 | jobs: 10 | sync_prs_to_jira: 11 | name: Sync PRs to Jira 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@master 15 | - name: Sync PRs to Jira project 16 | uses: espressif/github-actions/sync_issues_to_jira@master 17 | with: 18 | cron_job: true 19 | env: 20 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 21 | JIRA_PASS: ${{ secrets.JIRA_PASS }} 22 | JIRA_PROJECT: IDFGH 23 | JIRA_COMPONENT: coredump 24 | JIRA_URL: ${{ secrets.JIRA_URL }} 25 | JIRA_USER: ${{ secrets.JIRA_USER }} 26 | -------------------------------------------------------------------------------- /tests/build_espcoredump.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | supported_targets=("esp32" "esp32c3" "esp32p4" "esp32c6" "esp32s3") 4 | abs_path_build_dir=$(realpath "$(dirname "$0")") 5 | echo "$abs_path_build_dir" 6 | 7 | if [ -z "$1" ] 8 | then 9 | output_dir="$(realpath "$(dirname "$1")")" 10 | else 11 | output_dir="$1" 12 | fi 13 | echo "$output_dir" 14 | 15 | 16 | 17 | for chip in "${supported_targets[@]}"; do 18 | echo "${output_dir}/${chip}/${chip}.elf" 19 | echo "--------------------------" 20 | echo "Building $chip binaries..." 21 | echo "--------------------------" 22 | 23 | cd "$abs_path_build_dir/test_apps" 24 | idf.py fullclean && rm -f sdkconfig 25 | idf.py set-target "$chip" 26 | idf.py build 27 | if [ ! -d "${output_dir}/${chip}" ]; then 28 | mkdir -p "${output_dir}/${chip}" 29 | fi 30 | 31 | cp "$abs_path_build_dir/test_apps/build/test_core_dump.elf" "${output_dir}/${chip}/${chip}.elf" || (echo "can't copy app." && exit 1) 32 | echo "copied to ${output_dir}/${chip}/${chip}.elf" 33 | done 34 | echo "--------------------------" 35 | echo "Building apps finished..." 36 | echo "--------------------------" 37 | -------------------------------------------------------------------------------- /.github/workflows/create_gh_release.yaml: -------------------------------------------------------------------------------- 1 | name: Create GitHub release 2 | 3 | on: 4 | push: 5 | tags: 6 | - v* 7 | 8 | jobs: 9 | create_release: 10 | name: Create GitHub release 11 | runs-on: ubuntu-latest 12 | permissions: 13 | contents: write 14 | steps: 15 | - name: Get version 16 | id: get_version 17 | run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT 18 | shell: bash 19 | - name: Checkout 20 | uses: actions/checkout@master 21 | with: 22 | fetch-depth: 0 23 | - name: Install dependencies 24 | run: | 25 | python -m pip install --upgrade pip 26 | pip install --user -e ".[dev]" 27 | - name: Generate changelog 28 | run: | 29 | cz changelog ${{ steps.get_version.outputs.VERSION }} --file-name changelog_body.md 30 | cat changelog_body.md 31 | - name: Create release 32 | id: create_release 33 | uses: softprops/action-gh-release@v1 34 | env: 35 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 36 | with: 37 | body_path: changelog_body.md 38 | name: Version ${{ steps.get_version.outputs.VERSION }} 39 | draft: true 40 | prerelease: false 41 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | # See https://pre-commit.com for more information 2 | # See https://pre-commit.com/hooks.html for more hooks 3 | default_install_hook_types: [pre-commit, commit-msg] 4 | default_stages: [commit] 5 | 6 | repos: 7 | - repo: https://github.com/pre-commit/pre-commit-hooks 8 | rev: v3.4.0 9 | hooks: 10 | - id: trailing-whitespace 11 | - id: end-of-file-fixer 12 | - id: check-executables-have-shebangs 13 | - id: mixed-line-ending 14 | args: ['-f=lf'] 15 | - id: double-quote-string-fixer 16 | 17 | - repo: https://github.com/pycqa/flake8 18 | rev: 5.0.4 19 | hooks: 20 | - id: flake8 21 | args: ['--config=.flake8'] 22 | 23 | - repo: https://github.com/pycqa/isort 24 | rev: 5.11.5 25 | hooks: 26 | - id: isort 27 | name: isort (python) 28 | 29 | - repo: https://github.com/pre-commit/mirrors-mypy 30 | rev: 'v0.982' 31 | hooks: 32 | - id: mypy 33 | 34 | - repo: https://github.com/espressif/conventional-precommit-linter 35 | rev: v1.6.0 36 | hooks: 37 | - id: conventional-precommit-linter 38 | stages: [commit-msg] 39 | args: ['--types=change,ci,docs,feat,fix,refactor,remove,revert,test,perf'] 40 | 41 | exclude: "^tests/(esp.+|rom_tests)/.+" 42 | -------------------------------------------------------------------------------- /.github/workflows/release_pypi.yml: -------------------------------------------------------------------------------- 1 | name: PyPI release 2 | 3 | on: 4 | release: 5 | types: [released] 6 | 7 | jobs: 8 | build_and_upload: 9 | runs-on: ubuntu-latest 10 | 11 | steps: 12 | - uses: actions/checkout@master 13 | 14 | - name: Set up Python 3.13 15 | uses: actions/setup-python@master 16 | with: 17 | python-version: '3.13' 18 | 19 | - name: Install dependencies 20 | run: | 21 | python -m pip install --upgrade pip build setuptools twine 22 | 23 | - name: Build and upload esp-coredump ${{ github.event.release.tag_name }} 24 | env: 25 | TWINE_USERNAME: __token__ 26 | TWINE_PASSWORD: ${{ secrets.PYPI_PROJECT_TOKEN }} 27 | run: | 28 | PUBLISHED_VERSION=$(curl https://pypi.org/pypi/esp-coredump/json 2>/dev/null | jq -r '.info.version') 29 | CURRENT_VERSION=$(python -c 'import setuptools; setuptools.setup()' --version 2>/dev/null) 30 | if [ "$PUBLISHED_VERSION" == "$CURRENT_VERSION" ]; then 31 | echo "Version ${PUBLISHED_VERSION} already published, skipping..." 32 | exit 0 33 | else 34 | echo "Packaging and publishing new esp-coredump version: ${CURRENT_VERSION}" 35 | python -m build 36 | twine check dist/* && twine upload dist/* 37 | fi 38 | -------------------------------------------------------------------------------- /tests/README.md: -------------------------------------------------------------------------------- 1 | | Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C61 | ESP32-C6 | ESP32-H2 | ESP32-H21 | ESP32-H4 | ESP32-S2 | ESP32-S3 | ESP32-P4 | 2 | | ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- | 3 | 4 | # ESP Core Dump Tests 5 | 6 | Current directory includes the tests and tests data that is supposed to be used in testing of `esp-coredump` package 7 | 8 | Files created with `_bin` suffix were build with `CONFIG_ESP_COREDUMP_DATA_FORMAT_BIN=y` instead of the default ELF format. 9 | 10 | ## Update `coredump.b64` Test Data 11 | 12 | To update `.//coredump.b64` build `test_apps` for a target, flash and get a base64 text from `idf.py monitor` 13 | 14 | For more information how to build the test apps see _./test_apps/README.md_. 15 | 16 | ## ELF Test Binaries 17 | 18 | The ELF test binaries are placed in _./test_apps/$chip folder_ 19 | 20 | ## Update `expected_output` Test Data 21 | 22 | To update `.//expected_output` run 23 | 24 | ```sh 25 | TARGET=esp32 26 | espcoredump.py --chip $TARGET info_corefile -c ./$TARGET/coredump.b64 -t b64 -m ./test_apps/build/test_core_dump.elf > ./$TARGET/expected_output 27 | ``` 28 | 29 | Do the same for the other supported targets. Do not forget to remove the first line with `espcoredump.py vX.Y.Z`. 30 | -------------------------------------------------------------------------------- /esp_coredump/__main__.py: -------------------------------------------------------------------------------- 1 | # 2 | # SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | # 6 | 7 | import logging 8 | import os.path 9 | 10 | from esp_coredump import CoreDump, __version__ 11 | from esp_coredump.cli_ext import parser 12 | 13 | 14 | def main(): 15 | print(f'espcoredump.py v{__version__}', flush=True) 16 | 17 | args = parser.parse_args() 18 | debug = getattr(args, 'debug', 3) 19 | if debug == 0: 20 | log_level = logging.CRITICAL 21 | elif debug == 1: 22 | log_level = logging.ERROR 23 | elif debug == 2: 24 | log_level = logging.WARNING 25 | elif debug == 3: 26 | log_level = logging.INFO 27 | else: 28 | log_level = logging.DEBUG 29 | logging.basicConfig(format='%(levelname)s: %(message)s', level=log_level) 30 | 31 | kwargs = {k: v for k, v in vars(args).items() if v is not None} 32 | 33 | kwargs.pop('debug', None) 34 | kwargs.pop('operation', None) 35 | 36 | espcoredump = CoreDump(**kwargs) 37 | temp_core_files = None 38 | 39 | try: 40 | if args.operation == 'info_corefile': 41 | temp_core_files = espcoredump.info_corefile() 42 | elif args.operation == 'dbg_corefile': 43 | temp_core_files = espcoredump.dbg_corefile() 44 | finally: 45 | if temp_core_files: 46 | for f in temp_core_files: 47 | try: 48 | os.remove(f) 49 | except OSError: 50 | pass 51 | 52 | 53 | if __name__ == '__main__': 54 | main() 55 | -------------------------------------------------------------------------------- /tests/test_apps/main/test_core_dump.c: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD 3 | * 4 | * SPDX-License-Identifier: CC0-1.0 5 | */ 6 | #include 7 | #include "esp_rom_sys.h" 8 | #include "freertos/FreeRTOS.h" 9 | #include "freertos/task.h" 10 | 11 | 12 | #if CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY == 1 || CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP == 1 13 | #define TEST_TASK_STACK_SIZE 4096 14 | 15 | void test_task(void *arg) 16 | { 17 | (void)arg; 18 | uint32_t notify_value; 19 | xTaskNotifyWait(0x0, 0xFFFFFFFF, ¬ify_value, portMAX_DELAY); 20 | vTaskDelete(NULL); 21 | } 22 | 23 | void create_task_use_cap(const char *task_name, uint32_t stack_caps) 24 | { 25 | StaticTask_t *task_tcb = heap_caps_calloc(1, sizeof(StaticTask_t), MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); 26 | StackType_t *task_stack = heap_caps_malloc(TEST_TASK_STACK_SIZE, stack_caps); 27 | xTaskCreateStaticPinnedToCore(test_task, task_name, TEST_TASK_STACK_SIZE, NULL, 15, task_stack, task_tcb, 0); 28 | } 29 | #endif 30 | 31 | void fail_once(char unused) 32 | { 33 | static int first = 1; 34 | if (first) { 35 | first = 0; 36 | abort(); 37 | } 38 | } 39 | 40 | void app_main(void) 41 | { 42 | #if CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP == 1 43 | create_task_use_cap("rtc_fast", MALLOC_CAP_8BIT | MALLOC_CAP_RTCRAM); 44 | #endif 45 | 46 | #if CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY == 1 47 | create_task_use_cap("ext_ram", MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM); 48 | #endif 49 | 50 | esp_rom_install_channel_putc(2, fail_once); 51 | esp_rom_printf("a"); 52 | vTaskDelete(NULL); 53 | } 54 | -------------------------------------------------------------------------------- /esp_coredump/corefile/_parse_soc_header.py: -------------------------------------------------------------------------------- 1 | # 2 | # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | # 6 | # This script will parse soc.h and generate .py file containing all of the target constants. 7 | # Once one manually adds a new target, the constants file can be regenerated. 8 | # The script is ESP-IDF dependent and is not intended for use by end users. 9 | # 10 | import os 11 | import sys 12 | from ast import literal_eval 13 | 14 | from esp_coredump.coredump import IDF_SETUP_ERROR 15 | from esp_coredump.corefile import SUPPORTED_TARGETS 16 | 17 | IDF_PATH = os.getenv('IDF_PATH') 18 | 19 | 20 | def main(): # type: () -> None 21 | constants = [ 22 | 'SOC_DRAM_LOW', 23 | 'SOC_DRAM_HIGH', 24 | 'SOC_IRAM_LOW', 25 | 'SOC_IRAM_HIGH', 26 | 'SOC_RTC_DATA_LOW', 27 | 'SOC_RTC_DATA_HIGH', 28 | 'SOC_RTC_DRAM_LOW', 29 | 'SOC_RTC_DRAM_HIGH', 30 | ] 31 | 32 | for target in SUPPORTED_TARGETS: 33 | target_constants = {} 34 | soc_header_fp = os.path.join(IDF_PATH, 'components/soc/{}/include/soc/soc.h'.format(target)) # type: ignore 35 | module_fp = os.path.join(os.path.normpath(os.path.abspath(os.path.dirname(__file__))), 36 | 'soc_headers', 37 | '{}.py'.format(target) 38 | ) 39 | 40 | with open(soc_header_fp) as fr: 41 | for line in fr.readlines(): 42 | for attr in constants: 43 | if '#define {}'.format(attr) in line: 44 | target_constants[attr] = literal_eval(line.strip().split()[-1]) 45 | 46 | for attr in constants: 47 | if attr not in target_constants: 48 | print(f'WARNING: {attr} is missing in {soc_header_fp}, check if this is correct!', file=sys.stderr) 49 | target_constants[attr] = 2**32 - 1 50 | 51 | with open(module_fp, 'w') as fw: 52 | for k, v in target_constants.items(): 53 | fw.write('{} = {}\n'.format(k, hex(v).lower())) 54 | 55 | 56 | if __name__ == '__main__': 57 | if not IDF_PATH: 58 | print(IDF_SETUP_ERROR) 59 | sys.exit(1) 60 | main() 61 | -------------------------------------------------------------------------------- /esp_coredump/corefile/riscv.py: -------------------------------------------------------------------------------- 1 | # 2 | # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | # 6 | 7 | from typing import Any, Optional, Tuple 8 | 9 | from construct import Int16ul, Int32ul, Padding, Struct 10 | 11 | from . import BaseArchMethodsMixin, BaseTargetMethods, ESPCoreDumpLoaderError 12 | 13 | RISCV_GP_REGS_COUNT = 32 14 | PRSTATUS_SIZE = 204 15 | PRSTATUS_OFFSET_PR_CURSIG = 12 16 | PRSTATUS_OFFSET_PR_PID = 24 17 | PRSTATUS_OFFSET_PR_REG = 72 18 | ELF_GREGSET_T_SIZE = 128 19 | 20 | PrStruct = Struct( 21 | Padding(PRSTATUS_OFFSET_PR_CURSIG), 22 | 'pr_cursig' / Int16ul, 23 | Padding(PRSTATUS_OFFSET_PR_PID - PRSTATUS_OFFSET_PR_CURSIG - Int16ul.sizeof()), 24 | 'pr_pid' / Int32ul, 25 | Padding(PRSTATUS_OFFSET_PR_REG - PRSTATUS_OFFSET_PR_PID - Int32ul.sizeof()), 26 | 'regs' / Int32ul[RISCV_GP_REGS_COUNT], 27 | Padding(PRSTATUS_SIZE - PRSTATUS_OFFSET_PR_REG - ELF_GREGSET_T_SIZE) 28 | ) 29 | 30 | 31 | class RiscvMethodsMixin(BaseArchMethodsMixin): 32 | @staticmethod 33 | def get_registers_from_stack(data, grows_down): 34 | # type: (bytes, bool) -> Tuple[list[int], Optional[dict[int, int]]] 35 | regs = Int32ul[RISCV_GP_REGS_COUNT].parse(data) 36 | if not grows_down: 37 | raise ESPCoreDumpLoaderError('Growing up stacks are not supported for now!') 38 | return regs, None 39 | 40 | @staticmethod 41 | def build_prstatus_data(tcb_addr, task_regs): # type: (int, list[int]) -> Any 42 | return PrStruct.build({ 43 | 'pr_cursig': 0, 44 | 'pr_pid': tcb_addr, 45 | 'regs': task_regs, 46 | }) 47 | 48 | 49 | class Esp32C3Methods(BaseTargetMethods, RiscvMethodsMixin): 50 | TARGET = 'esp32c3' 51 | 52 | 53 | class Esp32C2Methods(BaseTargetMethods, RiscvMethodsMixin): 54 | TARGET = 'esp32c2' 55 | 56 | 57 | class Esp32H2Methods(BaseTargetMethods, RiscvMethodsMixin): 58 | TARGET = 'esp32h2' 59 | 60 | 61 | class Esp32C6Methods(BaseTargetMethods, RiscvMethodsMixin): 62 | TARGET = 'esp32c6' 63 | 64 | 65 | class Esp32P4Methods(BaseTargetMethods, RiscvMethodsMixin): 66 | TARGET = 'esp32p4' 67 | 68 | 69 | class Esp32C5Methods(BaseTargetMethods, RiscvMethodsMixin): 70 | TARGET = 'esp32c5' 71 | 72 | 73 | class Esp32C61Methods(BaseTargetMethods, RiscvMethodsMixin): 74 | TARGET = 'esp32c61' 75 | 76 | 77 | class Esp32H21Methods(BaseTargetMethods, RiscvMethodsMixin): 78 | TARGET = 'esp32h21' 79 | 80 | 81 | class Esp32H4Methods(BaseTargetMethods, RiscvMethodsMixin): 82 | TARGET = 'esp32h4' 83 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["setuptools>=64"] 3 | build-backend = "setuptools.build_meta" 4 | 5 | [project] 6 | name = "esp-coredump" 7 | authors = [{name = "Espressif Systems"}] 8 | license = {text = "Apache 2.0"} 9 | description = "Generate core dumps on unrecoverable software errors" 10 | classifiers = [ 11 | "Development Status :: 5 - Production/Stable", 12 | "Intended Audience :: Developers", 13 | "Natural Language :: English", 14 | "Environment :: Console", 15 | "Topic :: Software Development :: Embedded Systems", 16 | "Programming Language :: Python :: 3 :: Only", 17 | "Programming Language :: Python :: 3.7", 18 | "Programming Language :: Python :: 3.8", 19 | "Programming Language :: Python :: 3.9", 20 | "Programming Language :: Python :: 3.10", 21 | "Programming Language :: Python :: 3.11", 22 | "Programming Language :: Python :: 3.12", 23 | "Operating System :: OS Independent", 24 | "License :: OSI Approved :: Apache Software License", 25 | ] 26 | requires-python = ">=3.7" 27 | dynamic = ['version'] 28 | dependencies = [ 29 | "construct~=2.10", 30 | "pygdbmi>=0.9.0.2", 31 | "esptool", 32 | ] 33 | 34 | [project.readme] 35 | file = "README.md" 36 | content-type = "text/markdown" 37 | 38 | [project.urls] 39 | Homepage = "https://github.com/espressif/esp-coredump" 40 | 41 | [project.optional-dependencies] 42 | dev = [ 43 | "pre-commit", 44 | "commitizen", 45 | "czespressif>=1.3.1", 46 | ] 47 | test = [ 48 | "coverage[toml]", 49 | "pytest", 50 | ] 51 | 52 | [project.scripts] 53 | esp-coredump = "esp_coredump.__main__:main" 54 | 55 | [tool.setuptools] 56 | include-package-data = true 57 | 58 | [tool.setuptools.packages] 59 | find = {namespaces = false} 60 | 61 | [tool.setuptools.dynamic] 62 | version = {attr = "esp_coredump.__version__"} 63 | 64 | [tool.commitizen] 65 | name = "czespressif" 66 | version = "1.14.0" 67 | update_changelog_on_bump = true 68 | tag_format = "v$version" 69 | changelog_merge_prerelease = true 70 | annotated_tag = true 71 | changelog_start_rev = "v1.4.2" 72 | bump_message = "change: Update version to $new_version" 73 | version_files = [ 74 | "esp_coredump/__init__.py:__version__" 75 | ] 76 | 77 | [tool.mypy] 78 | disallow_incomplete_defs = false # Disallows defining functions with incomplete type annotations 79 | disallow_untyped_defs = false # Disallows defining functions without type annotations or with incomplete type annotations 80 | ignore_missing_imports = true # Suppress error messages about imports that cannot be resolved 81 | python_version = "3.9" # Specifies the Python version used to parse and check the target program 82 | warn_no_return = true # Shows errors for missing return statements on some execution paths 83 | warn_return_any = true # Shows a warning when returning a value with type Any from a function declared with a non- Any return type 84 | 85 | [tool.coverage.run] 86 | parallel = true 87 | source = ["esp_coredump/"] 88 | [tool.coverage.report] 89 | omit = ["esp_coredump/corefile/_parse_soc_header.py"] # ignore helper script 90 | exclude_also = [ 91 | "def __repr__", 92 | "def _type_str", 93 | "@(abc\\.)?abstractmethod", 94 | "raise NotImplementedError", 95 | ] 96 | 97 | [tool.pytest.ini_options] 98 | addopts = "-vs" 99 | -------------------------------------------------------------------------------- /tests/esp32c3/coredump_bin.b64: -------------------------------------------------------------------------------- 1 | PAkAAAIBBQAAAAAAAAAAAAAAAAADAAAA 2 | f0VMRgEBAQAAAAAAAAAAAAQA8wABAAAAAAAAADQAAAAAAAAAAAAAADQAIAAGACgA 3 | AAAAAA== 4 | BAAAAPQAAAAAAAAAAAAAAMABAADAAQAABgAAAAAAAAA= 5 | AQAAALQCAAC848g/vOPIP1ABAABQAQAABgAAAAAAAAA= 6 | AQAAAAQEAABg4cg/YOHIP1ACAABQAgAABgAAAAAAAAA= 7 | AQAAAFQGAAAU68g/FOvIP1ABAABQAQAABgAAAAAAAAA= 8 | AQAAAKQHAABg6sg/YOrIP6AAAACgAAAABgAAAAAAAAA= 9 | BAAAAEQIAAAAAAAAAAAAANwAAADcAAAABgAAAAAAAAA= 10 | CAAAAMwAAAABAAAA 11 | Q09SRQAAAAA= 12 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvOPIPwAAAAAAAAAAAAAAAAAAAAAAAAAA 13 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAg4QBg5OEAA4sg/ALDIP7DjyD80NTY3 14 | b3BxcjAxMjMEAAAAZOLIPyziyD9i4sg/AAAAAFniyD8BAAAAAMDIP3d4eXpzdHV2 15 | AAAAAKDiyD8048g/AAAAALCBBEC5NgI8AAAAAKDiyD8AAAAAAAAAAGtsbW5naGlq 16 | Y2RlZjg5YWIAAAAA 17 | CAAAAMwAAAABAAAA 18 | Q09SRQAAAAA= 19 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFOvIPwAAAAAAAAAAAAAAAAAAAAAAAAAA 20 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAykI4QAAAAAAAAAAAALDIPwDryD8AAAAA 21 | AAAAAAAAAAAAAAAAAAAAAJJMOEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 22 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 23 | AAAAAAAAAAAAAAAA 24 | 8NzIPwAAAAAotsg/KLbIP7zjyD8gtsg/GAAAAAAAAAAAAAAAvOPIPwAAAAABAAAA 25 | uNPIP21haW4AAAAAAAAAAAAAAACw48g/AQAAAAAAAAAAAAAAAAAAAAAAAAAAz8g/ 26 | aM/IP9DPyD8AAAAAAAAAAAEAAAAAAAAAAAAAAAAAAACkSgBCAAAAAAAAAAAAAAAA 27 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 28 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 29 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 30 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 31 | YAg4QBg5OEAA4sg/ALDIP7DjyD80NTY3b3BxcjAxMjMEAAAAZOLIPyziyD9i4sg/ 32 | AAAAAFniyD8BAAAAAMDIP3d4eXpzdHV2AAAAAKDiyD8048g/AAAAALCBBEC5NgI8 33 | AAAAAKDiyD8AAAAAAAAAAGtsbW5naGlqY2RlZjg5YWKBGAAAAQA4QAIAAAAAAAAA 34 | AAAAAGTiyD9g4sg/pB0DQKWlpaWlpaWlYOLIP3SQOEClpaWlpaWlpQAAAACsrsg/ 35 | ZOLIP8iuyD9g4sg/YWJvcnQoKSB3YXMgY2FsbGVkIGF0IFBDIDB4NDIwMGE5YzEg 36 | b24gY29yZSAwAAAAAAA4QDAAAAA0MjAwYTljMQALOEAAGAAAAAAAAAAwAjzEqQBC 37 | AAAAAAAAAAAAMAI85IUEQAQIAAAQAAAAEAAAAAAAAAAECAAADAAAAAAAAAABAAAA 38 | FOvIPxAAAAAQAAAAAAAAAEzjyD9EKAI8GCgCPAAAAAAAAAAAAAAAAAAAAAAAAAAA 39 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADACPCKHBEBM48g/RCgCPAMAAAD+fAFC 40 | AAAAAAAAAAAAMAI8NOPIP4DtyD+A7cg/ZOPIP+qpAEIAAAAAqKkAQgAAAAABAAAA 41 | AgAAAADwzT8AMAJgCgAAABgoAjymAAAA//9//jp1AUIAAAAAiBMAAAEAAAAAAAAA 42 | AAAAAAAAAAAAAAAA1kI4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 43 | AAAAAKWlpaWlpaWlpaWlpQ== 44 | YOrIPwAAAAAUtsg/FLbIPxTryD8Mtsg/GQAAAAAAAAAAAAAAFOvIPwAAAAAAAAAA 45 | EOXIP0lETEUAAAAAAAAAAAAAAAAA68g/AAAAAAAAAAAAAAAAAAAAAAAAAAAAz8g/ 46 | aM/IP9DPyD8AAAAAAAAAAAEAAAAAAAAAAAAAAAAAAACkSgBCAAAAAAAAAAAAAAAA 47 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 48 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 49 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 50 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA 51 | ykI4QAAAAAAAAAAAALDIPwDryD8AAAAAAAAAAAAAAAAAAAAAAAAAAJJMOEAAAAAA 52 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 53 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 54 | AAAAAKWlpaWlpaWlpaWlpQ== 55 | FAAAAEgAAABKIAAA 56 | RVNQX0NPUkVfRFVNUF9JTkZPAAA= 57 | AgEFADhiNGI5MDhmMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 58 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 59 | EAAAAAgAAAClAgAA 60 | RVNQX0VYVFJBX0lORk8AAA== 61 | vOPIPwAAAAA= 62 | FAAAAC0AAACnAgAA 63 | RVNQX1BBTklDX0RFVEFJTFMAAAA= 64 | YWJvcnQoKSB3YXMgY2FsbGVkIGF0IFBDIDB4NDIwMGE5YzEgb24gY29yZSAw 65 | AAAA 66 | EMWz8w== 67 | -------------------------------------------------------------------------------- /esp_coredump/cli_ext.py: -------------------------------------------------------------------------------- 1 | # 2 | # SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | # 6 | 7 | import argparse 8 | import os 9 | 10 | from esp_coredump import __version__ 11 | 12 | from .corefile import SUPPORTED_TARGETS 13 | from .corefile.gdb import DEFAULT_GDB_TIMEOUT_SEC 14 | 15 | try: 16 | # esptool>=4.0 17 | from esptool.loader import ESPLoader 18 | except (AttributeError, ModuleNotFoundError): 19 | # esptool<4.0 20 | from esptool import ESPLoader 21 | 22 | 23 | def arg_auto_int(x): 24 | return int(x, 0) 25 | 26 | 27 | parser = argparse.ArgumentParser(description=f'espcoredump.py v{__version__} - ESP32 Core Dump Utility') 28 | parser.add_argument('--chip', default=os.environ.get('ESPTOOL_CHIP', 'auto'), 29 | choices=['auto'] + SUPPORTED_TARGETS, 30 | help='Target chip type') 31 | parser.add_argument('--chip-rev', type=int, 32 | help='Target chip revision') 33 | parser.add_argument('--port', '-p', default=os.environ.get('ESPTOOL_PORT'), 34 | help='Serial port device') 35 | parser.add_argument('--baud', '-b', type=int, 36 | default=os.environ.get('ESPTOOL_BAUD', ESPLoader.ESP_ROM_BAUD), 37 | help='Serial port baud rate used when flashing/reading') 38 | parser.add_argument('--gdb-timeout-sec', type=int, default=DEFAULT_GDB_TIMEOUT_SEC, 39 | help='Overwrite the default internal delay for gdb responses') 40 | parser.add_argument('--version', action='version', 41 | version=f'espcoredump.py v{__version__}') 42 | 43 | common_args = argparse.ArgumentParser(add_help=False) 44 | common_args.add_argument('--debug', '-d', type=int, default=3, 45 | help='Log level (0..3)') # TODO: move this option to global args in next major release 46 | common_args.add_argument('--gdb', '-g', 47 | help='Path to gdb') 48 | common_args.add_argument('--extra-gdbinit-file', '-ex', 49 | help='Path to additional gdbinit file') 50 | common_args.add_argument('--core', '-c', 51 | help='Path to core dump file (if skipped core dump will be read from flash)') 52 | common_args.add_argument('--core-format', '-t', choices=['auto', 'b64', 'elf', 'raw'], default='auto', 53 | help='File specified with "-c" is an ELF (elf), raw (raw) or base64-encoded (b64) binary. ' 54 | 'For autodetection based on file header use "auto".') 55 | common_args.add_argument('--off', '-o', type=arg_auto_int, 56 | help='Offset of coredump partition in flash (type "idf.py partition-table" to see).') 57 | common_args.add_argument('--parttable-off', type=arg_auto_int, 58 | help='Offset of the partition table in flash.') 59 | common_args.add_argument('--save-core', '-s', 60 | help='Save core to file. Otherwise temporary core file will be deleted. ' 61 | 'Does not work with "-c"', ) 62 | common_args.add_argument('--rom-elf', '-r', 63 | help='Path to ROM ELF file. Will use "_rom.elf" if not specified') 64 | common_args.add_argument('prog', help='Path to program\'s ELF binary') 65 | 66 | operations = parser.add_subparsers(dest='operation', required=True, description='Operation to perform') 67 | 68 | operations.add_parser('dbg_corefile', parents=[common_args], 69 | help='Starts GDB debugging session with specified corefile') 70 | 71 | info_coredump = operations.add_parser('info_corefile', parents=[common_args], 72 | help='Print core dump info from file') 73 | info_coredump.add_argument('--print-mem', '-m', action='store_true', 74 | help='Print memory dump') 75 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # esp-coredump 2 | 3 | A Python-based utility that helps users to retrieve and analyse core dumps. This tool provides two commands for core dumps analysis: 4 | 5 | - `info_corefile` - prints crashed task’s registers, callstack, list of available tasks in the system, memory regions and contents of memory stored in core dump (TCBs and stacks) 6 | 7 | - `dbg_corefile` - creates core dump ELF file and runs GDB debug session with this file. User can examine memory, variables and tasks states manually. Note that since not all memory is saved in core dump only values of variables allocated on stack will be meaningful 8 | 9 | ## Installation 10 | 11 | **esp-coredump** is a standalone utility integrated into ESP-IDF. It is recommended to run `esp-coredump` from within ESP-IDF environment due to the ease of setup. 12 | 13 | To install the **ESP-IDF** framework please visit the [documentation](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html). 14 | 15 | ### Standalone Installation (without ESP-IDF) 16 | 17 | If you're attempting to run `esp-coredump` outside of the ESP-IDF environment, you'll need to install `esp-gdb`. The most recent version can be downloaded from the [GitHub releases](https://github.com/espressif/binutils-gdb/releases) page. To determine the appropriate version for your environment, refer to the [ESP-IDF documentation](https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/tools/idf-tools.html#xtensa-esp-elf-gdb). 18 | Note that toolchain versions may vary between ESP-IDF versions. To get the correct version for your needs, select your version of ESP-IDF in the top left corner. 19 | Ensure you download the correct version that matches the architecture of your ESP32. After downloading the toolchain, verify that it's accessible in your system's PATH. 20 | 21 | ## Examples 22 | 23 | `esp-coredump` can be used as a CLI tool as well as a separate package. Before executing any examples, ensure that all requirements outlined in the [Installation](#installation) section have been met. If you decide to use ESP-IDF, all commands should be run from within the ESP-IDF environment. 24 | 25 | Build `test_apps` for a target, flash and get a base64 text (`test_apps` folder) 26 | 27 | ```python 28 | from esp_coredump import CoreDump 29 | 30 | # Instantiate the coredump object 31 | coredump = CoreDump(chip='esp32', core="./tests/esp32/coredump.b64", print_mem=True, core_format='b64', prog='./test_apps/build/test_core_dump.elf') 32 | coredump.info_corefile() # print the info of the test app corefile 33 | coredump.dbg_corefile() # run GDB debug session with provided ELF file 34 | ``` 35 | 36 | ## Documentation 37 | 38 | Visit the [documentation](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/core_dump.html) or run `esp-coredump -h`. 39 | 40 | ## Contributing 41 | 42 | ### Code Style & Static Analysis 43 | 44 | Please follow these coding standards when writing code for ``esp-coredump``: 45 | 46 | #### Pre-commit checks 47 | 48 | [pre-commit](https://pre-commit.com/) is a framework for managing pre-commit hooks. These hooks help to identify simple issues before committing code for review. 49 | 50 | To use the tool, first install ``pre-commit``. Then enable the ``pre-commit`` and ``commit-msg`` git hooks: 51 | 52 | ```sh 53 | python -m pip install pre-commit 54 | pre-commit install -t pre-commit -t commit-msg 55 | ``` 56 | 57 | On the first commit ``pre-commit`` will install the hooks, subsequent checks will be significantly faster. If an error is found an appropriate error message will be displayed. 58 | 59 | 60 | #### Conventional Commits 61 | 62 | ``esp-coredump`` complies with the [Conventional Commits standard](https://www.conventionalcommits.org/en/v1.0.0/#specification). Every commit message is checked with [Conventional Precommit Linter](https://github.com/espressif/conventional-precommit-linter), ensuring it adheres to the standard. 63 | 64 | 65 | ## License 66 | 67 | This document and the attached source code are released as Free Software under Apache Software License Version 2.0. 68 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | stages: 2 | - pre-check 3 | - codecheck 4 | - test 5 | - report 6 | 7 | # WORKFLOW RULES 8 | # ------------------------------------------------------------------------------------------------------ 9 | workflow: 10 | rules: 11 | - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' 12 | - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"' 13 | when: never 14 | - if: '$CI_COMMIT_BRANCH' 15 | # ------------------------------------------------------------------------------------------------------ 16 | 17 | 18 | # TEMPLATES 19 | # ------------------------------------------------------------------------------------------------------ 20 | .base_template: 21 | image: python:3.11-slim-bookworm 22 | tags: 23 | - build 24 | - internet 25 | 26 | .idf_template: 27 | image: espressif/idf:latest 28 | tags: 29 | - build 30 | - internet 31 | # -------------------------------------------------------------------------------------------------- 32 | 33 | 34 | # JOBS 35 | # ------------------------------------------------------------------------------------------------------ 36 | 37 | include: 38 | - project: espressif/shared-ci-dangerjs 39 | ref: master 40 | file: danger.yaml 41 | run-danger-mr-linter: 42 | stage: pre-check 43 | variables: 44 | ENABLE_CHECK_UPDATED_CHANGELOG: 'false' 45 | # when changing please also update .pre-commit-config.yaml 46 | COMMIT_MESSAGE_ALLOWED_TYPES: 'change,ci,docs,feat,fix,refactor,remove,revert,test,perf' 47 | 48 | # CODE CHECK BY PRE-COMMIT HOOKS 49 | pre-commit_hooks_MR: 50 | stage: codecheck 51 | extends: .base_template 52 | before_script: 53 | - apt-get update && apt-get install -y -q git 54 | - python -m pip install pre-commit 55 | script: 56 | - echo "Merge request is from ${CI_COMMIT_REF_NAME} into ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}" 57 | - git fetch origin ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME} ${CI_COMMIT_REF_NAME} 58 | - export from_sha=$(git merge-base HEAD origin/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}) 59 | - echo "Checking changes from ${from_sha} to ${CI_COMMIT_SHA}:" 60 | - git log --oneline ${from_sha}..${CI_COMMIT_SHA} 61 | - echo "Modified files:" 62 | - git diff-tree --no-commit-id --name-only -r ${from_sha} ${CI_COMMIT_SHA} 63 | - echo "Running pre-commit:" 64 | - pre-commit run --from ${from_sha} --to ${CI_COMMIT_SHA} 65 | rules: 66 | - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' 67 | 68 | # Check if parse_soc_h_script got changed on IDF side 69 | parse_soc_h_script_check: 70 | stage: codecheck 71 | extends: .idf_template 72 | script: 73 | - pip install . 74 | - python esp_coredump/corefile/_parse_soc_header.py 75 | - git diff --exit-code -- esp_coredump/corefile/soc_headers/\* || exit 1; 76 | rules: 77 | - if: '$CI_PIPELINE_SOURCE == "schedule"' 78 | 79 | test_espcoredump: 80 | stage: test 81 | extends: .idf_template 82 | artifacts: 83 | when: always 84 | paths: 85 | - "tests" 86 | - ".coverage*" 87 | expire_in: 1 week 88 | script: 89 | - pip install -e .[test] 90 | - coverage run -m pytest 91 | 92 | combine_reports: 93 | stage: report 94 | extends: .base_template 95 | artifacts: 96 | reports: 97 | coverage_report: 98 | coverage_format: cobertura 99 | path: cobertura_report.xml 100 | when: always 101 | paths: 102 | - ".coverage*" 103 | - cobertura_report.xml 104 | - ./html_report/ 105 | expire_in: 1 week 106 | coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/' 107 | variables: 108 | LC_ALL: C.UTF-8 109 | COVERAGE_RCFILE: "${CI_PROJECT_DIR}/pyproject.toml" 110 | script: 111 | - pip install -e .[test] 112 | # all .coverage files in sub-directories are moved to the parent dir first 113 | - find . -mindepth 2 -type f -name ".coverage*" -print -exec mv --backup=numbered {} . \; 114 | - coverage combine 115 | - coverage report --precision=2 116 | - coverage html -d html_report --precision=2 117 | - coverage xml -o cobertura_report.xml 118 | 119 | # ------------------------------------------------------------------------------------------------------ 120 | -------------------------------------------------------------------------------- /tests/esp32c3/coredump.b64: -------------------------------------------------------------------------------- 1 | mAwAAAIBBQAAAAAAAAAAAAAAAAADAAAA 2 | f0VMRgEBAQAAAAAAAAAAAAQA8wABAAAAAAAAADQAAAAAAAAAAAAAADQAIAAIACgA 3 | AAAAAA== 4 | BAAAADQBAAAAAAAAAAAAAKACAACgAgAABgAAAAAAAAA= 5 | AQAAANQDAAAw7Mg/MOzIP1QBAABUAQAABgAAAAAAAAA= 6 | AQAAACgFAADQ6cg/0OnIP1ACAABQAgAABgAAAAAAAAA= 7 | AQAAAHgHAACM88g/jPPIP1QBAABUAQAABgAAAAAAAAA= 8 | AQAAAMwIAADg8sg/4PLIP6AAAACgAAAABgAAAAAAAAA= 9 | AQAAAGwJAACU2sg/lNrIP1QBAABUAQAABgAAAAAAAAA= 10 | AQAAAMAKAACg2cg/oNnIP+AAAADgAAAABgAAAAAAAAA= 11 | BAAAAKALAAAAAAAAAAAAANwAAADcAAAABgAAAAAAAAA= 12 | CAAAAMwAAAABAAAA 13 | Q09SRQAAAAA= 14 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMOzIPwAAAAAAAAAAAAAAAAAAAAAAAAAA 15 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmAY4QI42OEBw6sg/AKbIP+B+yD80NTY3 16 | b3BxcjAxMjMEAAAA1OrIP5zqyD/S6sg/AAAAAMnqyD8BAAAAAMDIP3d4eXpzdHV2 17 | AAAAABDryD+k68g/AAAAALCBBEBJOAI8AAAAABDryD8AAAAAAAAAAGtsbW5naGlq 18 | Y2RlZjg5YWIAAAAA 19 | CAAAAMwAAAABAAAA 20 | Q09SRQAAAAA= 21 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjPPIPwAAAAAAAAAAAAAAAAAAAAAAAAAA 22 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfEA4QAAAAAAAAAAAAKbIP0CGyD8AAAAA 23 | AAAAAAAAAAAAAAAAAAAAAKZJOEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 24 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 25 | AAAAAAAAAAAAAAAA 26 | CAAAAMwAAAABAAAA 27 | Q09SRQAAAAA= 28 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlNrIPwAAAAAAAAAAAAAAAAAAAAAAAAAA 29 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATkI4QLRCOEAg2sg/AKbIP0BtyD8AAAAA 30 | AAAAAAAAAAAAAAAA/////wEAAAABAAAAmNrIPwQAAAAAAAAAACAMYAAAAAAAAAAA 31 | AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 32 | AAAAAAAAAAAAAAAA 33 | gOvIPwAAAADIq8g/yKvIPzDsyD/Aq8g/GAAAAAAAAAAAAAAAMOzIPwAAAAABAAAA 34 | LNzIP21haW4AAAAAAAAAAAAAAAAAAAAAIOzIPwEAAAAAAAAAAAAAAAAAAAAAAAAA 35 | LMXIP5TFyD/8xcg/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAykgAQgAAAAAAAAAA 36 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 37 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 38 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 39 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 40 | AAAAAA== 41 | mAY4QI42OEBw6sg/AKbIP+B+yD80NTY3b3BxcjAxMjMEAAAA1OrIP5zqyD/S6sg/ 42 | AAAAAMnqyD8BAAAAAMDIP3d4eXpzdHV2AAAAABDryD+k68g/AAAAALCBBEBJOAI8 43 | AAAAABDryD8AAAAAAAAAAGtsbW5naGlqY2RlZjg5YWKBGAAAAQA4QAcAAAAAAAAA 44 | AAAAANTqyD/Q6sg/pB0DQKWlpaWlpaWl0OrIP7iHOEClpaWlpaWlpaWlpaWYpMg/ 45 | 1OrIP7SkyD/Q6sg/YWJvcnQoKSB3YXMgY2FsbGVkIGF0IFBDIDB4NDIwMDkzNTEg 46 | b24gY29yZSAwAAAAAAAEQDAAAAA0MjAwOTM1MQB3OEAAAAAAAAAAAAAgAjxUkwBC 47 | AAAAAAAAAAAAIAI85IUEQAQIAABUAAAAAAAAAAAAAAAAGAAAEAAAABAAAACkCThA 48 | jPPIPxAAAAAQAAAAvOvIP9AnAjyYJwI8mCcCPAAAAAAAAAAAAAAAAAAAAAAAAAAA 49 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACPCKHBEAAAAAAAAAAAAAAAAAAAAAA 50 | AAAAAAAAAAAAIAI8pOvIP/z1yD/89cg/1OvIP3qTAEIAAAAAOJMAQgAAAAABAAAA 51 | AgAAAADwzT8AMAJgCgAAAJgnAjy0AAAA//9//rp2AUIAAAAAiBMAAAEAAAAAAAAA 52 | AAAAAAAAAAAAAAAAiEA4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 53 | AAAAAKWlpaWlpaWlpaWlpQ== 54 | 4PLIPwAAAAC0q8g/tKvIP4zzyD+sq8g/GQAAAAAAAAAAAAAAjPPIPwAAAAAAAAAA 55 | iO3IP0lETEUAAAAAAAAAAAAAAAAAAAAAgPPIPwAAAAAAAAAAAAAAAAAAAAAAAAAA 56 | LMXIP5TFyD/8xcg/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAykgAQgAAAAAAAAAA 57 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 58 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 59 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 60 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 61 | AAIAAA== 62 | fEA4QAAAAAAAAAAAAKbIP0CGyD8AAAAAAAAAAAAAAAAAAAAAAAAAAKZJOEAAAAAA 63 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 64 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 65 | AAAAAKWlpaWlpaWlpaWlpQ== 66 | oNnIPwAAAABQq8g/UKvIP5TayD9Iq8g/AwAAAAAAAAAAAAAAlNrIPwAAAAAWAAAA 67 | kMrIP2VzcF90aW1lcgAAAAAAAAAAAAAAgNrIPxYAAAAAAAAAAAAAAAAAAAAAAAAA 68 | LMXIP5TFyD/8xcg/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAykgAQgAAAAAAAAAA 69 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 70 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 71 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 72 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 73 | AQAAAA== 74 | TkI4QLRCOEAg2sg/AKbIP0BtyD8AAAAAAAAAAAAAAAAAAAAA/////wEAAAABAAAA 75 | mNrIPwQAAAAAAAAAACAMYAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 76 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/////wAAAADyVjhA 77 | AAAAAAAAAAAAAAAAcFMAQgAAAAAAAAAAAAAAAIhAOEAAAAAAAAAAAAAAAAAAAAAA 78 | AAAAAAAAAAAAAAAAAAAAAAAAAAClpaWlpaWlpaWlpaU= 79 | FAAAAEgAAABKIAAA 80 | RVNQX0NPUkVfRFVNUF9JTkZPAAA= 81 | AgEFADdkOTQ2YThlOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 82 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 83 | EAAAAAgAAAClAgAA 84 | RVNQX0VYVFJBX0lORk8AAA== 85 | MOzIPwAAAAA= 86 | FAAAAC0AAACnAgAA 87 | RVNQX1BBTklDX0RFVEFJTFMAAAA= 88 | YWJvcnQoKSB3YXMgY2FsbGVkIGF0IFBDIDB4NDIwMDkzNTEgb24gY29yZSAwAAAA 89 | lUZp/A== 90 | -------------------------------------------------------------------------------- /tests/esp32c6/coredump.b64: -------------------------------------------------------------------------------- 1 | rAwAAAQBDQABAAAA 2 | f0VMRgEBAQAAAAAAAAAAAAQA8wABAAAAAAAAADQAAAAAAAAAAAAAADQAIAAIACgA 3 | AAAAAA== 4 | BAAAADQBAAAAAAAAAAAAAKACAACgAgAABgAAAAAAAAA= 5 | AQAAANQDAAAg/oBAIP6AQFABAABQAQAABgAAAAAAAAA= 6 | AQAAACQFAACw+4BAsPuAQGACAABgAgAABgAAAAAAAAA= 7 | AQAAAIQHAAB4BYFAeAWBQFABAABQAQAABgAAAAAAAAA= 8 | AQAAANQIAADQBIFA0ASBQKAAAACgAAAABgAAAAAAAAA= 9 | AQAAAHQJAABI6oBASOqAQFABAABQAQAABgAAAAAAAAA= 10 | AQAAAMQKAABg6YBAYOmAQOAAAADgAAAABgAAAAAAAAA= 11 | BAAAAKQLAAAAAAAAAAAAANwAAADcAAAABgAAAAAAAAA= 12 | BQAAAMwAAAABAAAA 13 | Q09SRQAAAAA= 14 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIP6AQAAAAAAAAAAAAAAAAAAAAAAAAAAA 15 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkeAQFRHgEBQ/IBABLGAQBD+gEA0NTY3 16 | b3BxcjAxMjMEAAAAtPyAQHz8gECy/IBAAAAAAKn8gEABAAAAANCAQAAAAABzdHV2 17 | AAAAAAD9gECU/YBAAAAAAAAAAACejgFAAP2AQAAAAAAlnQFCAAAAAGtsbW5naGlq 18 | Y2RlZjg5YWIAAAAA 19 | BQAAAMwAAAABAAAA 20 | Q09SRQAAAAA= 21 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAWBQAAAAAAAAAAAAAAAAAAAAAAAAAAA 22 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAslSAQAAAAAAAAAAABLGAQHAFgUAAAAAA 23 | AAAAAAAAAAAAAAAAAAAAAHhegEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 24 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 25 | AAAAAAAAAAAAAAAA 26 | BQAAAMwAAAABAAAA 27 | Q09SRQAAAAA= 28 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASOqAQAAAAAAAAAAAAAAAAAAAAAAAAAAA 29 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdlaAQPRWgEDg6YBABLGAQEDqgEAAAAAA 30 | AAAAAAAAAAAAAAAA/////wEAAAABAAAATOqAQAQAAAAAAAAAABAAIAAAAAAAAAAA 31 | AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 32 | AAAAAAAAAAAAAAAA 33 | cP2AQAAAAADsvYBA7L2AQCD+gEDkvYBAGAAAAAAAAAAAAAAAIP6AQAAAAAABAAAA 34 | HO6AQG1haW4AAAAAAAAAAAAAAAAQ/oBAAQAAAAAAAAAAAAAAAAAAAAAAAACI14BA 35 | 8NeAQFjYgEAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAABoaABCAAAAAAAAAAAAAAAA 36 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 37 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 38 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 39 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 40 | lkeAQFRHgEBQ/IBABLGAQBD+gEA0NTY3b3BxcjAxMjMEAAAAtPyAQHz8gECy/IBA 41 | AAAAAKn8gEABAAAAANCAQAAAAABzdHV2AAAAAAD9gECU/YBAAAAAAAAAAACejgFA 42 | AP2AQAAAAAAlnQFCAAAAAGtsbW5naGlqY2RlZjg5YWKBGAAAAQCAQAIAAAAAAAAA 43 | AAAAALT8gECw/IBAlgoDQKWlpaWlpaWlsPyAQISMgEClpaWlpaWlpaWlpaWUtoBA 44 | tPyAQLC2gECw/IBAYWJvcnQoKSB3YXMgY2FsbGVkIGF0IFBDIDB4NDIwMGMzZDUg 45 | b24gY29yZSAwAAAAAAACQDAAh0A0MjAwYzNkNQAlAkAAAAAAAAAAAGEAAADYwwBC 46 | AAAAAAAAAABhAAAAvo4BQAAAAAAAAAAAAJABQl6SAUClpaWlABgAABAAAAABAAAA 47 | AAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAjI0BQoCLgEB4BYFAAAAAAIyNAUIAAAAA 48 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAUKmkwFA 49 | AAAAAAAAAAAAkAFC2IqAQAAAAAAAAAAAAQAAAJT9gEAAAAAAEAAAAMT9gED+wwBC 50 | AAAAALzDAEIAAAAAAQAAAAIAAAAAAIhAAQAAAAoAAACMjQFCywAAAP//f/7mKAFC 51 | AAAAAIgTAAABAAAAAAAAAAAAAAAAAAAAAAAAAL5UgEAAAAAAAAAAAAAAAAAAAAAA 52 | AAAAAAAAAAAAAAAAAAAAAAAAAAClpaWlpaWlpaWlpaU= 53 | 0ASBQAAAAADYvYBA2L2AQHgFgUDQvYBAGQAAAAAAAAAAAAAAeAWBQAAAAAAAAAAA 54 | dP+AQElETEUAAAAAAAAAAAAAAABwBYFAAAAAAAAAAAAAAAAAAAAAAAAAAACI14BA 55 | 8NeAQFjYgEAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAABoaABCAAAAAAAAAAAAAAAA 56 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 57 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 58 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 59 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA 60 | slSAQAAAAAAAAAAABLGAQHAFgUAAAAAAAAAAAAAAAAAAAAAAAAAAAHhegEAAAAAA 61 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 62 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 63 | AAAAAKWlpaWlpaWlpaWlpQ== 64 | YOmAQAAAAAB0vYBAdL2AQEjqgEBsvYBAAwAAAAAAAAAAAAAASOqAQAAAAAAWAAAA 65 | RNqAQGVzcF90aW1lcgAAAAAAAABA6oBAFgAAAAAAAAAAAAAAAAAAAAAAAACI14BA 66 | 8NeAQFjYgEAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAACchAJAAAAAAAAAAAAAAAAA 67 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 68 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 69 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 70 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA 71 | dlaAQPRWgEDg6YBABLGAQEDqgEAAAAAAAAAAAAAAAAAAAAAA/////wEAAAABAAAA 72 | TOqAQAQAAAAAAAAAABAAIAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 73 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/////wAAAAACbIBA 74 | AAAAAAAAAAAAAAAAavcAQgAAAAAAAAAAAAAAAL5UgEAAAAAAAAAAAAAAAAAAAAAA 75 | AAAAAAAAAAAAAAAAAAAAAAAAAAClpaWlpaWlpaWlpaU= 76 | EwAAAEgAAABKIAAA 77 | RVNQX0NPUkVfRFVNUF9JTkZPAAA= 78 | BAENADY0ZDM3MzhjMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 79 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 80 | DwAAAAgAAAClAgAA 81 | RVNQX0VYVFJBX0lORk8ATg== 82 | IP6AQAAAAAA= 83 | EgAAAC0AAACnAgAA 84 | RVNQX1BBTklDX0RFVEFJTFMAAAA= 85 | YWJvcnQoKSB3YXMgY2FsbGVkIGF0IFBDIDB4NDIwMGMzZDUgb24gY29yZSAw 86 | AAAA 87 | S+zjX3KBPBXzd6sX7iOZsrst60gM/lIS9tvZLh8B6+Y= 88 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # CHANGELOG 6 | 7 | > All notable changes to this project are documented in this file. 8 | > This list is not exhaustive - only important changes, fixes, and new features in the code are reflected here. 9 | 10 | 21 |
22 | 23 | ## v1.14.0 (2025-07-28) 24 | 25 | ### ✨ New Features 26 | 27 | - add sha256 header format v2.2 *(Erhan Kurubas - 9141be0)* 28 | - Add ESP32-H4 and ESP32-H21 supports *(Erhan Kurubas - 01a6eab)* 29 | 30 | 31 | ## v1.13.1 (2025-02-03) 32 | 33 | 34 | ## v1.13.0 (2025-02-03) 35 | 36 | ### ✨ New Features 37 | 38 | - add support for new roms.json location *(Peter Dragun - 90a1a68)* 39 | 40 | ### 🐛 Bug Fixes 41 | 42 | - **cli**: provide correct error messages and rework the script structure *(Peter Dragun - f15a82c)* 43 | - Use Posix paths on Windows for loading symbols from file *(Roland Dobai - 4b7d3d8)* 44 | - Fix empty env variable for ROM ELF directory *(Peter Dragun - 1c0295b)* 45 | - close pipes in gdb subprocess *(Peter Dragun - 51fdc71)* 46 | 47 | 48 | ## v1.12.0 (2024-10-03) 49 | 50 | ### ✨ New Features 51 | 52 | - **esp-coredump**: add esp32c61 chip support *(Erhan Kurubas - 7b75c8a)* 53 | 54 | ### 🐛 Bug Fixes 55 | 56 | - **python3.12**: replace distutils with shutil *(Guilhem Saurel - d45c2e7)* 57 | - **gdb**: EspGDB descrutor Thread exceptions fix *(Jakub Kocka - 50692f5)* 58 | 59 | --- 60 | 61 | ## v1.11.0 (2024-04-12) 62 | 63 | ### ✨ New Features 64 | 65 | - **esp-coredump**: add esp32c5 chip support *(Erhan Kurubas - e5b6f5a)* 66 | - make serial port arg optional *(Erhan Kurubas - 10c5ea9)* 67 | 68 | ### 🐛 Bug Fixes 69 | 70 | - **coredump**: handle value errors when parsing TCB variable *(Erhan Kurubas - 683d00f)* 71 | - add cli option to pass partition table offset *(Peter Dragun - ac7659d)* 72 | 73 | ### 📖 Documentation 74 | 75 | - add instructions for standalone installation *(Peter Dragun - ce7a387)* 76 | 77 | --- 78 | 79 | ## v1.10.0 (2024-01-10) 80 | 81 | ### ✨ New Features 82 | 83 | - **esp-coredump**: add esp32p4 chip support *(Erhan Kurubas - 890d68a)* 84 | 85 | --- 86 | 87 | ## v1.9.0 (2023-12-06) 88 | 89 | ### ✨ New Features 90 | 91 | - add auto detection for core file format *(Peter Dragun - 05e02af)* 92 | 93 | --- 94 | 95 | ## v1.8.0 (2023-11-20) 96 | 97 | ### ✨ New Features 98 | 99 | - **esp-coredump**: increase version to 1.8.0 *(Erhan Kurubas - 460b9d6)* 100 | - **coredump**: print isr context from elf file *(Erhan Kurubas - 52fb6f2)* 101 | 102 | --- 103 | 104 | ## v1.7.0 (2023-08-07) 105 | 106 | ### ✨ New Features 107 | 108 | - **esp-coredump**: increase version to 1.7.0 *(Erhan Kurubas - 0b374a4)* 109 | - **coredump**: parse panic_details from elf file *(Erhan Kurubas - 0361906)* 110 | 111 | --- 112 | 113 | ## v1.6.0 (2023-07-05) 114 | 115 | ### 🐛 Bug Fixes 116 | 117 | - **coredump-info**: esp32c2/esp32c6/esp32h2 corefile support *(Alexey Lapshin - 7e3f8f7)* 118 | 119 | --- 120 | 121 | ## v1.5.2 (2023-06-06) 122 | 123 | ### ✨ New Features 124 | 125 | - **coredump-info**: retry reading thread info if not successful *(Peter Dragun - d69dc03)* 126 | 127 | --- 128 | 129 | ## v1.5.1 (2023-05-22) 130 | 131 | ### 🐛 Bug Fixes 132 | 133 | - increase the version of the package *(Aleksei Apaseev - 6fe11bc)* 134 | 135 | --- 136 | 137 | ## v1.5.0 (2023-02-21) 138 | 139 | ### ✨ New Features 140 | 141 | - add functionality to load ROM symbols automatically *(Aleksei Apaseev - 6e53888)* 142 | 143 | ### 🐛 Bug Fixes 144 | 145 | - fix isort error *(Aleksei Apaseev - 954501e)* 146 | - update pre-commit flake8 repo *(Aleksei Apaseev - a57a812)* 147 | 148 | --- 149 | 150 |
151 | 152 | 153 | Commitizen Espressif plugin 154 | 155 |
156 | Espressif Systems CO LTD. (2025) 157 |
158 |
159 | -------------------------------------------------------------------------------- /esp_coredump/corefile/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | # 6 | 7 | 8 | from abc import ABC, abstractmethod 9 | from importlib import import_module 10 | from typing import Optional, Tuple 11 | 12 | from .elf import ElfFile 13 | 14 | __all__ = [ 15 | 'ElfFile', 'ESPCoreDumpLoaderError' 16 | ] 17 | 18 | XTENSA_TARGETS = ['esp32', 'esp32s2', 'esp32s3'] 19 | RISCV_TARGETS = ['esp32c3', 'esp32c2', 'esp32c6', 'esp32h2', 'esp32p4', 'esp32c5', 'esp32c61', 'esp32h21', 'esp32h4'] 20 | SUPPORTED_TARGETS = XTENSA_TARGETS + RISCV_TARGETS 21 | 22 | 23 | class ESPCoreDumpError(RuntimeError): 24 | pass 25 | 26 | 27 | class ESPCoreDumpLoaderError(ESPCoreDumpError): 28 | def __init__(self, message, extra_output=None) -> None: 29 | super().__init__(message) 30 | self.extra_output = extra_output 31 | 32 | 33 | class BaseArchMethodsMixin(ABC): # type: ignore 34 | @staticmethod 35 | @abstractmethod 36 | def get_registers_from_stack(data, grows_down): 37 | # type: (bytes, bool) -> Tuple[list[int], Optional[dict[int, int]]] 38 | """ 39 | Parse stack data, growing up stacks are not supported for now. 40 | :param data: stack data 41 | :param grows_down: stack grow direction 42 | :return: return tuple (regs, exception_regs) 43 | """ 44 | pass 45 | 46 | @staticmethod 47 | @abstractmethod 48 | def build_prstatus_data(tcb_addr, task_regs): # type: (int, list[int]) -> str 49 | """ 50 | Build PrStatus note section 51 | :param tcb_addr: tcb addr 52 | :param task_regs: registers 53 | :return: str 54 | """ 55 | pass 56 | 57 | 58 | class BaseTargetMethods(BaseArchMethodsMixin, ABC): # type: ignore 59 | UNKNOWN = 'unknown' 60 | TARGET = UNKNOWN 61 | 62 | COREDUMP_FAKE_STACK_START = 0x20000000 63 | COREDUMP_FAKE_STACK_LIMIT = 0x30000000 64 | COREDUMP_MAX_TASK_STACK_SIZE = 64 * 1024 65 | 66 | def __init__(self): # type: () -> None 67 | if self.TARGET == self.UNKNOWN: 68 | raise ValueError('Please use the derived child-class with valid TARGET') 69 | 70 | self._set_attr_from_soc_header() 71 | 72 | def _set_attr_from_soc_header(self): # type: () -> None 73 | module = import_module('esp_coredump.corefile.soc_headers.{}'.format(self.TARGET)) 74 | for k, v in module.__dict__.items(): 75 | if k.startswith('SOC_'): 76 | setattr(self, k, v) 77 | 78 | def _esp_ptr_in_dram(self, addr): # type: (int) -> bool 79 | return self.SOC_DRAM_LOW <= addr < self.SOC_DRAM_HIGH # type: ignore 80 | 81 | def _esp_ptr_in_iram(self, addr): # type: (int) -> bool 82 | return self.SOC_IRAM_LOW <= addr < self.SOC_IRAM_HIGH # type: ignore 83 | 84 | def _esp_ptr_in_external_dram(self, addr): # type: (int) -> bool 85 | return self.SOC_EXTRAM_DATA_LOW <= addr < self.SOC_EXTRAM_DATA_HIGH # type: ignore 86 | 87 | def _esp_ptr_in_rtc_slow(self, addr): # type: (int) -> bool 88 | return self.SOC_RTC_DATA_LOW <= addr < self.SOC_RTC_DATA_HIGH # type: ignore 89 | 90 | def _esp_ptr_in_rtc_dram_fast(self, addr): # type: (int) -> bool 91 | return self.SOC_RTC_DRAM_LOW <= addr < self.SOC_RTC_DRAM_HIGH # type: ignore 92 | 93 | def tcb_is_sane(self, tcb_addr, tcb_size): # type: (int, int) -> bool 94 | for func in [self._esp_ptr_in_dram, 95 | self._esp_ptr_in_iram, 96 | self._esp_ptr_in_rtc_slow, 97 | self._esp_ptr_in_rtc_dram_fast]: 98 | res = func(tcb_addr) and func(tcb_addr + tcb_size - 1) 99 | if res: 100 | return True 101 | return False 102 | 103 | def _esp_stack_ptr_in_dram(self, addr): # type: (int) -> bool 104 | return not (addr < self.SOC_DRAM_LOW + 0x10 # type: ignore 105 | or addr > self.SOC_DRAM_HIGH - 0x10 # type: ignore 106 | or (addr & 0xF) != 0) 107 | 108 | def _esp_stack_ptr_in_extram(self, addr): # type: (int) -> bool 109 | return (self._esp_ptr_in_external_dram(addr) 110 | and (addr & 0xF) == 0) 111 | 112 | def stack_is_sane(self, stack_start, stack_end): # type: (int, int) -> bool 113 | return (((self._esp_stack_ptr_in_dram(stack_start) and self._esp_ptr_in_dram(stack_end)) 114 | or (self._esp_stack_ptr_in_extram(stack_start) and self._esp_ptr_in_external_dram(stack_end)) 115 | or (self._esp_ptr_in_rtc_dram_fast(stack_start) and self._esp_ptr_in_rtc_dram_fast(stack_end))) 116 | and stack_start < stack_end 117 | and (stack_end - stack_start) < self.COREDUMP_MAX_TASK_STACK_SIZE) 118 | 119 | def addr_is_fake(self, addr): # type: (int) -> bool 120 | return (self.COREDUMP_FAKE_STACK_START <= addr < self.COREDUMP_FAKE_STACK_LIMIT 121 | or addr > 2 ** 31 - 1) 122 | -------------------------------------------------------------------------------- /tests/esp32/coredump_bin.b64: -------------------------------------------------------------------------------- 1 | LBAAAAMAAAAFAAAAVAEAAAAAAAAsAQAA 2 | 8Pr6P/A7+z8AP/s/ 3 | kD37PwAAAAB0Jfs/dCX7P/D6+j9sJfs/GAAAAAAAAAAAAAAA8Pr6PwAAAAABAAAA 4 | EC/7P21haW4AAAAAAAAAAAAAAAAAAAAAAD/7PwEAAAAAAAAAAAAAAAAAAAAAAAAA 5 | 0Ov6Pzjs+j+g7Po/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAFDQNQAAAAAAAAAAA 6 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 7 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 8 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 9 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 10 | AAAAAA== 11 | 776t3ugTCEAwDwYAWFEIgLA8+z/7PPs/KD37PwoAAACAAAAAAQAAAOTt+j9YIvs/ 12 | AQAAAPk8+z/5PPs/AAAAACMABgABAAAAIA5APxAAAAAAAAAAAAAAAEnDAEBrwwBA 13 | AAAAAAAAAAAjAAYAECYIQDT7+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA 14 | AAAAAAAAAAAAAAAAAAAAAAQAAABUAAAABAgAAKWlpaU0qwiA0Dz7P/s8+z/5PPs/ 15 | Iw8GAHQ8+z8AAAAAAAAAAJRvDYDwPPs/AAAAADjs+j8KAAAALD37P2sOQD8DAAAA 16 | eHwAgGA9+z9hAAAAfDz7PzQwMGQ2ZjkxADAAYWJvcnQoKSB3YXMgY2FsbGVkIGF0 17 | IFBDIDB4NDAwZDZmOTEgb24gY29yZSAwAAAAAAAAAACYHfs/8Dz7P7Qd+z/5PPs/ 18 | tDz7P5A6+z+QPPs/BAAAAEuBAICAPfs/YQAAADA++z8LAAAAaw5APxUAAACQPPs/ 19 | rG8NgKA9+z8ZF0A/AAAAABA++z8MAAAA/Cn7PxAAAAC7Nw6AMD77PwMAAAAgDkA/ 20 | MD77PxA++z8MAAAAIA5APxA++z8MAAAA/Cn7PxAAAAAQPvs/0D37PwQAAAAgDkA/ 21 | MD77P4BvDUBMDkA/MD77PxA++z8MAAAAED77PwwAAAAAAAAAAAAAAKA9+z8AAAAA 22 | MD77PxA++z8MAAAAAQAAAAQAAAAAAAAAAAAAAAwAAADcWAiAUD77PwAAAAAAAAAA 23 | TA5AP80AAAAgDkA/UD77PwAAAACAPvs/MDcOQAAAAACIEwAAAwAAAAAAAAAAAAAA 24 | ZCf7PyMABgABAAAAIA5APwAAAACgPvs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 25 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArD77P6WlpaWlpaWlpaWlpaWlpaWlpaWl 26 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 27 | paWlpaWlpaWlpaWlpaWlpQ== 28 | VPz6P/BD+z8QRfs/ 29 | 8EP7PwAAAAC8/fo/YCX7P1T8+j9YJfs/GQAAAAAAAAAAAAAAVPz6PwAAAAAAAAAA 30 | FD/7P0lETEUwAAAAAAAAAAAAAAAAAAAAEEX7PwAAAAAAAAAAAAAAAAAAAAAAAAAA 31 | 0Ov6Pzjs+j+g7Po/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAFDQNQAAAAAAAAAAA 32 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 33 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 34 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 35 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 36 | AAIAAA== 37 | cCYIQNRYCEAwAAUAAAAAALBE+z8AAAAAAAAAAAAAAAAAAAAAhGYIQAAAAAAAAAAA 38 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 39 | AAAAAAAAAAAAAAAAAAAAAEQB+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 40 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 41 | AAAAAAAAAAC8RPs/paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 42 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 43 | uP36P3BJ+z8QS/s/ 44 | cEn7PwAAAABgJfs/WPz6P7j9+j9YJfs/GQAAAAAAAAAAAAAAuP36PwAAAAAAAAAA 45 | GEX7P0lETEUxAAAAAAAAAAAAAAABAAAAEEv7PwAAAAAAAAAAAAAAAAAAAAAAAAAA 46 | 0Ov6Pzjs+j+g7Po/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAFDQNQAAAAAAAAAAA 47 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 48 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 49 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 50 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 51 | AAIAAA== 52 | cCYIQI4/CEAwAAYAIh8NgDBK+z8AAAAAAAAAAAD5+j/g+Po/OBcIQAEAAAAAAAAA 53 | AAAAAAAAAAAAAAAA4Pj6P8D4+j8BAAAAAAAAAAAAAAClpaWlpaWlpQAAAAAAAAAA 54 | AAAAAI4oCEDA+Po/elwIQEQH+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 55 | AAAAAAAAAAAAAAAAAAAAAAAAAACEZghAAAAAAAAAAACNZgiAUEr7PwMAAAAjAAYA 56 | AAAAAAAAAAAAAAAAAAAAANxYCIBwSvs/AAAAAAAAAAAjAAYAAQAAAAEAAAAIAAAA 57 | AAAAAJBK+z+EZghAAAAAAGgn+z8jAAYAAQAAAAEAAAAAAAAAsEr7PwAAAAAAAAAA 58 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALxK+z+lpaWl 59 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 60 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaU= 61 | BPT6P0Dy+j/w8/o/ 62 | QPL6PwAAAABw+fo/3CT7PwT0+j/UJPs/AQAAAAAAAAAAAAAABPT6PwAAAAAYAAAA 63 | APD6P2lwYzAAAAAAAAAAAAAAAAAAAAAA8PP6PxgAAAAAAAAAAAAAAAAAAAAAAAAA 64 | 0Ov6Pzjs+j+g7Po/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAFDQNQAAAAAAAAAAA 65 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 66 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 67 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 68 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 69 | AQAAAA== 70 | cCYIQPC/AEAwAAYA9FsIgADz+j8AAAAAIwAGACAABgDQOv4/uP36P1QBAADcAPA/ 71 | AQAAALwH+z//////RgAAAyMABgC4/fo/zc0AAAQAAAClpaWlpaWlpQAAAAAAAAAA 72 | AAAAAI4oCEAjAAYAelwIQCSw+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA 73 | AAAAAAAAAAAAAAAAAAAAAJDz+j8AAAAAAAAAAAAAAACEeAiAEPP6P9gA+z8BAAAA 74 | ZBcIgDDz+j8AAAAAAQAAAEBCDwAjAAYAAAAAAAAAAADcWAiAUPP6PwAAAAAAAAAA 75 | 2AD7Pwj0+j9w+fo/AAAAAAAAAABw8/o/OBcIQAAAAAAVYAiAIwMGAAEAAAAAAAAA 76 | AAAAAJDz+j8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 77 | AAAAAAAAAACc8/o/paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 78 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 79 | bPn6P7D3+j9g+fo/ 80 | sPf6PwAAAADcJPs/CPT6P2z5+j/UJPs/AQAAAAAAAAAAAAAAbPn6PwAAAAAYAAAA 81 | aPX6P2lwYzEAAAAAAAAAAAAAAAABAAAAYPn6PxgAAAAAAAAAAAAAAAAAAAAAAAAA 82 | 0Ov6Pzjs+j+g7Po/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAFDQNQAAAAAAAAAAA 83 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 84 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 85 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 86 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 87 | AQAAAA== 88 | cCYIQPC/AEAwAAYA9FsIgHD4+j8AAAAAIwAGACAABgBgfP4/4Ob6P9D6+j/gAPA/ 89 | AQAAALwH+z//////QgAAAyMABgDg5vo/q6sAAAQAAAClpaWlpaWlpQAAAAAAAAAA 90 | AAAAAI4oCEAjAAYAelwIQJS1+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA 91 | AAAAAAAAAAAAAAAAAAAAAAD5+j8AAAAAAAAAAAAAAACEeAiAgPj6P9gA+z8BAAAA 92 | ZBcIgKD4+j8AAAAAAQAAAEBCDwAjAAYAAAAAAAEAAADcWAiAwPj6PwEAAAAAAAAA 93 | 2AD7P3D5+j9AJ/s/AAAAAAAAAADg+Po/OBcIQAEAAAAVYAiAIwsGAAEAAAABAAAA 94 | AAAAAAD5+j8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 95 | AAAAAAAAAAAM+fo/paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 96 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 97 | s+QsAw== 98 | -------------------------------------------------------------------------------- /esp_coredump/corefile/gdb.py: -------------------------------------------------------------------------------- 1 | # 2 | # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | # 6 | 7 | import logging 8 | import os 9 | import re 10 | import time 11 | from subprocess import TimeoutExpired 12 | 13 | from pygdbmi.gdbcontroller import GdbController 14 | 15 | from . import ESPCoreDumpError 16 | 17 | DEFAULT_GDB_TIMEOUT_SEC = 3 18 | 19 | 20 | class EspGDB(object): 21 | def __init__(self, gdb_args, timeout_sec=DEFAULT_GDB_TIMEOUT_SEC): 22 | 23 | """ 24 | Start GDB and initialize a GdbController instance 25 | """ 26 | try: 27 | self.p = GdbController(command=gdb_args) 28 | except TypeError: 29 | # fallback for pygdbmi<0.10.0.0. 30 | self.p = GdbController(gdb_path=gdb_args[0], gdb_args=gdb_args[1:]) 31 | 32 | self.timeout = timeout_sec 33 | 34 | # Consume initial output by issuing a dummy command 35 | self._gdbmi_run_cmd_get_responses(cmd='-data-list-register-values x pc', 36 | resp_message=None, resp_type='console', multiple=True, 37 | done_message='done', done_type='result') 38 | 39 | def __del__(self): 40 | """EspGDB destructor taking GdbController.gdb_process.exit() and adjusting it to work properly""" 41 | try: 42 | if self.p.gdb_process: 43 | self.p.gdb_process.terminate() 44 | if os.name != 'nt': 45 | # this is causing an Exception on Windows, but is required on UNIX systems 46 | self.p.gdb_process.communicate() # Close pipes (STDIN, STDOUT, STDERR) 47 | try: 48 | self.p.gdb_process.wait(timeout=1) 49 | except TimeoutExpired: 50 | if self.p.gdb_process.returncode is None: 51 | self.p.gdb_process.kill() 52 | self.p.gdb_process = None 53 | except IndexError: 54 | logging.warning('Attempt to terminate the GDB process failed, because it is already terminated. Skip') 55 | 56 | def _gdbmi_run_cmd_get_responses(self, cmd, resp_message, resp_type, multiple=True, 57 | done_message=None, done_type=None, response_delay_sec=None): 58 | 59 | self.p.write(cmd, read_response=False) 60 | t_end = time.time() + (response_delay_sec or self.timeout) 61 | filtered_response_list = [] 62 | all_responses = [] 63 | while time.time() < t_end: 64 | more_responses = self.p.get_gdb_response(timeout_sec=0, raise_error_on_timeout=False) 65 | filtered_response_list += filter(lambda rsp: rsp['message'] == resp_message and rsp['type'] == resp_type, 66 | more_responses) 67 | all_responses += more_responses 68 | if filtered_response_list and not multiple: 69 | break 70 | if done_message and done_type and self._gdbmi_filter_responses(more_responses, done_message, done_type): 71 | break 72 | if not filtered_response_list and not multiple: 73 | raise ESPCoreDumpError("Couldn't find response with message '{}', type '{}' in responses '{}'".format( 74 | resp_message, resp_type, str(all_responses) 75 | )) 76 | return filtered_response_list 77 | 78 | def _gdbmi_run_cmd_get_one_response(self, cmd, resp_message, resp_type, response_delay_sec=None): 79 | 80 | return self._gdbmi_run_cmd_get_responses(cmd, resp_message, resp_type, response_delay_sec=response_delay_sec, 81 | multiple=False)[0] 82 | 83 | def _gdbmi_data_evaluate_expression(self, expr): 84 | """ Get the value of an expression, similar to the 'print' command """ 85 | return self._gdbmi_run_cmd_get_one_response("-data-evaluate-expression \"%s\"" % expr, 86 | 'done', 'result')['payload']['value'] 87 | 88 | def get_tcb_variable(self, tcb_addr, variable): 89 | """ Get FreeRTOS variable from given TCB address """ 90 | try: 91 | val = self._gdbmi_data_evaluate_expression('(char*)((TCB_t *)0x%x)->%s' % (tcb_addr, variable)) 92 | except (ESPCoreDumpError, KeyError): 93 | # KeyError is raised when "value" is not in "payload" 94 | return '' 95 | return val 96 | 97 | def parse_tcb_variable(self, tcb_addr, variable): 98 | """ Get FreeRTOS variable from given TCB address """ 99 | val = self.get_tcb_variable(tcb_addr, variable) 100 | 101 | # Value is of form '0x12345678 ""' 102 | result = re.search(r'0x[0-9a-fA-F]+', val) 103 | if result: 104 | return result.group(0) 105 | return '' 106 | 107 | def get_freertos_task_name(self, tcb_addr): 108 | """ Get FreeRTOS task name given the TCB address """ 109 | val = self.get_tcb_variable(tcb_addr, 'pcTaskName') 110 | 111 | # Value is of form '0x12345678 "task_name"', extract the actual name 112 | result = re.search(r"\"([^']*)\"$", val) 113 | if result: 114 | return result.group(1) 115 | return '' 116 | 117 | def run_cmd(self, gdb_cmd): 118 | """ Execute a generic GDB console command via MI2 119 | """ 120 | filtered_responses = self._gdbmi_run_cmd_get_responses(cmd="-interpreter-exec console \"%s\"" % gdb_cmd, 121 | resp_message=None, resp_type='console', multiple=True, 122 | done_message='done', done_type='result') 123 | return ''.join([x['payload'] for x in filtered_responses]) \ 124 | .replace('\\n', '\n') \ 125 | .replace('\\t', '\t') \ 126 | .rstrip('\n') \ 127 | .replace('\\"', '"') 128 | 129 | def get_thread_info(self, response_delay_sec=DEFAULT_GDB_TIMEOUT_SEC): 130 | """ Get information about all threads known to GDB, and the current thread ID """ 131 | result = self._gdbmi_run_cmd_get_one_response('-thread-info', 'done', 'result', response_delay_sec=response_delay_sec)['payload'] 132 | if not result: 133 | return None, None 134 | 135 | current_thread_id = result['current-thread-id'] 136 | threads = result['threads'] 137 | return threads, current_thread_id 138 | 139 | def switch_thread(self, thr_id): 140 | """ Tell GDB to switch to a specific thread, given its ID """ 141 | self._gdbmi_run_cmd_get_one_response('-thread-select %s' % thr_id, 'done', 'result') 142 | 143 | @staticmethod 144 | def _gdbmi_filter_responses(responses, resp_message, resp_type): 145 | return list(filter(lambda rsp: rsp['message'] == resp_message and rsp['type'] == resp_type, responses)) 146 | 147 | @staticmethod 148 | def gdb2freertos_thread_id(gdb_target_id): 149 | """ Convert GDB 'target ID' to the FreeRTOS TCB address """ 150 | return int(gdb_target_id.replace('process ', ''), 0) 151 | -------------------------------------------------------------------------------- /tests/esp32p4/coredump.b64: -------------------------------------------------------------------------------- 1 | 4BMAAAIBEgAAAAAAAAAAAAAAAAAAAAAA 2 | f0VMRgEBAQAAAAAAAAAAAAQA8wABAAAAAAAAADQAAAAAAAAAAAAAADQAIAAMACgA 3 | AAAAAA== 4 | BAAAALQBAAAAAAAAAAAAAGAEAABgBAAABgAAAAAAAAA= 5 | AQAAABQGAADU9PBP1PTwT1QBAABUAQAABgAAAAAAAAA= 6 | AQAAAGgHAABA8vBPQPLwT4ACAACAAgAABgAAAAAAAAA= 7 | AQAAAOgJAAAw/PBPMPzwT1QBAABUAQAABgAAAAAAAAA= 8 | AQAAADwLAABg+/BPYPvwT8AAAADAAAAABgAAAAAAAAA= 9 | AQAAAPwLAACMA/FPjAPxT1QBAABUAQAABgAAAAAAAAA= 10 | AQAAAFANAACQAvFPkALxT/AAAADwAAAABgAAAAAAAAA= 11 | AQAAAEAOAAD83fBP/N3wT1QBAABUAQAABgAAAAAAAAA= 12 | AQAAAJQPAADw3PBP8NzwTwABAAAAAQAABgAAAAAAAAA= 13 | AQAAAJQQAABY4/BPWOPwT1QBAABUAQAABgAAAAAAAAA= 14 | AQAAAOgRAABQ4vBPUOLwTwABAAAAAQAABgAAAAAAAAA= 15 | BAAAAOgSAAAAAAAAAAAAANwAAADcAAAABgAAAAAAAAA= 16 | CAAAAMwAAAABAAAA 17 | Q09SRQAAAAA= 18 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1PTwTwAAAAAAAAAAAAAAAAAAAAAAAAAA 19 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AnwT1w/8E/g8vBPEK/wT6D08E80NTY3 20 | b3BxcjAxMjMEAAAARPPwTwzz8E9C8/BPAAAAADnz8E8BAAAAANDwTwAAAABzdHV2 21 | AAAAAJDz8E8k9PBPAAAAAAAAAAByLMBPkPPwTwAAAADNHgJAAAAAAGtsbW5naGlq 22 | Y2RlZjg5YWIAAAAA 23 | CAAAAMwAAAABAAAA 24 | Q09SRQAAAAA= 25 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMPzwTwAAAAAAAAAAAAAAAAAAAAAAAAAA 26 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXEfwTwAAAAAAAAAAEK/wTwD88E8AAAAA 27 | AAAAAAAAAAAAAAAAAAAAAMRa8E8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 28 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 29 | AAAAAAAAAAAAAAAA 30 | CAAAAMwAAAABAAAA 31 | Q09SRQAAAAA= 32 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAPxTwAAAAAAAAAAAAAAAAAAAAAAAAAA 33 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtirwT/abAEAQA/FPEK/wT2AD8U8AAAAA 34 | AAAAAAAAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA8AAAABwAAAAAAAAAAAAAA 35 | AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 36 | AAAAAAAAAAAAAAAA 37 | CAAAAMwAAAABAAAA 38 | Q09SRQAAAAA= 39 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/N3wTwAAAAAAAAAAAAAAAAAAAAAAAAAA 40 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbEnwT6ps8E9w3fBPEK/wT9Dd8E8AAAAA 41 | AAAAAAAAAAAAAAAAAQAAAAAAAB8AAAAAAAAAfwAAAAAAAAAAAAAAHwAAAAAAAAAA 42 | /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 43 | AAAAAAAAAAAAAAAA 44 | CAAAAMwAAAABAAAA 45 | Q09SRQAAAAA= 46 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWOPwTwAAAAAAAAAAAAAAAAAAAAAAAAAA 47 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbEnwT6ps8E/Q4vBPEK/wTzDj8E8AAAAA 48 | AAAAAAAAAAAAAAAAAQAAAAAAAB8AAAAAAAAAfwQAAAAAAAAAAAAAHwAAAAAAAAAA 49 | /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 50 | AAAAAAAAAAAAAAAA 51 | 0PPwTwAAAABktPBPZLTwT9T08E9ctPBPGAAAAAAAAAAAAAAA1PTwTwAAAAABAAAA 52 | 0OTwT21haW4AAAAAAAAAAAAAAAAAAAAAwPTwTwEAAAAAAAAAAAAAAAAAAAAAAAAA 53 | FNbwT3zW8E/k1vBPAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAqqnATwAAAAAAAAAA 54 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 55 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 56 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 57 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 58 | AAAAAA== 59 | 2AnwT1w/8E/g8vBPEK/wT6D08E80NTY3b3BxcjAxMjMEAAAARPPwTwzz8E9C8/BP 60 | AAAAADnz8E8BAAAAANDwTwAAAABzdHV2AAAAAJDz8E8k9PBPAAAAAAAAAAByLMBP 61 | kPPwTwAAAADNHgJAAAAAAGtsbW5naGlqY2RlZjg5YWKAGAAAAwDwTwcAAAAAAAAA 62 | AAAAAETz8E9A8/BPQJfBT6WlpaWlpaWlQPPwT9qW8E+lpaWlpaWlpaWlpaUcsPBP 63 | RPPwTziw8E9A8/BPYWJvcnQoKSB3YXMgY2FsbGVkIGF0IFBDIDB4NDAwMDg5ODcg 64 | b24gY29yZSAwAAAAAADATzAAAAA0MDAwODk4NwAAAAAAAAAAAAAAAGEAAACKiQBA 65 | AAAAAAAAAABhAAAAkizATwAAAAAAAAAAABACQDIwwE8AAAAAUAXxTwQF8U8AAAAA 66 | AAAAAFAF8U8EBfFPxkXwT4wD8U8QAAAAAAAAADz08E9oDQJAMA0CQAMAAAAAAAAA 67 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAkB6McBP 68 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACQCT08E8AAAAAVqUAQAEAAACwiQBA 69 | SAbxT26JAEAAAAB/AAAAAAIAAAAAAPRPkE8AQAoAAAAwDQJAyAAAAITL8E/uWAFA 70 | AAAAAIgTAAADAAAAAAAAAAAAAAAAAAAAAAAAAGhH8E8AAAAAAAAAAAAAAAAAAAAA 71 | AAAAAAAAAAAAAAAAAAAAAAAAAAClpaWlpaWlpaWlpaUAAAAAAAAAAAAAAAAAAAAA 72 | AAAAAKWlpaWlpaWlpaWlpQ== 73 | YPvwTwAAAACQA/FPULTwTzD88E9ItPBPGQAAAAAAAAAAAAAAMPzwTwAAAAAAAAAA 74 | LPbwT0lETEUwAAAAAAAAAAAAAAAAAAAAIPzwTwAAAAAAAAAAAAAAAAAAAAAAAAAA 75 | FNbwT3zW8E/k1vBPAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAATDMAQAAAAAAAAAAA 76 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 77 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 78 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 79 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 80 | AAIAAA== 81 | XEfwTwAAAAAAAAAAEK/wTwD88E8AAAAAAAAAAAAAAAAAAAAAAAAAAMRa8E8AAAAA 82 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 83 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 84 | AAAAAKWlpaWlpaWlpaWlpQAAAAAAAAAAAAAAAAAAAAAAAAAApaWlpaWlpaWlpaWl 85 | kALxTwAAAABQtPBPNPzwT4wD8U9ItPBPGQAAAAAAAAAAAAAAjAPxTwAAAAAAAAAA 86 | iP3wT0lETEUxAAAAAAAAAAAAAAABAAAAgAPxTwAAAAAAAAAAAAAAAAAAAAAAAAAA 87 | FNbwT3zW8E/k1vBPAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAATDMAQAAAAAAAAAAA 88 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 89 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 90 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 91 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 92 | AAIAAA== 93 | tirwT/abAEAQA/FPEK/wT2AD8U8AAAAAAAAAAAAAAAAIAAAAAQAAAAAAAAAAAAAA 94 | AAAAAAAAAAA8AAAABwAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 95 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUWvBP 96 | AAAAAAAAAAAAAAAAaEfwTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 97 | AAAAAKWlpaWlpaWlpaWlpQAAAAAAAAAAAAAAAAAAAAAAAAAApaWlpaWlpaWlpaWl 98 | 8NzwTwAAAABc4/BP2LPwT/zd8E/Qs/BPAQAAAAAAAAAAAAAA/N3wTwAAAAAYAAAA 99 | +NnwT2lwYzAAAAAAAAAAAAAAAAAAAAAA8N3wTxgAAAAAAAAAAAAAAAAAAAAAAAAA 100 | FNbwT3zW8E/k1vBPAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAATDMAQAAAAAAAAAAA 101 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 102 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 103 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 104 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 105 | AQAAAA== 106 | bEnwT6ps8E9w3fBPEK/wT9Dd8E8AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAB8AAAAA 107 | AAAAfwAAAAAAAAAAAAAAHwAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAA 108 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGJfBP 109 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhH8E8AAAAAAAAAAAAAAAAAAAAA 110 | AAAAAAAAAAAAAAAAAAAAAAAAAAClpaWlpaWlpaWlpaUAAAAAAAAAAAAAAAAAAAAA 111 | AAAAAKWlpaWlpaWlpaWlpQ== 112 | UOLwTwAAAADYs/BPAN7wT1jj8E/Qs/BPAQAAAAAAAAAAAAAAWOPwTwAAAAAYAAAA 113 | VN/wT2lwYzEAAAAAAAAAAAAAAAABAAAAUOPwTxgAAAAAAAAAAAAAAAAAAAAAAAAA 114 | FNbwT3zW8E/k1vBPAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAATDMAQAAAAAAAAAAA 115 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 116 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 117 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 118 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 119 | AQAAAA== 120 | bEnwT6ps8E/Q4vBPEK/wTzDj8E8AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAB8AAAAA 121 | AAAAfwQAAAAAAAAAAAAAHwAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAA 122 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAACGJfBP 123 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhH8E8AAAAAAAAAAAAAAAAAAAAA 124 | AAAAAAAAAAAAAAAAAAAAAAAAAAClpaWlpaWlpaWlpaUAAAAAAAAAAAAAAAAAAAAA 125 | AAAAAKWlpaWlpaWlpaWlpQ== 126 | FAAAAEgAAABKIAAA 127 | RVNQX0NPUkVfRFVNUF9JTkZPAAA= 128 | AgESADQ3ZThiN2FjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 129 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 130 | EAAAAAgAAAClAgAA 131 | RVNQX0VYVFJBX0lORk8AAA== 132 | 1PTwTwAAAAA= 133 | FAAAAC0AAACnAgAA 134 | RVNQX1BBTklDX0RFVEFJTFMAAAA= 135 | YWJvcnQoKSB3YXMgY2FsbGVkIGF0IFBDIDB4NDAwMDg5ODcgb24gY29yZSAw 136 | AAAA 137 | bNv0Xw== 138 | -------------------------------------------------------------------------------- /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | 3 | select = 4 | # Full lists are given in order to suppress all errors from other plugins 5 | # Full list of pyflakes error codes: 6 | F401, # module imported but unused 7 | F402, # import module from line N shadowed by loop variable 8 | F403, # 'from module import *' used; unable to detect undefined names 9 | F404, # future import(s) name after other statements 10 | F405, # name may be undefined, or defined from star imports: module 11 | F406, # 'from module import *' only allowed at module level 12 | F407, # an undefined __future__ feature name was imported 13 | F601, # dictionary key name repeated with different values 14 | F602, # dictionary key variable name repeated with different values 15 | F621, # too many expressions in an assignment with star-unpacking 16 | F622, # two or more starred expressions in an assignment (a, *b, *c = d) 17 | F631, # assertion test is a tuple, which are always True 18 | F701, # a break statement outside of a while or for loop 19 | F702, # a continue statement outside of a while or for loop 20 | F703, # a continue statement in a finally block in a loop 21 | F704, # a yield or yield from statement outside of a function 22 | F705, # a return statement with arguments inside a generator 23 | F706, # a return statement outside of a function/method 24 | F707, # an except: block as not the last exception handler 25 | F721, F722, # doctest syntax error syntax error in forward type annotation 26 | F811, # redefinition of unused name from line N 27 | F812, # list comprehension redefines name from line N 28 | F821, # undefined name name 29 | F822, # undefined name name in __all__ 30 | F823, # local variable name referenced before assignment 31 | F831, # duplicate argument name in function definition 32 | F841, # local variable name is assigned to but never used 33 | F901, # raise NotImplemented should be raise NotImplementedError 34 | 35 | # Full list of pycodestyle violations: 36 | E101, # indentation contains mixed spaces and tabs 37 | E111, # indentation is not a multiple of four 38 | E112, # expected an indented block 39 | E113, # unexpected indentation 40 | E114, # indentation is not a multiple of four (comment) 41 | E115, # expected an indented block (comment) 42 | E116, # unexpected indentation (comment) 43 | E121, # continuation line under-indented for hanging indent 44 | E122, # continuation line missing indentation or outdented 45 | E123, # closing bracket does not match indentation of opening bracket's line 46 | E124, # closing bracket does not match visual indentation 47 | E125, # continuation line with same indent as next logical line 48 | E126, # continuation line over-indented for hanging indent 49 | E127, # continuation line over-indented for visual indent 50 | E128, # continuation line under-indented for visual indent 51 | E129, # visually indented line with same indent as next logical line 52 | E131, # continuation line unaligned for hanging indent 53 | E133, # closing bracket is missing indentation 54 | E201, # whitespace after '(' 55 | E202, # whitespace before ')' 56 | E203, # whitespace before ':' 57 | E211, # whitespace before '(' 58 | E221, # multiple spaces before operator 59 | E222, # multiple spaces after operator 60 | E223, # tab before operator 61 | E224, # tab after operator 62 | E225, # missing whitespace around operator 63 | E226, # missing whitespace around arithmetic operator 64 | E227, # missing whitespace around bitwise or shift operator 65 | E228, # missing whitespace around modulo operator 66 | E231, # missing whitespace after ',', ';', or ':' 67 | E241, # multiple spaces after ',' 68 | E242, # tab after ',' 69 | E251, # unexpected spaces around keyword / parameter equals 70 | E261, # at least two spaces before inline comment 71 | E262, # inline comment should start with '# ' 72 | E265, # block comment should start with '# ' 73 | E266, # too many leading '#' for block comment 74 | E271, # multiple spaces after keyword 75 | E272, # multiple spaces before keyword 76 | E273, # tab after keyword 77 | E274, # tab before keyword 78 | E275, # missing whitespace after keyword 79 | E301, # expected 1 blank line, found 0 80 | E302, # expected 2 blank lines, found 0 81 | E303, # too many blank lines 82 | E304, # blank lines found after function decorator 83 | E305, # expected 2 blank lines after end of function or class 84 | E306, # expected 1 blank line before a nested definition 85 | E401, # multiple imports on one line 86 | E402, # module level import not at top of file 87 | E501, # line too long (82 > 79 characters) 88 | E502, # the backslash is redundant between brackets 89 | E701, # multiple statements on one line (colon) 90 | E702, # multiple statements on one line (semicolon) 91 | E703, # statement ends with a semicolon 92 | E704, # multiple statements on one line (def) 93 | E711, # comparison to None should be 'if cond is None:' 94 | E712, # comparison to True should be 'if cond is True:' or 'if cond:' 95 | E713, # test for membership should be 'not in' 96 | E714, # test for object identity should be 'is not' 97 | E721, # do not compare types, use 'isinstance()' 98 | E722, # do not use bare except, specify exception instead 99 | E731, # do not assign a lambda expression, use a def 100 | E741, # do not use variables named 'l', 'O', or 'I' 101 | E742, # do not define classes named 'l', 'O', or 'I' 102 | E743, # do not define functions named 'l', 'O', or 'I' 103 | E901, # SyntaxError or IndentationError 104 | E902, # IOError 105 | W191, # indentation contains tabs 106 | W291, # trailing whitespace 107 | W292, # no newline at end of file 108 | W293, # blank line contains whitespace 109 | W391, # blank line at end of file 110 | W503, # line break before binary operator 111 | W504, # line break after binary operator 112 | W505, # doc line too long (82 > 79 characters) 113 | W601, # .has_key() is deprecated, use 'in' 114 | W602, # deprecated form of raising exception 115 | W603, # '<>' is deprecated, use '!=' 116 | W604, # backticks are deprecated, use 'repr()' 117 | W605, # invalid escape sequence 'x' 118 | W606, # 'async' and 'await' are reserved keywords starting with Python 3.7 119 | 120 | # Full list of flake8 violations 121 | E999, # failed to compile a file into an Abstract Syntax Tree for the plugins that require it 122 | 123 | # Full list of mccabe violations 124 | C901 # complexity value provided by the user 125 | 126 | ignore = 127 | E221, # multiple spaces before operator 128 | E231, # missing whitespace after ',', ';', or ':' 129 | E241, # multiple spaces after ',' 130 | W503, # line break before binary operator 131 | W504 # line break after binary operator 132 | 133 | max-line-length = 160 134 | 135 | show_source = True 136 | 137 | statistics = True 138 | -------------------------------------------------------------------------------- /tests/test_espcoredump.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD 2 | # SPDX-License-Identifier: Apache-2.0 3 | import base64 4 | import contextlib 5 | import io 6 | import os 7 | import subprocess 8 | import sys 9 | import time 10 | 11 | import pytest 12 | 13 | try: 14 | from esp_coredump import CoreDump 15 | from esp_coredump.corefile import ESPCoreDumpLoaderError 16 | from esp_coredump.corefile.elf import ESPCoreDumpElfFile 17 | from esp_coredump.corefile.loader import ESPCoreDumpFileLoader 18 | except ImportError: 19 | raise ModuleNotFoundError('No module named "esp_coredump" please install esp_coredump by running ' 20 | '"python -m pip install esp-coredump"') 21 | 22 | SUPPORTED_TARGET = ['esp32', 'esp32c3', 'esp32p4', 'esp32c6'] 23 | COREDUMP_FILE_NAME = 'coredump' 24 | COREDUMP_BIN_FILE_NAME = 'coredump_bin' 25 | 26 | TEST_DIR_ABS_PATH = os.path.dirname(__file__) 27 | ESP_PROG_DIR = os.path.join(TEST_DIR_ABS_PATH, 'test_apps', 'built_apps') 28 | 29 | 30 | @pytest.fixture(scope='session') 31 | def coverage_run(): 32 | """Run with coverage reporting if available""" 33 | try: 34 | import coverage # noqa: F401 35 | yield ['coverage', 'run', '--parallel-mode'] 36 | except ImportError: 37 | yield [sys.executable] 38 | 39 | 40 | def get_coredump_kwargs(core_ext: str, target: str, save_core: bool = False, auto_format: bool = False, bin_fmt: bool = False): 41 | core_format = 'auto' if auto_format else 'raw' if core_ext == 'bin' else core_ext 42 | coredump_filename = COREDUMP_BIN_FILE_NAME if bin_fmt else COREDUMP_FILE_NAME 43 | kwargs = { 44 | 'gdb_timeout_sec': 5, 45 | 'chip': 'auto', 46 | 'print_mem': True, 47 | 'core_format': core_format, 48 | 'core': os.path.join(TEST_DIR_ABS_PATH, target, f'{coredump_filename}.{core_ext}'), 49 | 'save_core': os.path.join(TEST_DIR_ABS_PATH, target, f'{coredump_filename}.elf') if save_core else None, 50 | 'prog': os.path.join(ESP_PROG_DIR, f'{target + ("_bin" if bin_fmt else "")}.elf'), 51 | } 52 | return kwargs 53 | 54 | 55 | def get_expected_output(target: str, bin_fmt: bool = False): 56 | expected_output_file = os.path.join(TEST_DIR_ABS_PATH, target, 'expected_output' + ('_bin' if bin_fmt else '')) 57 | with open(expected_output_file) as file: 58 | output = file.read() 59 | return output 60 | 61 | 62 | def get_output(core_ext: str, target: str, save_core: bool = False, auto_format: bool = False, bin_fmt: bool = False): 63 | kwargs = get_coredump_kwargs(core_ext=core_ext, save_core=save_core, target=target, auto_format=auto_format, bin_fmt=bin_fmt) 64 | coredump = CoreDump(**kwargs) 65 | output_file = os.path.join(TEST_DIR_ABS_PATH, target, f'output_from_{("bin_" if bin_fmt else "") + core_ext}') 66 | with io.StringIO() as buffer, contextlib.redirect_stdout(buffer): 67 | coredump.info_corefile() 68 | output = buffer.getvalue() 69 | 70 | with open(output_file, 'w') as f: 71 | f.write(output) 72 | return output 73 | 74 | 75 | def decode_from_b64_to_bin(target): 76 | b64_file_path = os.path.join(TEST_DIR_ABS_PATH, target, f'{COREDUMP_FILE_NAME}.b64') 77 | bin_file_path = os.path.join(TEST_DIR_ABS_PATH, target, f'{COREDUMP_FILE_NAME}.bin') 78 | with open(b64_file_path, 'rb') as fb64, open(bin_file_path, 'wb') as fw: 79 | for line in fb64: 80 | data = base64.standard_b64decode(line.rstrip(b'\r\n')) 81 | fw.write(data) 82 | 83 | 84 | class TestESPCoreDumpDecode: 85 | 86 | @pytest.mark.parametrize('target', SUPPORTED_TARGET) 87 | def test_coredump_decode_from_cli(self, coverage_run, target): 88 | proc = subprocess.run( 89 | coverage_run + [ 90 | '-m', 'esp_coredump', 'info_corefile', 91 | '--core', os.path.join(TEST_DIR_ABS_PATH, target, f'{COREDUMP_FILE_NAME}.b64'), 92 | '--save-core', os.path.join(TEST_DIR_ABS_PATH, target, f'{COREDUMP_FILE_NAME}.elf'), 93 | '--print-mem', 94 | os.path.join(ESP_PROG_DIR, f'{target}.elf'), 95 | ], 96 | stdout=subprocess.PIPE, 97 | stderr=subprocess.STDOUT, 98 | ) 99 | expected_output = get_expected_output(target) 100 | out = proc.stdout.decode().split('\n', 1)[1] # remove first line with version 101 | assert expected_output == out 102 | 103 | @pytest.mark.parametrize('target', ['esp32', 'esp32c3', 'esp32s3']) 104 | def test_bin_coredump_decode(self, target): 105 | """Built with CONFIG_ESP_COREDUMP_DATA_FORMAT_BIN=y (instead of default ELF)""" 106 | output = get_output(core_ext='b64', target=target, bin_fmt=True) 107 | expected_output = get_expected_output(target, bin_fmt=True) 108 | assert expected_output == output 109 | 110 | @pytest.mark.parametrize('target', SUPPORTED_TARGET) 111 | def test_coredump_decode_from_b64(self, target): 112 | output = get_output(core_ext='b64', save_core=True, target=target) 113 | expected_output = get_expected_output(target) 114 | assert expected_output == output 115 | 116 | @pytest.mark.parametrize('target', SUPPORTED_TARGET) 117 | def test_coredump_decode_from_elf(self, target): 118 | output = get_output(core_ext='elf', target=target) 119 | expected_output = get_expected_output(target) 120 | assert expected_output == output 121 | 122 | @pytest.mark.parametrize('target', SUPPORTED_TARGET) 123 | def test_coredump_decode_from_bin(self, target): 124 | decode_from_b64_to_bin(target) 125 | output = get_output(core_ext='bin', target=target) 126 | expected_output = get_expected_output(target) 127 | assert expected_output == output 128 | 129 | @pytest.mark.parametrize('format', ['bin', 'elf', 'b64']) 130 | @pytest.mark.parametrize('target', SUPPORTED_TARGET) 131 | def test_coredump_decode_auto_format(self, target, format): 132 | # make sure that .elf and .bin inputs are created 133 | get_output(core_ext='b64', save_core=True, target=target) 134 | decode_from_b64_to_bin(target) 135 | output = get_output(core_ext=format, target=target, auto_format=True) 136 | expected_output = get_expected_output(target) 137 | assert expected_output == output 138 | 139 | 140 | class TestESPCoreDumpElfFile: 141 | @pytest.mark.parametrize('target', SUPPORTED_TARGET) 142 | def test_read_elf(self, target): 143 | elf = ESPCoreDumpElfFile(os.path.join(TEST_DIR_ABS_PATH, target, f'{COREDUMP_FILE_NAME}.elf')) 144 | assert elf.load_segments is not None 145 | assert elf.note_segments is not None 146 | 147 | 148 | class TestESPCoreDumpFileLoader: 149 | @pytest.mark.parametrize('target', SUPPORTED_TARGET) 150 | def test_load_wrong_encode_core_bin(self, target): 151 | with pytest.raises(ESPCoreDumpLoaderError): 152 | ESPCoreDumpFileLoader(path=os.path.join(TEST_DIR_ABS_PATH, target, f'{COREDUMP_FILE_NAME}.b64'), is_b64=False) 153 | 154 | @pytest.mark.parametrize('target', SUPPORTED_TARGET) 155 | def test_create_corefile(self, target): 156 | loader = ESPCoreDumpFileLoader(path=os.path.join(TEST_DIR_ABS_PATH, target, f'{COREDUMP_FILE_NAME}.b64'), is_b64=True) 157 | loader.create_corefile() 158 | assert os.path.exists(loader.core_elf_file) 159 | 160 | 161 | class TestDebugCoredump: 162 | def test_dbg_corefile(self, coverage_run): 163 | target = 'esp32' 164 | proc = subprocess.Popen( 165 | coverage_run + [ 166 | '-m', 'esp_coredump', 'dbg_corefile', 167 | '--core', os.path.join(TEST_DIR_ABS_PATH, target, f'{COREDUMP_FILE_NAME}.b64'), 168 | os.path.join(ESP_PROG_DIR, f'{target}.elf'), 169 | ], 170 | stdout=subprocess.PIPE, 171 | stderr=subprocess.STDOUT, 172 | stdin=subprocess.PIPE, 173 | bufsize=0, 174 | ) 175 | time.sleep(2) # wait for gdb to start 176 | proc.stdin.write(b'\n') 177 | proc.stdin.write(b'y\n') 178 | stdout, _ = proc.communicate(b'q\n') 179 | proc.wait(timeout=3) 180 | stdout = stdout.decode() 181 | assert stdout is not None 182 | assert 'GNU gdb (esp-gdb)' in stdout 183 | assert f'Reading symbols from {os.path.join(ESP_PROG_DIR, f"{target}.elf")}' in stdout 184 | assert 'Done!' in stdout 185 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Configs and local secrets 2 | # ----------------------------------------------------------------------------- 3 | .config 4 | *.pyc 5 | # ----------------------------------------------------------------------------- 6 | 7 | 8 | # VIM files 9 | # ----------------------------------------------------------------------------- 10 | *.swp 11 | *.swo 12 | # ----------------------------------------------------------------------------- 13 | 14 | 15 | # Emacs 16 | # ----------------------------------------------------------------------------- 17 | .dir-locals.el 18 | # ----------------------------------------------------------------------------- 19 | 20 | 21 | # Emacs temp file suffixes 22 | # ----------------------------------------------------------------------------- 23 | *~ 24 | .#* 25 | \#*# 26 | # ----------------------------------------------------------------------------- 27 | 28 | 29 | # Eclipse setting 30 | # ----------------------------------------------------------------------------- 31 | .settings 32 | # ----------------------------------------------------------------------------- 33 | 34 | 35 | # VS Code Settings 36 | # ----------------------------------------------------------------------------- 37 | .vscode/ 38 | # ----------------------------------------------------------------------------- 39 | 40 | 41 | # MacOS directory files 42 | # ----------------------------------------------------------------------------- 43 | .DS_Store 44 | # ----------------------------------------------------------------------------- 45 | 46 | 47 | 48 | # Byte-compiled / optimized / DLL files 49 | # ----------------------------------------------------------------------------- 50 | __pycache__/ 51 | *.py[cod] 52 | *$py.class 53 | .idea 54 | # ----------------------------------------------------------------------------- 55 | 56 | 57 | # C extensions 58 | # ----------------------------------------------------------------------------- 59 | *.so 60 | # ----------------------------------------------------------------------------- 61 | 62 | 63 | # Distribution / packaging 64 | # ----------------------------------------------------------------------------- 65 | .Python 66 | build/ 67 | develop-eggs/ 68 | dist/ 69 | downloads/ 70 | eggs/ 71 | .eggs/ 72 | lib/ 73 | lib64/ 74 | parts/ 75 | sdist/ 76 | var/ 77 | wheels/ 78 | share/python-wheels/ 79 | *.egg-info/ 80 | .installed.cfg 81 | *.egg 82 | MANIFEST 83 | # ----------------------------------------------------------------------------- 84 | 85 | 86 | # PyInstaller 87 | # ----------------------------------------------------------------------------- 88 | # Usually these files are written by a python script from a template 89 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 90 | *.manifest 91 | *.spec 92 | # ----------------------------------------------------------------------------- 93 | 94 | 95 | # Installer logs 96 | # ----------------------------------------------------------------------------- 97 | pip-log.txt 98 | pip-delete-this-directory.txt 99 | # ----------------------------------------------------------------------------- 100 | 101 | 102 | # Unit test / coverage reports 103 | # ----------------------------------------------------------------------------- 104 | htmlcov/ 105 | .tox/ 106 | .nox/ 107 | .coverage 108 | .coverage.* 109 | .cache 110 | nosetests.xml 111 | coverage.xml 112 | *.cover 113 | *.py,cover 114 | .hypothesis/ 115 | .pytest_cache/ 116 | cover/ 117 | tests/*/*/coredump.elf 118 | tests/*/*/coredump.bin 119 | tests/*/*/output_from_* 120 | tests/*/coredump.elf 121 | tests/*/coredump.bin 122 | tests/*/output_from_* 123 | # ----------------------------------------------------------------------------- 124 | 125 | 126 | # Translations 127 | # ----------------------------------------------------------------------------- 128 | *.mo 129 | *.pot 130 | # ----------------------------------------------------------------------------- 131 | 132 | 133 | # Django stuff: 134 | # ----------------------------------------------------------------------------- 135 | *.log 136 | local_settings.py 137 | db.sqlite3 138 | db.sqlite3-journal 139 | # ----------------------------------------------------------------------------- 140 | 141 | 142 | # Flask stuff: 143 | # ----------------------------------------------------------------------------- 144 | instance/ 145 | .webassets-cache 146 | # ----------------------------------------------------------------------------- 147 | 148 | 149 | # Scrapy stuff: 150 | # ----------------------------------------------------------------------------- 151 | .scrapy 152 | # ----------------------------------------------------------------------------- 153 | 154 | 155 | # Sphinx documentation 156 | # ----------------------------------------------------------------------------- 157 | docs/_build/ 158 | # ----------------------------------------------------------------------------- 159 | 160 | 161 | # PyBuilder 162 | # ----------------------------------------------------------------------------- 163 | .pybuilder/ 164 | target/ 165 | # ----------------------------------------------------------------------------- 166 | 167 | 168 | # Jupyter Notebook 169 | # ----------------------------------------------------------------------------- 170 | .ipynb_checkpoints 171 | # ----------------------------------------------------------------------------- 172 | 173 | 174 | # IPython 175 | # ----------------------------------------------------------------------------- 176 | profile_default/ 177 | ipython_config.py 178 | # ----------------------------------------------------------------------------- 179 | 180 | 181 | # pyenv 182 | # ----------------------------------------------------------------------------- 183 | # For a library or package, you might want to ignore these files since the code is 184 | # intended to run in multiple environments; otherwise, check them in: 185 | # .python-version 186 | # ----------------------------------------------------------------------------- 187 | 188 | 189 | # pipenv 190 | # ----------------------------------------------------------------------------- 191 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 192 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 193 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 194 | # install all needed dependencies. 195 | #Pipfile.lock 196 | # ----------------------------------------------------------------------------- 197 | 198 | 199 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 200 | # ----------------------------------------------------------------------------- 201 | __pypackages__/ 202 | # ----------------------------------------------------------------------------- 203 | 204 | 205 | # Celery stuff 206 | # ----------------------------------------------------------------------------- 207 | celerybeat-schedule 208 | celerybeat.pid 209 | # ----------------------------------------------------------------------------- 210 | 211 | 212 | # SageMath parsed files 213 | # ----------------------------------------------------------------------------- 214 | *.sage.py 215 | # ----------------------------------------------------------------------------- 216 | 217 | 218 | # Environments 219 | # ----------------------------------------------------------------------------- 220 | .env 221 | .venv 222 | env/ 223 | venv/ 224 | ENV/ 225 | env.bak/ 226 | venv.bak/ 227 | # ----------------------------------------------------------------------------- 228 | 229 | 230 | # Spyder project settings 231 | # ----------------------------------------------------------------------------- 232 | .spyderproject 233 | .spyproject 234 | # ----------------------------------------------------------------------------- 235 | 236 | 237 | # Rope project settings 238 | # ----------------------------------------------------------------------------- 239 | .ropeproject 240 | # ----------------------------------------------------------------------------- 241 | 242 | 243 | # mkdocs documentation 244 | # ----------------------------------------------------------------------------- 245 | /site 246 | # ----------------------------------------------------------------------------- 247 | 248 | 249 | # mypy 250 | # ----------------------------------------------------------------------------- 251 | .mypy_cache/ 252 | .dmypy.json 253 | dmypy.json 254 | # ----------------------------------------------------------------------------- 255 | 256 | 257 | # pytype static type analyzer 258 | # ----------------------------------------------------------------------------- 259 | .pytype/ 260 | # ----------------------------------------------------------------------------- 261 | 262 | 263 | # Cython debug symbols 264 | # ----------------------------------------------------------------------------- 265 | cython_debug/ 266 | # ----------------------------------------------------------------------------- 267 | -------------------------------------------------------------------------------- /tests/esp32c3/expected_output_bin: -------------------------------------------------------------------------------- 1 | =============================================================== 2 | ==================== ESP32 CORE DUMP START ==================== 3 | 4 | Crashed task handle: 0x3fc8e3bc, name: 'main', GDB name: 'process 1070130108' 5 | Crashed task is not in the interrupt context 6 | Panic reason: abort() was called at PC 0x4200a9c1 on core 0 7 | 8 | ================== CURRENT THREAD REGISTERS =================== 9 | ra 0x40383918 0x40383918 <__ubsan_include> 10 | sp 0x3fc8e200 0x3fc8e200 11 | gp 0x3fc8b000 0x3fc8b000 12 | tp 0x3fc8e3b0 0x3fc8e3b0 13 | t0 0x37363534 926299444 14 | t1 0x7271706f 1920036975 15 | t2 0x33323130 858927408 16 | fp 0x4 0x4 17 | s1 0x3fc8e264 1070129764 18 | a0 0x3fc8e22c 1070129708 19 | a1 0x3fc8e262 1070129762 20 | a2 0x0 0 21 | a3 0x3fc8e259 1070129753 22 | a4 0x1 1 23 | a5 0x3fc8c000 1070120960 24 | a6 0x7a797877 2054781047 25 | a7 0x76757473 1987409011 26 | s2 0x0 0 27 | s3 0x3fc8e2a0 1070129824 28 | s4 0x3fc8e334 1070129972 29 | s5 0x0 0 30 | s6 0x400481b0 1074037168 31 | s7 0x3c0236b9 1006778041 32 | s8 0x0 0 33 | s9 0x3fc8e2a0 1070129824 34 | s10 0x0 0 35 | s11 0x0 0 36 | t3 0x6e6d6c6b 1852664939 37 | t4 0x6a696867 1785292903 38 | t5 0x66656463 1717920867 39 | t6 0x62613938 1650538808 40 | pc 0x40380860 0x40380860 41 | 42 | ==================== CURRENT THREAD STACK ===================== 43 | #0 panic_abort (details=details@entry=0x3fc8e22c "abort() was called at PC 0x4200a9c1 on core 0") at /builds/espressif/esp-idf/components/esp_system/panic.c:468 44 | #1 0x40383918 in esp_system_abort (details=details@entry=0x3fc8e22c "abort() was called at PC 0x4200a9c1 on core 0") at /builds/espressif/esp-idf/components/esp_system/port/esp_system_chip.c:92 45 | #2 0x40389074 in abort () at /builds/espressif/esp-idf/components/newlib/abort.c:38 46 | #3 0x4200a9c4 in fail_once (unused=) at /Users/peterdragun/Documents/esp-coredump/tests/test_apps/main/test_core_dump.c:14 47 | #4 0x400485e4 in ets_vprintf () 48 | #5 0x40048722 in ets_printf () 49 | #6 0x4200a9ea in app_main () at /Users/peterdragun/Documents/esp-coredump/tests/test_apps/main/test_core_dump.c:20 50 | #7 0x4201753a in main_task (args=) at /builds/espressif/esp-idf/components/freertos/app_startup.c:208 51 | #8 0x403842d6 in vPortTaskWrapper (pxCode=, pvParameters=) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:255 52 | 53 | ======================== THREADS INFO ========================= 54 | Id Target Id Frame 55 | * 1 process 1070130108 panic_abort (details=details@entry=0x3fc8e22c "abort() was called at PC 0x4200a9c1 on core 0") at /builds/espressif/esp-idf/components/esp_system/panic.c:468 56 | 2 process 1070131988 vPortTaskWrapper (pxCode=0x40384c92 , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:251 57 | 58 | 59 | TCB NAME PRIO C/B STACK USED/FREE 60 | ---------- ---------------- -------- ---------------- 61 | 0x3fc8e3bc main 1/1 1728/2360 62 | 0x3fc8eb14 IDLE 0/0 160/1360 63 | 64 | ==================== THREAD 1 (TCB: 0x3fc8e3bc, name: 'main') ===================== 65 | #0 panic_abort (details=details@entry=0x3fc8e22c "abort() was called at PC 0x4200a9c1 on core 0") at /builds/espressif/esp-idf/components/esp_system/panic.c:468 66 | #1 0x40383918 in esp_system_abort (details=details@entry=0x3fc8e22c "abort() was called at PC 0x4200a9c1 on core 0") at /builds/espressif/esp-idf/components/esp_system/port/esp_system_chip.c:92 67 | #2 0x40389074 in abort () at /builds/espressif/esp-idf/components/newlib/abort.c:38 68 | #3 0x4200a9c4 in fail_once (unused=) at /Users/peterdragun/Documents/esp-coredump/tests/test_apps/main/test_core_dump.c:14 69 | #4 0x400485e4 in ets_vprintf () 70 | #5 0x40048722 in ets_printf () 71 | #6 0x4200a9ea in app_main () at /Users/peterdragun/Documents/esp-coredump/tests/test_apps/main/test_core_dump.c:20 72 | #7 0x4201753a in main_task (args=) at /builds/espressif/esp-idf/components/freertos/app_startup.c:208 73 | #8 0x403842d6 in vPortTaskWrapper (pxCode=, pvParameters=) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:255 74 | 75 | ==================== THREAD 2 (TCB: 0x3fc8eb14, name: 'IDLE') ===================== 76 | #0 vPortTaskWrapper (pxCode=0x40384c92 , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:251 77 | #1 0x00000000 in ?? () 78 | Backtrace stopped: frame did not save the PC 79 | 80 | 81 | ======================= ALL MEMORY REGIONS ======================== 82 | Name Address Size Attrs 83 | .rtc.force_fast 0x50000200 0x1c RW A 84 | .rtc_noinit 0x5000021c 0x0 RW 85 | .rtc.force_slow 0x5000021c 0x0 RW 86 | .iram0.text 0x40380000 0xa67e R XA 87 | .dram0.data 0x3fc8a800 0xc68 RW A 88 | .flash.text 0x42000020 0x17d30 R XA 89 | .flash.appdesc 0x3c020020 0x100 R A 90 | .flash.rodata 0x3c020120 0x65dc RW A 91 | .eh_frame_hdr 0x3c0266fc 0x0 RW 92 | .eh_frame 0x3c0266fc 0x0 RW 93 | .flash.tdata 0x3c0266fc 0x0 RW 94 | .iram0.data 0x4038a800 0x0 RW 95 | .iram0.bss 0x4038a800 0x0 RW 96 | .dram0.heap_start 0x3fc8c650 0x0 RW 97 | .coredump.tasks.data 0x3fc8e3bc 0x150 RW 98 | .coredump.tasks.data 0x3fc8e160 0x250 RW 99 | .coredump.tasks.data 0x3fc8eb14 0x150 RW 100 | .coredump.tasks.data 0x3fc8ea60 0xa0 RW 101 | 102 | ====================== CORE DUMP MEMORY CONTENTS ======================== 103 | .coredump.tasks.data 0x3fc8e3bc 0x150 RW 104 | 0x3fc8e3bc: 0x3fc8dcf0 0x00000000 0x3fc8b628 0x3fc8b628 105 | 0x3fc8e3cc: 0x3fc8e3bc 0x3fc8b620 0x00000018 0x00000000 106 | 0x3fc8e3dc: 0x00000000 0x3fc8e3bc 0x00000000 0x00000001 107 | 0x3fc8e3ec: 0x3fc8d3b8 0x6e69616d 0x00000000 0x00000000 108 | 0x3fc8e3fc: 0x00000000 0x3fc8e3b0 0x00000001 0x00000000 109 | 0x3fc8e40c: 0x00000000 0x00000000 0x00000000 0x3fc8cf00 110 | 0x3fc8e41c: 0x3fc8cf68 0x3fc8cfd0 0x00000000 0x00000000 111 | 0x3fc8e42c: 0x00000001 0x00000000 0x00000000 0x00000000 112 | 0x3fc8e43c: 0x42004aa4 0x00000000 0x00000000 0x00000000 113 | 0x3fc8e44c: 0x00000000 0x00000000 0x00000000 0x00000000 114 | 0x3fc8e45c: 0x00000000 0x00000000 0x00000000 0x00000000 115 | 0x3fc8e46c: 0x00000000 0x00000000 0x00000000 0x00000000 116 | 0x3fc8e47c: 0x00000000 0x00000000 0x00000000 0x00000000 117 | 0x3fc8e48c: 0x00000000 0x00000000 0x00000000 0x00000000 118 | 0x3fc8e49c: 0x00000000 0x00000000 0x00000000 0x00000000 119 | 0x3fc8e4ac: 0x00000000 0x00000000 0x00000000 0x00000000 120 | 0x3fc8e4bc: 0x00000000 0x00000000 0x00000000 0x00000000 121 | 0x3fc8e4cc: 0x00000000 0x00000000 0x00000000 0x00000000 122 | 0x3fc8e4dc: 0x00000000 0x00000000 0x00000000 0x00000000 123 | 0x3fc8e4ec: 0x00000000 0x00000000 0x00000000 0x00000000 124 | 0x3fc8e4fc: 0x00000000 0x00000000 0x00000000 0x00000000 125 | .coredump.tasks.data 0x3fc8e160 0x250 RW 126 | 0x3fc8e160: 0x40380860 0x40383918 0x3fc8e200 0x3fc8b000 127 | 0x3fc8e170: 0x3fc8e3b0 0x37363534 0x7271706f 0x33323130 128 | 0x3fc8e180: 0x00000004 0x3fc8e264 0x3fc8e22c 0x3fc8e262 129 | 0x3fc8e190: 0x00000000 0x3fc8e259 0x00000001 0x3fc8c000 130 | 0x3fc8e1a0: 0x7a797877 0x76757473 0x00000000 0x3fc8e2a0 131 | 0x3fc8e1b0: 0x3fc8e334 0x00000000 0x400481b0 0x3c0236b9 132 | 0x3fc8e1c0: 0x00000000 0x3fc8e2a0 0x00000000 0x00000000 133 | 0x3fc8e1d0: 0x6e6d6c6b 0x6a696867 0x66656463 0x62613938 134 | 0x3fc8e1e0: 0x00001881 0x40380001 0x00000002 0x00000000 135 | 0x3fc8e1f0: 0x00000000 0x3fc8e264 0x3fc8e260 0x40031da4 136 | 0x3fc8e200: 0xa5a5a5a5 0xa5a5a5a5 0x3fc8e260 0x40389074 137 | 0x3fc8e210: 0xa5a5a5a5 0xa5a5a5a5 0x00000000 0x3fc8aeac 138 | 0x3fc8e220: 0x3fc8e264 0x3fc8aec8 0x3fc8e260 0x726f6261 139 | 0x3fc8e230: 0x20292874 0x20736177 0x6c6c6163 0x61206465 140 | 0x3fc8e240: 0x43502074 0x34783020 0x61303032 0x20316339 141 | 0x3fc8e250: 0x63206e6f 0x2065726f 0x00000030 0x40380000 142 | 0x3fc8e260: 0x00000030 0x30303234 0x31633961 0x40380b00 143 | 0x3fc8e270: 0x00001800 0x00000000 0x3c023000 0x4200a9c4 144 | 0x3fc8e280: 0x00000000 0x00000000 0x3c023000 0x400485e4 145 | 0x3fc8e290: 0x00000804 0x00000010 0x00000010 0x00000000 146 | 0x3fc8e2a0: 0x00000804 0x0000000c 0x00000000 0x00000001 147 | 0x3fc8e2b0: 0x3fc8eb14 0x00000010 0x00000010 0x00000000 148 | 0x3fc8e2c0: 0x3fc8e34c 0x3c022844 0x3c022818 0x00000000 149 | 0x3fc8e2d0: 0x00000000 0x00000000 0x00000000 0x00000000 150 | 0x3fc8e2e0: 0x00000000 0x00000000 0x00000000 0x00000000 151 | 0x3fc8e2f0: 0x00000000 0x00000000 0x3c023000 0x40048722 152 | 0x3fc8e300: 0x3fc8e34c 0x3c022844 0x00000003 0x42017cfe 153 | 0x3fc8e310: 0x00000000 0x00000000 0x3c023000 0x3fc8e334 154 | 0x3fc8e320: 0x3fc8ed80 0x3fc8ed80 0x3fc8e364 0x4200a9ea 155 | 0x3fc8e330: 0x00000000 0x4200a9a8 0x00000000 0x00000001 156 | 0x3fc8e340: 0x00000002 0x3fcdf000 0x60023000 0x0000000a 157 | 0x3fc8e350: 0x3c022818 0x000000a6 0xfe7fffff 0x4201753a 158 | 0x3fc8e360: 0x00000000 0x00001388 0x00000001 0x00000000 159 | 0x3fc8e370: 0x00000000 0x00000000 0x00000000 0x403842d6 160 | 0x3fc8e380: 0x00000000 0x00000000 0x00000000 0x00000000 161 | 0x3fc8e390: 0x00000000 0x00000000 0x00000000 0x00000000 162 | 0x3fc8e3a0: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 163 | .coredump.tasks.data 0x3fc8eb14 0x150 RW 164 | 0x3fc8eb14: 0x3fc8ea60 0x00000000 0x3fc8b614 0x3fc8b614 165 | 0x3fc8eb24: 0x3fc8eb14 0x3fc8b60c 0x00000019 0x00000000 166 | 0x3fc8eb34: 0x00000000 0x3fc8eb14 0x00000000 0x00000000 167 | 0x3fc8eb44: 0x3fc8e510 0x454c4449 0x00000000 0x00000000 168 | 0x3fc8eb54: 0x00000000 0x3fc8eb00 0x00000000 0x00000000 169 | 0x3fc8eb64: 0x00000000 0x00000000 0x00000000 0x3fc8cf00 170 | 0x3fc8eb74: 0x3fc8cf68 0x3fc8cfd0 0x00000000 0x00000000 171 | 0x3fc8eb84: 0x00000001 0x00000000 0x00000000 0x00000000 172 | 0x3fc8eb94: 0x42004aa4 0x00000000 0x00000000 0x00000000 173 | 0x3fc8eba4: 0x00000000 0x00000000 0x00000000 0x00000000 174 | 0x3fc8ebb4: 0x00000000 0x00000000 0x00000000 0x00000000 175 | 0x3fc8ebc4: 0x00000000 0x00000000 0x00000000 0x00000000 176 | 0x3fc8ebd4: 0x00000000 0x00000000 0x00000000 0x00000000 177 | 0x3fc8ebe4: 0x00000000 0x00000000 0x00000000 0x00000000 178 | 0x3fc8ebf4: 0x00000000 0x00000000 0x00000000 0x00000000 179 | 0x3fc8ec04: 0x00000000 0x00000000 0x00000000 0x00000000 180 | 0x3fc8ec14: 0x00000000 0x00000000 0x00000000 0x00000000 181 | 0x3fc8ec24: 0x00000000 0x00000000 0x00000000 0x00000000 182 | 0x3fc8ec34: 0x00000000 0x00000000 0x00000000 0x00000000 183 | 0x3fc8ec44: 0x00000000 0x00000000 0x00000000 0x00000000 184 | 0x3fc8ec54: 0x00000000 0x00000000 0x00000000 0x00000200 185 | .coredump.tasks.data 0x3fc8ea60 0xa0 RW 186 | 0x3fc8ea60: 0x403842ca 0x00000000 0x00000000 0x3fc8b000 187 | 0x3fc8ea70: 0x3fc8eb00 0x00000000 0x00000000 0x00000000 188 | 0x3fc8ea80: 0x00000000 0x00000000 0x40384c92 0x00000000 189 | 0x3fc8ea90: 0x00000000 0x00000000 0x00000000 0x00000000 190 | 0x3fc8eaa0: 0x00000000 0x00000000 0x00000000 0x00000000 191 | 0x3fc8eab0: 0x00000000 0x00000000 0x00000000 0x00000000 192 | 0x3fc8eac0: 0x00000000 0x00000000 0x00000000 0x00000000 193 | 0x3fc8ead0: 0x00000000 0x00000000 0x00000000 0x00000000 194 | 0x3fc8eae0: 0x00000000 0x00000000 0x00000000 0x00000000 195 | 0x3fc8eaf0: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 196 | 197 | ===================== ESP32 CORE DUMP END ===================== 198 | =============================================================== 199 | Done! 200 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /tests/esp32s3/coredump_bin.b64: -------------------------------------------------------------------------------- 1 | uCAAAAIACQAIAAAAVAEAAAAAAAA= 2 | BHPJP8BuyT/wcsk/ 3 | wG/JP0w4yT80Msk/NDLJPwRzyT8sMsk/GAAAABqK3sggqTKjBHPJPwAAAAABAAAA 4 | AGPJP21haW4A0EiDpU9oXRAy2AAAAAAA8HLJPwEAAAAAAAAAAAAAAAAAAAAAAAAA 5 | OEDJP6BAyT8IQck/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAnMwAQgAAAAAAAAAA 6 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 7 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 8 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 9 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 10 | AAAAPw== 11 | 776t3rFTN0AwDgYAAJw3gIBvyT/Lb8k/+G/JPwoAAABQFwM8IwAGAAMAAAAAAAAA 12 | AQAAAMlvyT/Jb8k/CgAAAJACAAD8HwI8AAAAAAEAAAAdAAAAAAAAAFxvBUBybwVA 13 | AAAAAAoAAACQAgAAyGU3QAj9yD8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA 14 | AAAAAAAAAAAcAABgMPHOPwAAAAABAAAAAAAAAAQAAAA18DeAoG/JP8tvyT/Jb8k/ 15 | /TY1NpEgAjwZAAAA/B8CPCiWAILAb8k/BAAAAMxvyT8KAAAA/G/JP///P7MCAAAA 16 | 5DwEgDBwyT9hAAAAAAAAADQyMDA5NjI1ADAAYWJvcnQoKSB3YXMgY2FsbGVkIGF0 17 | IFBDIDB4NDIwMDk2MjUgb24gY29yZSAwAAAAAAAAAADAJ8k/wG/JP9wnyT/Jb8k/ 18 | AAAAAAAZAzyMb8k/DAAAAIZBBIBQcMk/YQAAAOBwyT8AAAAAAQAAAP//P7P//z+z 19 | hEIEgHBwyT8AAAAAKU4CPEAaAzwAAAAAHAfKP+BwyT+OlgCC8HDJP0z3zj8oTgI8 20 | /qc3gJBwyT8cNMk/AAAAABWsN4CwcMk/HAbKP+BwyT8gcck/AHHJPwQAAAAAAAAA 21 | AAAAAMQ8BEDwlQBCIE4CPABxyT8gcck/HAfKP+BwyT95lgCCEHHJPyBOAjwEBAAA 22 | AAAAAHBwyT8EAAAAAAAAAOqEAYJAcck/AwAAAPwfAjwgcck/AHHJPwQAAAAAAAAA 23 | 6oQBghCWAEIcBso/QHHJPyBxyT8MAAAADAAAAP//P7McBso/QHHJPyBxyT8MAAAA 24 | VL83gGBxyT/8HwI8AAAAAIAgAjyQAgAA/B8CPAAAAAAAAAAAkHHJPxyEAUIAAAAA 25 | iBMAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAsHHJPwAAAAAAAAAA 26 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBxyT+lpaWl 27 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 28 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 29 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 30 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 31 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 32 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 33 | paWlpaWlpaWlpaWlpaWlpQ== 34 | YHrJP1B4yT9Qesk/ 35 | UHjJP0w4yT/Agck/IDLJP2B6yT8YMsk/GQAAAChhRZ1XPE/3YHrJPwAAAAAAAAAA 36 | XHTJP0lETEUwAOOaRhQWhX/xSQAAAAAAUHrJPwAAAAAAAAAAAAAAAAAAAAAAAAAA 37 | OEDJP6BAyT8IQck/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAnMwAQgAAAAAAAAAA 38 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 39 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 40 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 41 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 42 | AAIAPw== 43 | KGY3QEy/N0AwAAUAAAAAABB5yT8AAAAAAAAAAAAAAAAAAAAAyKo3QAAAAAAAAAAA 44 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 45 | AAAAAAAAAAAAAAAAAAAAAGgEyT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 46 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 47 | AAAAAAAAAAAgeck/paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 48 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 49 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 50 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 51 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 52 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 53 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaU= 54 | vIHJPzB/yT+wgck/ 55 | MH/JP0w4yT8gMsk/ZHrJP7yByT8YMsk/GQAAAJ81aWUL6fQzvIHJPwAAAAAAAAAA 56 | uHvJP0lETEUxAA9f0iust5nt8gABAAAAsIHJPwAAAAAAAAAAAAAAAAAAAAAAAAAA 57 | OEDJP6BAyT8IQck/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAnMwAQgAAAAAAAAAA 58 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 59 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 60 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 61 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 62 | AAIAPw== 63 | KGY3QMqAN0AwBwYAhSYAgvB/yT8AAAAAAAAAAMBOyT+gTsk/CH43QAEAAAA8NMk/ 64 | AQAAAAAAAAAAAAAAoE7JP4BOyT8BAAAAAQAAAAAAAAAgBwYApaWlpQAAAAAAAAAA 65 | AAAAAE1pN0CATsk/jsI3QMgLyT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 66 | AAAAAAAAAAAAAAAAAAAAAAAAAADIqjdAAAAAAAAAAADUqjeAEIDJPwgAAAABAAAA 67 | AAAAAAAAAAAAAAAAAAAAAFS/N4AwgMk/AAAAAAAAAAABAAAAAQAAAAwAAAD2//// 68 | AAAAAFCAyT/IqjdAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAcIDJPwAAAAAAAAAA 69 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAyT+lpaWl 70 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 71 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 72 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 73 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 74 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 75 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 76 | paWlpaWlpaWlpaWlpaWlpQ== 77 | sEnJPxBHyT+gSck/ 78 | EEfJP0w4yT9sYck/nDHJP7BJyT+UMck/AQAAACnVUgB8MH4IsEnJPwAAAAAYAAAA 79 | rETJP2lwYzAAc9kM2tCrM/ynYwAAAAAAoEnJPxgAAAAAAAAAAAAAAAAAAAAAAAAA 80 | OEDJP6BAyT8IQck/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAnMwAQgAAAAAAAAAA 81 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 82 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 83 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 84 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 85 | AQAAPw== 86 | KGY3QOBZBUAwAAYAxME3gNBHyT8jAAYAAAAAACAABgD///8B4GLJPwMAAAC9fTeA 87 | oEfJPyQ0yT8CAAAAAAAAACMABgD//z+z//8/swQAAAClpaWlpaWlpQAAAAAAAAAA 88 | AAAAAE1pN0AjAAYAjsI3QLjTyD8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA 89 | AAAAAEy/N0AwAAUAAAAAAGBIyT8AAAAAAAAAAAAAAAA9ujeA4EfJPxw0yT8BAAAA 90 | L343gABIyT8AAAAAAQAAAAAAAAAAAAAA//8/s///P7NUvzeAIEjJPwAAAAAAAAAA 91 | pA/JPwAAAAAAAID/AAAAAAAAAABASMk/CH43QAAAAAAAAAAAAAAAAAEAAAAAAAAA 92 | AAAAAGBIyT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 93 | AAAAAAAAAABwSMk/paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 94 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 95 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 96 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 97 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 98 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 99 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaU= 100 | aGHJP9BeyT9gYck/ 101 | 0F7JP0w4yT8QUMk/tEnJP2hhyT+UMck/AwAAACQhg4yUCNLYaGHJPwAAAAAWAAAA 102 | ZFHJP2VzcF90aW1lcgDllTWJMgAAAAAAYGHJPxYAAAAAAAAAAAAAAAAAAAAAAAAA 103 | OEDJP6BAyT8IQck/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAnMwAQgAAAAAAAAAA 104 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 105 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 106 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 107 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 108 | AQAAPw== 109 | KGY3QOBZBUAwAAYAxME3gJBfyT8jAAYAAAAAACAABgAgSMk/AAAAAAAAAAC9fTeA 110 | YF/JPyQ0yT8CAAAAAAAAACMABgD//z+z//8/swAAAAClpaWlpaWlpQAAAAAAAAAA 111 | AAAAAE1pN0AjAAYAjsI3QHjryD8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA 112 | AAAAAEy/N0AwAAUAAAAAACBgyT8AAAAAAAAAAAAAAAA9ujeAoF/JPxw0yT8BAAAA 113 | m2YAgsBfyT8AAAAAAQAAAAAAAAAAAAAA//8/s///P7NUvzeA4F/JPwAAAAAAAAAA 114 | pA/JPwEAAAABAAAAAAAAAAAAAAAAYMk/jGYAQgAAAAAAAAAAAAAAAAEAAAAAAAAA 115 | AAAAACBgyT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 116 | AAAAAAAAAAAwYMk/paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 117 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 118 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 119 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 120 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 121 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 122 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaU= 123 | DFDJP3BNyT8AUMk/ 124 | cE3JP0w4yT/IBMo/bGHJPwxQyT+UMck/AQAAAAOuPRwnBZ6oDFDJPwAAAAAYAAAA 125 | CEvJP2lwYzEArxROrTkLDwadLAABAAAAAFDJPxgAAAAAAAAAAAAAAAAAAAAAAAAA 126 | OEDJP6BAyT8IQck/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAnMwAQgAAAAAAAAAA 127 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 128 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 129 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 130 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 131 | AQAAPw== 132 | KGY3QOBZBUAwAAYAxME3gDBOyT8jAAYAAAAAACAABgCQ1c4/4GLJPwMAAAC9fTeA 133 | AE7JPyg0yT8CAAAABAAAACMABgD//z+z//8/swQAAAClpaWlpaWlpQAAAAAAAAAA 134 | AAAAAE1pN0AjAAYAjsI3QBjayD8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA 135 | AAAAAEy/N0AwAAUAAAAAAMBOyT8AAAAAAAAAAAAAAAA9ujeAQE7JPyA0yT8BAAAA 136 | L343gGBOyT8AAAAAAQAAAAEAAAABAAAA//8/s///P7NUvzeAgE7JPwEAAAABAAAA 137 | pA/JPwAAAAAAMAJgAgQAAAAAAACgTsk/CH43QAEAAAAAAAAAAAAAAAEAAAAAAAAA 138 | AAAAAMBOyT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 139 | AAAAAAAAAADQTsk/paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 140 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 141 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 142 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 143 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 144 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 145 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaU= 146 | xATKP+DuD2CA8Q9g 147 | 4O4PYAAAAAAgBso/EFDJP8QEyj+UMck/CgAAAAAAAAAAAAAAxATKPwAAAAAPAAAA 148 | kOEPYHJ0Y19mYXN0AAAAAAAAAAAAAAAAgPEPYA8AAAAAAAAAAAAAAAAAAAAAAAAA 149 | OEDJP6BAyT8IQck/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAnMwAQgAAAAAAAAAA 150 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 151 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 152 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 153 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 154 | AQIAAA== 155 | KGY3QOBZBUAwAAYAxME3gKDvD2AjAAYAAAAAACAABgDQcMk/8JUAQhROAjy9fTeA 156 | cO8PYCQ0yT8CAAAAAAAAACMABgD//z+z//8/swAAAAClpaWlpaWlpQAAAAAAAAAA 157 | AAAAAE1pN0AjAAYAjsI3QJh7D2AAAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA 158 | AAAAAKWlpaWlpaWlpaWlpShmN0BMvzdAMAAFAAAAAABxuzeAsO8PYBw0yT8BAAAA 159 | BJYAgtDvD2AAAAAApA/JPwAAAAACAAAA//8/s///P7NUvzeA8O8PYAAAAAAAAAAA 160 | //////DvD2D/////AAAAAAAAAAAg8A9g8JUAQgAAAACYew9gAAAAAAAAAAAAAAAA 161 | AAAAAAAAAAABAAAAAAAAAAAAAABA8A9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 162 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUPAPYKWlpaWlpaWlpaWlpaWlpaWlpaWl 163 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 164 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 165 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 166 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 167 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 168 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 169 | HAbKP6AXAzxAGgM8 170 | oBcDPAAAAACcMck/yATKPxwGyj+UMck/CgAAAAAAAAAAAAAAHAbKPwAAAAAPAAAA 171 | RAoDPGV4dF9yYW0AAAAAAAAAAAAAAAAAQBoDPA8AAAAAAAAAAAAAAAAAAAAAAAAA 172 | OEDJP6BAyT8IQck/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAnMwAQgAAAAAAAAAA 173 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 174 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 175 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 176 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 177 | AQIAAA== 178 | KGY3QOBZBUAwAAYAxME3gGAYAzwjAAYAAAAAACAABgDQcMk/8JUAQiBOAjy9fTeA 179 | MBgDPCQ0yT8CAAAAAAAAACMABgD//z+z//8/swAAAAClpaWlpaWlpQAAAAAAAAAA 180 | AAAAAE1pN0AjAAYAjsI3QFikAjwAAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA 181 | AAAAAKWlpaWlpaWlpaWlpShmN0BMvzdAMAAFAAAAAABxuzeAcBgDPBw0yT8BAAAA 182 | BJYAgpAYAzwAAAAApA/JPwAAAAACAAAA//8/s///P7NUvzeAsBgDPAAAAAAAAAAA 183 | /////7AYAzz/////AAAAAAAAAADgGAM88JUAQgAAAABYpAI8AAAAAAAAAAAAAAAA 184 | AAAAAAAAAAABAAAAAAAAAAAAAAAAGQM8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 185 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBkDPKWlpaWlpaWlpaWlpaWlpaWlpaWl 186 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 187 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 188 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 189 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 190 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 191 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 192 | i9ZtAA== -------------------------------------------------------------------------------- /esp_coredump/corefile/xtensa.py: -------------------------------------------------------------------------------- 1 | # 2 | # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | # 6 | 7 | from typing import Any, Optional, Tuple 8 | 9 | from construct import Int16ul, Int32ul, Int64ul, Struct 10 | 11 | from . import BaseArchMethodsMixin, BaseTargetMethods, ESPCoreDumpLoaderError 12 | 13 | INVALID_CAUSE_VALUE = 0xFFFF 14 | XCHAL_EXCCAUSE_NUM = 64 15 | 16 | # Exception cause dictionary to get translation of exccause register 17 | # From 4.4.1.5 table 4-64 Exception Causes of Xtensa 18 | # Instruction Set Architecture (ISA) Reference Manual 19 | 20 | XTENSA_EXCEPTION_CAUSE_DICT = { 21 | 0: ('IllegalInstructionCause', 'Illegal instruction'), 22 | 1: ('SyscallCause', 'SYSCALL instruction'), 23 | 2: ('InstructionFetchErrorCause', 24 | 'Processor internal physical address or data error during instruction fetch. (See EXCVADDR for more information)'), 25 | 3: ('LoadStoreErrorCause', 26 | 'Processor internal physical address or data error during load or store. (See EXCVADDR for more information)'), 27 | 4: ('Level1InterruptCause', 'Level-1 interrupt as indicated by set level-1 bits in the INTERRUPT register'), 28 | 5: ('AllocaCause', 'MOVSP instruction, if caller`s registers are not in the register file'), 29 | 6: ('IntegerDivideByZeroCause', 'QUOS: QUOU, REMS: or REMU divisor operand is zero'), 30 | 8: ('PrivilegedCause', 'Attempt to execute a privileged operation when CRING ? 0'), 31 | 9: ('LoadStoreAlignmentCause', 'Load or store to an unaligned address. (See EXCVADDR for more information)'), 32 | 12: ('InstrPIFDataErrorCause', 'PIF data error during instruction fetch. (See EXCVADDR for more information)'), 33 | 13: ('LoadStorePIFDataErrorCause', 34 | 'Synchronous PIF data error during LoadStore access. (See EXCVADDR for more information)'), 35 | 14: ('InstrPIFAddrErrorCause', 'PIF address error during instruction fetch. (See EXCVADDR for more information)'), 36 | 15: ('LoadStorePIFAddrErrorCause', 37 | 'Synchronous PIF address error during LoadStore access. (See EXCVADDR for more information)'), 38 | 16: ('InstTLBMissCause', 'Error during Instruction TLB refill. (See EXCVADDR for more information)'), 39 | 17: ('InstTLBMultiHitCause', 'Multiple instruction TLB entries matched. (See EXCVADDR for more information)'), 40 | 18: ('InstFetchPrivilegeCause', 41 | 'An instruction fetch referenced a virtual address at a ring level less than CRING. (See EXCVADDR for more information)'), 42 | 20: ('InstFetchProhibitedCause', 43 | 'An instruction fetch referenced a page mapped with an attribute that does not permit instruction fetch (EXCVADDR).'), 44 | 24: ('LoadStoreTLBMissCause', 'Error during TLB refill for a load or store. (See EXCVADDR for more information)'), 45 | 25: ('LoadStoreTLBMultiHitCause', 46 | 'Multiple TLB entries matched for a load or store. (See EXCVADDR for more information)'), 47 | 26: ('LoadStorePrivilegeCause', 48 | 'A load or store referenced a virtual address at a ring level less than CRING. (See EXCVADDR for more information)'), 49 | 28: ('LoadProhibitedCause', 50 | 'A load referenced a page mapped with an attribute that does not permit loads. (See EXCVADDR for more information)'), 51 | 29: ('StoreProhibitedCause', 52 | 'A store referenced a page mapped with an attribute that does not permit stores [Region Protection Option or MMU Option].'), 53 | 32: ('Coprocessor0Disabled', 'Coprocessor 0 instruction when cp0 disabled'), 54 | 33: ('Coprocessor1Disabled', 'Coprocessor 1 instruction when cp1 disabled'), 55 | 34: ('Coprocessor2Disabled', 'Coprocessor 2 instruction when cp2 disabled'), 56 | 35: ('Coprocessor3Disabled', 'Coprocessor 3 instruction when cp3 disabled'), 57 | 36: ('Coprocessor4Disabled', 'Coprocessor 4 instruction when cp4 disabled'), 58 | 37: ('Coprocessor5Disabled', 'Coprocessor 5 instruction when cp5 disabled'), 59 | 38: ('Coprocessor6Disabled', 'Coprocessor 6 instruction when cp6 disabled'), 60 | 39: ('Coprocessor7Disabled', 'Coprocessor 7 instruction when cp7 disabled'), 61 | INVALID_CAUSE_VALUE: ( 62 | 'InvalidCauseRegister', 'Invalid EXCCAUSE register value or current task is broken and was skipped'), 63 | # ESP panic pseudo reasons 64 | XCHAL_EXCCAUSE_NUM + 0: ('UnknownException', 'Unknown exception'), 65 | XCHAL_EXCCAUSE_NUM + 1: ('DebugException', 'Unhandled debug exception'), 66 | XCHAL_EXCCAUSE_NUM + 2: ('DoubleException', 'Double exception'), 67 | XCHAL_EXCCAUSE_NUM + 3: ('KernelException', 'Unhandled kernel exception'), 68 | XCHAL_EXCCAUSE_NUM + 4: ('CoprocessorException', 'Coprocessor exception'), 69 | XCHAL_EXCCAUSE_NUM + 5: ('InterruptWDTTimoutCPU0', 'Interrupt wdt timeout on CPU0'), 70 | XCHAL_EXCCAUSE_NUM + 6: ('InterruptWDTTimoutCPU1', 'Interrupt wdt timeout on CPU1'), 71 | XCHAL_EXCCAUSE_NUM + 7: ('CacheError', 'Cache disabled but cached memory region accessed'), 72 | } 73 | 74 | 75 | class ExceptionRegisters(object): 76 | # extra regs IDs used in EXTRA_INFO note 77 | EXCCAUSE_IDX = 0 78 | EXCVADDR_IDX = 1 79 | EPC1_IDX = 177 80 | EPC2_IDX = 178 81 | EPC3_IDX = 179 82 | EPC4_IDX = 180 83 | EPC5_IDX = 181 84 | EPC6_IDX = 182 85 | EPC7_IDX = 183 86 | EPS2_IDX = 194 87 | EPS3_IDX = 195 88 | EPS4_IDX = 196 89 | EPS5_IDX = 197 90 | EPS6_IDX = 198 91 | EPS7_IDX = 199 92 | 93 | @property 94 | def registers(self): # type: () -> dict[str, int] 95 | return {k: v for k, v in self.__class__.__dict__.items() 96 | if not k.startswith('__') and isinstance(v, int)} 97 | 98 | 99 | # Following structs are based on source code 100 | # IDF_PATH/components/espcoredump/src/core_dump_port.c 101 | PrStatus = Struct( 102 | 'si_signo' / Int32ul, 103 | 'si_code' / Int32ul, 104 | 'si_errno' / Int32ul, 105 | 'pr_cursig' / Int16ul, 106 | 'pr_pad0' / Int16ul, 107 | 'pr_sigpend' / Int32ul, 108 | 'pr_sighold' / Int32ul, 109 | 'pr_pid' / Int32ul, 110 | 'pr_ppid' / Int32ul, 111 | 'pr_pgrp' / Int32ul, 112 | 'pr_sid' / Int32ul, 113 | 'pr_utime' / Int64ul, 114 | 'pr_stime' / Int64ul, 115 | 'pr_cutime' / Int64ul, 116 | 'pr_cstime' / Int64ul, 117 | ) 118 | 119 | 120 | def print_exc_regs_info(extra_info): # type: (list[int]) -> None 121 | """ 122 | Print the register info by parsing extra_info 123 | :param extra_info: extra info data str 124 | :return: None 125 | """ 126 | exccause = extra_info[1 + 2 * ExceptionRegisters.EXCCAUSE_IDX + 1] 127 | exccause_str = XTENSA_EXCEPTION_CAUSE_DICT.get(exccause) 128 | if not exccause_str: 129 | exccause_str = ('Invalid EXCCAUSE code', 'Invalid EXCAUSE description or not found.') 130 | print('exccause 0x%x (%s)' % (exccause, exccause_str[0])) 131 | print('excvaddr 0x%x' % extra_info[1 + 2 * ExceptionRegisters.EXCVADDR_IDX + 1]) 132 | 133 | # skip crashed_task_tcb, exccause, and excvaddr 134 | for i in range(5, len(extra_info), 2): 135 | if (extra_info[i] >= ExceptionRegisters.EPC1_IDX and extra_info[i] <= ExceptionRegisters.EPC7_IDX): 136 | print('epc%d 0x%x' % ((extra_info[i] - ExceptionRegisters.EPC1_IDX + 1), extra_info[i + 1])) 137 | 138 | # skip crashed_task_tcb, exccause, and excvaddr 139 | for i in range(5, len(extra_info), 2): 140 | if (extra_info[i] >= ExceptionRegisters.EPS2_IDX and extra_info[i] <= ExceptionRegisters.EPS7_IDX): 141 | print('eps%d 0x%x' % ((extra_info[i] - ExceptionRegisters.EPS2_IDX + 2), extra_info[i + 1])) 142 | 143 | 144 | # from "gdb/xtensa-tdep.h" 145 | # typedef struct 146 | # { 147 | # 0 xtensa_elf_greg_t pc; 148 | # 1 xtensa_elf_greg_t ps; 149 | # 2 xtensa_elf_greg_t lbeg; 150 | # 3 xtensa_elf_greg_t lend; 151 | # 4 xtensa_elf_greg_t lcount; 152 | # 5 xtensa_elf_greg_t sar; 153 | # 6 xtensa_elf_greg_t windowstart; 154 | # 7 xtensa_elf_greg_t windowbase; 155 | # 8..63 xtensa_elf_greg_t reserved[8+48]; 156 | # 64 xtensa_elf_greg_t ar[64]; 157 | # } xtensa_elf_gregset_t; 158 | REG_PC_IDX = 0 159 | REG_PS_IDX = 1 160 | REG_LB_IDX = 2 161 | REG_LE_IDX = 3 162 | REG_LC_IDX = 4 163 | REG_SAR_IDX = 5 164 | # REG_WS_IDX = 6 165 | # REG_WB_IDX = 7 166 | REG_AR_START_IDX = 64 167 | # REG_AR_NUM = 64 168 | # FIXME: acc to xtensa_elf_gregset_t number of regs must be 128, 169 | # but gdb complains when it less then 129 170 | REG_NUM = 129 171 | 172 | # XT_SOL_EXIT = 0 173 | XT_SOL_PC = 1 174 | XT_SOL_PS = 2 175 | # XT_SOL_NEXT = 3 176 | XT_SOL_AR_START = 4 177 | XT_SOL_AR_NUM = 4 178 | # XT_SOL_FRMSZ = 8 179 | 180 | XT_STK_EXIT = 0 181 | XT_STK_PC = 1 182 | XT_STK_PS = 2 183 | XT_STK_AR_START = 3 184 | XT_STK_AR_NUM = 16 185 | XT_STK_SAR = 19 186 | XT_STK_EXCCAUSE = 20 187 | XT_STK_EXCVADDR = 21 188 | XT_STK_LBEG = 22 189 | XT_STK_LEND = 23 190 | XT_STK_LCOUNT = 24 191 | XT_STK_FRMSZ = 25 192 | 193 | 194 | class XtensaMethodsMixin(BaseArchMethodsMixin): 195 | @staticmethod 196 | def get_registers_from_stack(data, grows_down): 197 | # type: (bytes, bool) -> Tuple[list[int], Optional[dict[int, int]]] 198 | extra_regs = {v: 0 for v in ExceptionRegisters().registers.values()} 199 | regs = [0] * REG_NUM 200 | # TODO: support for growing up stacks 201 | if not grows_down: 202 | raise ESPCoreDumpLoaderError('Growing up stacks are not supported for now!') 203 | ex_struct = Struct( 204 | 'stack' / Int32ul[XT_STK_FRMSZ] 205 | ) 206 | if len(data) < ex_struct.sizeof(): 207 | raise ESPCoreDumpLoaderError('Too small stack to keep frame: %d bytes!' % len(data)) 208 | 209 | stack = ex_struct.parse(data).stack 210 | # Stack frame type indicator is always the first item 211 | rc = stack[XT_STK_EXIT] 212 | if rc != 0: 213 | regs[REG_PC_IDX] = stack[XT_STK_PC] 214 | regs[REG_PS_IDX] = stack[XT_STK_PS] 215 | for i in range(XT_STK_AR_NUM): 216 | regs[REG_AR_START_IDX + i] = stack[XT_STK_AR_START + i] 217 | regs[REG_SAR_IDX] = stack[XT_STK_SAR] 218 | regs[REG_LB_IDX] = stack[XT_STK_LBEG] 219 | regs[REG_LE_IDX] = stack[XT_STK_LEND] 220 | regs[REG_LC_IDX] = stack[XT_STK_LCOUNT] 221 | # FIXME: crashed and some running tasks (e.g. prvIdleTask) have EXCM bit set 222 | # and GDB can not unwind callstack properly (it implies not windowed call0) 223 | if regs[REG_PS_IDX] & (1 << 5): 224 | regs[REG_PS_IDX] &= ~(1 << 4) 225 | if stack[XT_STK_EXCCAUSE] in XTENSA_EXCEPTION_CAUSE_DICT: 226 | extra_regs[ExceptionRegisters.EXCCAUSE_IDX] = stack[XT_STK_EXCCAUSE] 227 | else: 228 | extra_regs[ExceptionRegisters.EXCCAUSE_IDX] = INVALID_CAUSE_VALUE 229 | extra_regs[ExceptionRegisters.EXCVADDR_IDX] = stack[XT_STK_EXCVADDR] 230 | else: 231 | regs[REG_PC_IDX] = stack[XT_SOL_PC] 232 | regs[REG_PS_IDX] = stack[XT_SOL_PS] 233 | for i in range(XT_SOL_AR_NUM): 234 | regs[REG_AR_START_IDX + i] = stack[XT_SOL_AR_START + i] 235 | # nxt = stack[XT_SOL_NEXT] 236 | return regs, extra_regs 237 | 238 | @staticmethod 239 | def build_prstatus_data(tcb_addr, task_regs): # type: (int, list[int]) -> Any 240 | return PrStatus.build({ 241 | 'si_signo': 0, 242 | 'si_code': 0, 243 | 'si_errno': 0, 244 | 'pr_cursig': 0, # TODO: set sig only for current/failed task 245 | 'pr_pad0': 0, 246 | 'pr_sigpend': 0, 247 | 'pr_sighold': 0, 248 | 'pr_pid': tcb_addr, 249 | 'pr_ppid': 0, 250 | 'pr_pgrp': 0, 251 | 'pr_sid': 0, 252 | 'pr_utime': 0, 253 | 'pr_stime': 0, 254 | 'pr_cutime': 0, 255 | 'pr_cstime': 0, 256 | }) + Int32ul[len(task_regs)].build(task_regs) 257 | 258 | 259 | class Esp32Methods(BaseTargetMethods, XtensaMethodsMixin): 260 | TARGET = 'esp32' 261 | 262 | 263 | class Esp32S2Methods(BaseTargetMethods, XtensaMethodsMixin): 264 | TARGET = 'esp32s2' 265 | 266 | 267 | class Esp32S3Methods(BaseTargetMethods, XtensaMethodsMixin): 268 | TARGET = 'esp32s3' 269 | -------------------------------------------------------------------------------- /tests/esp32/coredump.b64: -------------------------------------------------------------------------------- 1 | tCQAAAIBAAAAAAAAAAAAAAAAAAAsAQAA 2 | f0VMRgEBAQAAAAAAAAAAAAQAXgABAAAAAAAAADQAAAAAAAAAAAAAADQAIAAOACgA 3 | AAAAAA== 4 | BAAAAPQBAAAAAAAAAAAAAEAOAABADgAABgAAAAAAAAA= 5 | AQAAADQQAACg+/o/oPv6P1QBAABUAQAABgAAAAAAAAA= 6 | AQAAAIgRAAAATvs/AE77PxADAAAQAwAABgAAAAAAAAA= 7 | AQAAAJgUAAD4/Po/+Pz6P1QBAABUAQAABgAAAAAAAAA= 8 | AQAAAOwVAADwVfs/8FX7PyABAAAgAQAABgAAAAAAAAA= 9 | AQAAAAwXAABQ/vo/UP76P1QBAABUAQAABgAAAAAAAAA= 10 | AQAAAGAYAABwW/s/cFv7P6ABAACgAQAABgAAAAAAAAA= 11 | AQAAAAAaAABU8/o/VPP6P1QBAABUAQAABgAAAAAAAAA= 12 | AQAAAFQbAACA8fo/gPH6P8ABAADAAQAABgAAAAAAAAA= 13 | AQAAABQdAAAI+vo/CPr6P1QBAABUAQAABgAAAAAAAAA= 14 | AQAAAGgeAABQP/s/UD/7P7ABAACwAQAABgAAAAAAAAA= 15 | AQAAABggAACw+Po/sPj6P1QBAABUAQAABgAAAAAAAAA= 16 | AQAAAGwhAADg9vo/4Pb6P8ABAADAAQAABgAAAAAAAAA= 17 | BAAAACwjAAAAAAAAAAAAAGwBAABsAQAABgAAAAAAAAA= 18 | CAAAAEwCAAABAAAA 19 | Q09SRQAAAAA= 20 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoPv6PwAAAAAAAAAAAAAAAAAAAAAAAAAA 21 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADREIQCAIBgBJwwBAa8MAQAAAAAAQAAAA 22 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 23 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 24 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 25 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 26 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxRCIDATvs/ 27 | C0/7PzhP+z8KAAAAgAAAABkAAADY7Po/AAAAAAEAAAAJT/s/CU/7PwAAAAAjAAYA 28 | AAAAAEQOQD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 29 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 30 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 31 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 32 | AAAAAAAAAAAAAAAA 33 | CAAAAEwCAAABAAAA 34 | Q09SRQAAAAA= 35 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Pz6PwAAAAAAAAAAAAAAAAAAAAAAAAAA 36 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFkIQCAABQAAAAAAAAAAAAAAAAAAAAAA 37 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 38 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 39 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 40 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 41 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwVvs/ 42 | AAAAAAAAAAAAAAAAAAAAAIBmCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 43 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 44 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 45 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 46 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 47 | AAAAAAAAAAAAAAAA 48 | CAAAAEwCAAABAAAA 49 | Q09SRQAAAAA= 50 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUP76PwAAAAAAAAAAAAAAAAAAAAAAAAAA 51 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8j8IQCAABgAAAAAAAAAAAAAAAAAAAAAA 52 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 53 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 54 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 55 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 56 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIeDYAwXPs/ 57 | AAAAAAAAAABA+Po/IPj6P3g9CEABAAAAAAAAAAAAAAAAAAAAAAAAACD4+j/w9/o/ 58 | AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 59 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 60 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 61 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 62 | AAAAAAAAAAAAAAAA 63 | CAAAAEwCAAABAAAA 64 | Q09SRQAAAAA= 65 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVPP6PwAAAAAAAAAAAAAAAAAAAAAAAAAA 66 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AQCAABgAAAAAAAAAAAAAAAAAEAAAA 67 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 68 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 69 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 70 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 71 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADpcCIBA8vo/ 72 | AAAAACMABgAgAAYAwDr+P1D++j9UAQAA3ADwPwEAAAAcB/s//////0wCAAMjAAYA 73 | 4Ob6P83NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 74 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 75 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 76 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 77 | AAAAAAAAAAAAAAAA 78 | CAAAAEwCAAABAAAA 79 | Q09SRQAAAAA= 80 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPr6PwAAAAAAAAAAAAAAAAAAAAAAAAAA 81 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AQCAABgAAAAAAAAAAAAAAAAAAAAAA 82 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 83 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 84 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 85 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 86 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADpcCIAQQPs/ 87 | AAAAACMABgAgAAYAkPL6PwAAAAAAAAAA3ADwPwEAAAAcB/s//////5Dy+j8jAAYA 88 | AAAAAM3NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 89 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 90 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 91 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 92 | AAAAAAAAAAAAAAAA 93 | CAAAAEwCAAABAAAA 94 | Q09SRQAAAAA= 95 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsPj6PwAAAAAAAAAAAAAAAAAAAAAAAAAA 96 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8AQCAABgAAAAAAAAAAAAAAAAAEAAAA 97 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 98 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 99 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 101 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADpcCICg9/o/ 102 | AAAAACMABgAgAAYAYHz+P+Dm+j+A+/o/4ADwPwEAAAAcB/s//////0QAAAMjAAYA 103 | 4Ob6P6urAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 104 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 105 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 106 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 107 | AAAAAAAAAAAAAAAA 108 | oE/7PwAAAABYJPs/WCT7P6D7+j9QJPs/GAAAAAAAAAAAAAAAoPv6PwAAAAABAAAA 109 | FEH7P21haW4AAAAAAAAAAAAAAAAAAAAAEFH7PwEAAAAAAAAAAAAAAAAAAAAAAAAA 110 | 3Or6P0Tr+j+s6/o/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAODANQAAAAAAAAAAA 111 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 112 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 113 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 114 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 115 | AAAAAA== 116 | 776t3g0RCEAwCAYADFEIgMBO+z8LT/s/OE/7PwoAAACAAAAAGQAAANjs+j8AAAAA 117 | AQAAAAlP+z8JT/s/AAAAACMABgAAAAAARA5APxAAAAAdAAAAAAAAAEnDAEBrwwBA 118 | AAAAAAAAAAAjAAYA+CYIQHwA+z8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA 119 | AAAAAAAAAAAAAAAAAAAAAKWlpaWlpaWlpaWlpaWlpaXwpgiA4E77PwtP+z8JT/s/ 120 | IwgGAIRO+z8AAAAAAAAAALxmDYAAT/s/AAAAAORO+z8KAAAAPE/7P6YOQD8DAAAA 121 | eHwAgHBP+z9hAAAAAAAAADQwMGQ2NmI5ADAAYWJvcnQoKSB3YXMgY2FsbGVkIGF0 122 | IFBDIDB4NDAwZDY2Yjkgb24gY29yZSAwAAAAAAAAAAAAHfs/AE/7Pxwd+z8JT/s/ 123 | xE77PwAAAACgTvs/BAAAAEuBAICQT/s/YQAAAEBQ+z8AAAAApg5APxkAAAACAAAA 124 | 1GYNgLBP+z9NH0A/AAAAACBQ+z8MAAAA6Cv7PxAAAACjQA6AQFD7PwMAAABEDkA/ 125 | QFD7PyBQ+z8MAAAAzc0AACBQ+z8MAAAA6Cv7PxAAAAAgUPs/4E/7PwQAAABEDkA/ 126 | QFD7P6hmDUB8DkA/QFD7PyBQ+z8MAAAAIFD7PwwAAAAAAAAAAAAAALBP+z8AAAAA 127 | QFD7PyBQ+z8MAAAAAQAAAAQAAAAAAAAAAAAAAAwAAAAQWQiAYFD7PwAAAAAAAAAA 128 | fA5AP90AAABEDkA/YFD7PwAAAACQUPs/EEAOQAAAAACIEwAAAwAAAAAAAAAAAAAA 129 | SCb7PyMABgAAAAAARA5APwAAAACwUPs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 130 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvFD7P6WlpaWlpaWlpaWlpaWlpaWlpaWl 131 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 132 | paWlpaWlpaWlpaWlpaWlpQ== 133 | 8FX7PwAAAABU/vo/RCT7P/j8+j88JPs/GQAAAAAAAAAAAAAA+Pz6PwAAAAAAAAAA 134 | GFH7P0lETEUwAAAAAAAAAAAAAAAAAAAAEFf7PwAAAAAAAAAAAAAAAAAAAAAAAAAA 135 | 3Or6P0Tr+j+s6/o/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAODANQAAAAAAAAAAA 136 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 137 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 138 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 139 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 140 | AAIAAA== 141 | WCcIQAhZCEAwAAUAAAAAALBW+z8AAAAAAAAAAAAAAAAAAAAAgGYIQAAAAAAAAAAA 142 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA 143 | AAAAAAAAAAAAAAAAAAAAAHwG+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 144 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 145 | AAAAAAAAAAC8Vvs/paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 146 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 147 | cFv7PwAAAABEJPs//Pz6P1D++j88JPs/GQAAAAAAAAAAAAAAUP76PwAAAAAAAAAA 148 | HFf7P0lETEUxAAAAAAAAAAAAAAABAAAAEF37PwAAAAAAAAAAAAAAAAAAAAAAAAAA 149 | 3Or6P0Tr+j+s6/o/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAODANQAAAAAAAAAAA 150 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 151 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 152 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 153 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 154 | AAIAAA== 155 | WCcIQPI/CEAwAAYAQh4NgDBc+z8AAAAAAAAAAED4+j8g+Po/eD0IQAEAAAAAAAAA 156 | AAAAAAAAAAAAAAAAIPj6P/D3+j8BAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA 157 | AAAAAHYpCEDw9/o/vlwIQHwM+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 158 | AAAAAAAAAAAAAAAAAAAAAAAAAACAZghAAAAAAAAAAACJZgiAUFz7PwMAAAAjAAYA 159 | AAAAAAAAAAAAAAAAAAAAABBZCIBwXPs/AAAAAAAAAAAjAAYAAQAAAAEAAAAIAAAA 160 | AAAAAJBc+z+AZghAAAAAAEwm+z8jAAYAAQAAAAEAAAAAAAAAsFz7PwAAAAAAAAAA 161 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALxc+z+lpaWl 162 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 163 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaU= 164 | gPH6PwAAAAAM+vo/wCP7P1Tz+j+4I/s/AQAAAAAAAAAAAAAAVPP6PwAAAAAYAAAA 165 | UO/6P2lwYzAAAAAAAAAAAAAAAAAAAAAAQPP6PxgAAAAAAAAAAAAAAAAAAAAAAAAA 166 | 3Or6P0Tr+j+s6/o/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAODANQAAAAAAAAAAA 167 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 168 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 169 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 170 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 171 | AQAAAA== 172 | WCcIQPC/AEAwAAYAOlwIgEDy+j8AAAAAIwAGACAABgDAOv4/UP76P1QBAADcAPA/ 173 | AQAAABwH+z//////TAIAAyMABgDg5vo/zc0AAAQAAAD//wAAAAAAAAAAAAAAAAAA 174 | AAAAAHYpCEAjAAYAvlwIQKyi+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA 175 | AAAAAAAAAAAAAAAAAAAAAFgnCEAIWQhAMAAFAAAAAACNeQiAUPL6P3AA+z8BAAAA 176 | oz0IgHDy+j8AAAAAAAAAAEBCDwAjAAYAAAAAAAAAAAAQWQiAkPL6PwAAAAAAAAAA 177 | /////5Dy+j9wAPs/AAAAAAAAAADA8vo/eD0IQAAAAACsovo/AAAAAAAAAAAAAAAA 178 | EWAIgCMBBgABAAAAAQAAAAAAAADg8vo/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 179 | +0AOgLA7/j8BAAAA3A5APwAAAAAAAAAA7PL6P6WlpaWlpaWlpaWlpaWlpaWlpaWl 180 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 181 | paWlpaWlpaWlpaWlpaWlpQ== 182 | UD/7PwAAAAC0+Po/WPP6Pwj6+j+4I/s/AwAAAAAAAAAAAAAACPr6PwAAAAAWAAAA 183 | EDH7P2VzcF90aW1lcgAAAAAAAAAAAAAAAEH7PxYAAAAAAAAAAAAAAAAAAAAAAAAA 184 | 3Or6P0Tr+j+s6/o/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAODANQAAAAAAAAAAA 185 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 186 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 187 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 188 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 189 | AQAAAA== 190 | WCcIQPC/AEAwAAYAOlwIgBBA+z8AAAAAIwAGACAABgCQ8vo/AAAAAAAAAADcAPA/ 191 | AQAAABwH+z//////kPL6PyMABgAAAAAAzc0AAAAAAAD//wAAAAAAAAAAAAAAAAAA 192 | AAAAAHYpCEAjAAYAvlwIQGzw+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA 193 | AAAAAAAAAAAAAAAAAAAAAKBA+z8AAAAAAAAAAAAAAAB8eAiAIED7P3AA+z8BAAAA 194 | qzUNgEBA+z8AAAAAAQAAAODy+j8jAAYAAAAAAAAAAAAQWQiAYED7PwAAAAAAAAAA 195 | cAD7Pwz6+j/8Jfs/AAAAAAAAAACAQPs/nDUNQAAAAABIJvs/IwAGAAEAAAABAAAA 196 | AAAAAKBA+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 197 | AAAAAAAAAACsQPs/paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 198 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 199 | 4Pb6PwAAAADAI/s/DPr6P7D4+j+4I/s/AQAAAAAAAAAAAAAAsPj6PwAAAAAYAAAA 200 | rPT6P2lwYzEAAAAAAAAAAAAAAAABAAAAoPj6PxgAAAAAAAAAAAAAAAAAAAAAAAAA 201 | 3Or6P0Tr+j+s6/o/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAODANQAAAAAAAAAAA 202 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 203 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 204 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 205 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 206 | AQAAAA== 207 | WCcIQPC/AEAwAAYAOlwIgKD3+j8AAAAAIwAGACAABgBgfP4/4Ob6P4D7+j/gAPA/ 208 | AQAAABwH+z//////RAAAAyMABgDg5vo/q6sAAAQAAAD//wAAAAAAAAAAAAAAAAAA 209 | AAAAAHYpCEAjAAYAvlwIQAyo+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA 210 | AAAAAAAAAAAAAAAAAAAAAFgnCEAIWQhAMAAFAAAAAACNeQiAsPf6P3AA+z8BAAAA 211 | oz0IgND3+j8AAAAAAAAAAEBCDwAjAAYAAAAAAAEAAAAQWQiA8Pf6PwEAAAAAAAAA 212 | //////D3+j9wAPs/AAAAAAAAAAAg+Po/eD0IQAEAAAAMqPo/AAAAAAAAAAAAAAAA 213 | EWAIgCMJBgABAAAAAQAAAAAAAABA+Po/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 214 | OxEIgGB9/j+APgAAwHtxAQAAAAAAAAAATPj6P6WlpaWlpaWlpaWlpaWlpaWlpaWl 215 | paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl 216 | paWlpaWlpaWlpaWlpaWlpQ== 217 | FAAAAEgAAABKIAAA 218 | RVNQX0NPUkVfRFVNUF9JTkZPAAA= 219 | AgEAADFiNDNjNWU3NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 220 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 221 | EAAAAJgAAAClAgAA 222 | RVNQX0VYVFJBX0lORk8AAA== 223 | oPv6P+gAAAAdAAAA7gAAAAAAAADCAAAAAAAAAMMAAAAAAAAAxAAAAAAAAADFAAAA 224 | AAAAAMYAAAAAAAAAsQAAABNACECyAAAAAAAAALMAAAAAAAAAtAAAAAAAAAC1AAAA 225 | AAAAALYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 226 | AAAAAAAAAAA= 227 | FAAAAC0AAACnAgAA 228 | RVNQX1BBTklDX0RFVEFJTFMAAAA= 229 | YWJvcnQoKSB3YXMgY2FsbGVkIGF0IFBDIDB4NDAwZDY2Yjkgb24gY29yZSAwAAAA 230 | ifiaUg== 231 | -------------------------------------------------------------------------------- /esp_coredump/corefile/elf.py: -------------------------------------------------------------------------------- 1 | # 2 | # SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD 3 | # 4 | # SPDX-License-Identifier: Apache-2.0 5 | # 6 | 7 | import hashlib 8 | import os 9 | from typing import Optional 10 | 11 | from construct import (AlignedStruct, Bytes, Const, Container, GreedyRange, 12 | Int16ul, Int32ul, Padding, Pointer, Sequence, Struct, 13 | this) 14 | 15 | # Following structs are based on spec 16 | # https://refspecs.linuxfoundation.org/elf/elf.pdf 17 | # and source code 18 | # IDF_PATH/components/espcoredump/include_core_dump/elf.h 19 | 20 | ElfIdentification = Struct( 21 | 'EI_MAG' / Const(b'\x7fELF'), 22 | 'EI_CLASS' / Const(b'\x01'), # ELFCLASS32 23 | 'EI_DATA' / Const(b'\x01'), # ELFDATA2LSB 24 | 'EI_VERSION' / Const(b'\x01'), # EV_CURRENT 25 | Padding(9), 26 | ) 27 | 28 | ElfHeader = Struct( 29 | 'e_ident' / ElfIdentification, 30 | 'e_type' / Int16ul, 31 | 'e_machine' / Int16ul, 32 | 'e_version' / Int32ul, 33 | 'e_entry' / Int32ul, 34 | 'e_phoff' / Int32ul, 35 | 'e_shoff' / Int32ul, 36 | 'e_flags' / Int32ul, 37 | 'e_ehsize' / Int16ul, 38 | 'e_phentsize' / Int16ul, 39 | 'e_phnum' / Int16ul, 40 | 'e_shentsize' / Int16ul, 41 | 'e_shnum' / Int16ul, 42 | 'e_shstrndx' / Int16ul, 43 | ) 44 | 45 | SectionHeader = Struct( 46 | 'sh_name' / Int32ul, 47 | 'sh_type' / Int32ul, 48 | 'sh_flags' / Int32ul, 49 | 'sh_addr' / Int32ul, 50 | 'sh_offset' / Int32ul, 51 | 'sh_size' / Int32ul, 52 | 'sh_link' / Int32ul, 53 | 'sh_info' / Int32ul, 54 | 'sh_addralign' / Int32ul, 55 | 'sh_entsize' / Int32ul, 56 | ) 57 | 58 | ProgramHeader = Struct( 59 | 'p_type' / Int32ul, 60 | 'p_offset' / Int32ul, 61 | 'p_vaddr' / Int32ul, 62 | 'p_paddr' / Int32ul, 63 | 'p_filesz' / Int32ul, 64 | 'p_memsz' / Int32ul, 65 | 'p_flags' / Int32ul, 66 | 'p_align' / Int32ul, 67 | ) 68 | 69 | ElfHeaderTables = Struct( 70 | 'elf_header' / ElfHeader, 71 | 'program_headers' / Pointer(this.elf_header.e_phoff, ProgramHeader[this.elf_header.e_phnum]), 72 | 'section_headers' / Pointer(this.elf_header.e_shoff, SectionHeader[this.elf_header.e_shnum]), 73 | ) 74 | 75 | NoteSection = AlignedStruct( 76 | 4, 77 | 'namesz' / Int32ul, 78 | 'descsz' / Int32ul, 79 | 'type' / Int32ul, 80 | 'name' / Bytes(this.namesz), 81 | 'desc' / Bytes(this.descsz), 82 | ) 83 | 84 | NoteSections = GreedyRange(NoteSection) 85 | 86 | 87 | class ElfFile(object): 88 | """ 89 | Elf class to a single elf file 90 | """ 91 | 92 | SHN_UNDEF = 0x00 93 | SHT_PROGBITS = 0x01 94 | SHT_STRTAB = 0x03 95 | SHT_NOBITS = 0x08 96 | 97 | PT_LOAD = 0x01 98 | PT_NOTE = 0x04 99 | 100 | ET_CORE = 0x04 101 | 102 | EV_CURRENT = 0x01 103 | 104 | def __init__(self, elf_path=None, e_type=None, e_machine=None): 105 | # type: (Optional[str], Optional[int], Optional[int]) -> None 106 | self.e_type = e_type 107 | self.e_machine = e_machine 108 | 109 | self._struct = None # type: Optional[Struct] 110 | self._model = None # type: Optional[Container] 111 | 112 | self.sections = [] # type: list[ElfSection] 113 | self.load_segments = [] # type: list[ElfSegment] 114 | self.note_segments = [] # type: list[ElfNoteSegment] 115 | 116 | self.sha256 = b'' # type: bytes 117 | 118 | if elf_path and os.path.isfile(elf_path): 119 | self.read_elf(elf_path) 120 | 121 | def read_elf(self, elf_path): # type: (str) -> None 122 | """ 123 | Read elf file, also write to ``self.model``, ``self.program_headers``, 124 | ``self.section_headers`` 125 | :param elf_path: elf file path 126 | :return: None 127 | """ 128 | with open(elf_path, 'rb') as fr: 129 | elf_bytes = fr.read() 130 | header_tables = ElfHeaderTables.parse(elf_bytes) 131 | self.e_type = header_tables.elf_header.e_type 132 | self.e_machine = header_tables.elf_header.e_machine 133 | 134 | self._struct = self._generate_struct_from_headers(header_tables) 135 | self._model = self._struct.parse(elf_bytes) 136 | 137 | self.load_segments = [ElfSegment(seg.ph.p_vaddr, 138 | seg.data, 139 | seg.ph.p_flags) for seg in self._model.load_segments] 140 | self.note_segments = [ElfNoteSegment(seg.ph.p_vaddr, 141 | seg.data, 142 | seg.ph.p_flags) for seg in self._model.note_segments] 143 | self.sections = [ElfSection(self._parse_string_table(self._model.string_table, sec.sh.sh_name), 144 | sec.sh.sh_addr, 145 | sec.data, 146 | sec.sh.sh_flags) for sec in self._model.sections] 147 | 148 | # calculate sha256 of the input bytes (note: this may not be the same as the sha256 of any generated 149 | # output struct, as the ELF parser may change some details.) 150 | sha256 = hashlib.sha256() 151 | sha256.update(elf_bytes) 152 | self.sha256 = sha256.digest() 153 | 154 | @staticmethod 155 | def _parse_string_table(byte_str, offset): # type: (bytes, int) -> str 156 | section_name_str = byte_str[offset:] 157 | string_end = section_name_str.find(0x00) 158 | 159 | if (string_end == -1): 160 | raise ValueError('Unable to get section name from section header string table') 161 | 162 | name = section_name_str[:string_end].decode('utf-8') 163 | 164 | return name 165 | 166 | def _generate_struct_from_headers(self, header_tables): # type: (Container) -> Struct 167 | """ 168 | Generate ``construct`` Struct for this file 169 | :param header_tables: contains elf_header, program_headers, section_headers 170 | :return: Struct of the whole file 171 | """ 172 | elf_header = header_tables.elf_header 173 | program_headers = header_tables.program_headers 174 | section_headers = header_tables.section_headers 175 | assert program_headers or section_headers 176 | 177 | string_table_sh = None 178 | load_segment_subcons = [] 179 | note_segment_subcons = [] 180 | # Here we point back to make segments know their program headers 181 | for i, ph in enumerate(program_headers): 182 | args = [ 183 | 'ph' / Pointer(elf_header.e_phoff + i * ProgramHeader.sizeof(), ProgramHeader), 184 | 'data' / Pointer(ph.p_offset, Bytes(ph.p_filesz)), 185 | ] 186 | if ph.p_vaddr == 0 and ph.p_type == self.PT_NOTE: 187 | args.append('note_secs' / Pointer(ph.p_offset, NoteSections)) 188 | note_segment_subcons.append(Struct(*args)) 189 | elif ph.p_vaddr != 0: 190 | load_segment_subcons.append(Struct(*args)) 191 | 192 | section_subcons = [] 193 | for i, sh in enumerate(section_headers): 194 | if sh.sh_type == self.SHT_STRTAB and i == elf_header.e_shstrndx: 195 | string_table_sh = sh 196 | elif sh.sh_addr != 0 and sh.sh_type == self.SHT_PROGBITS: 197 | section_subcons.append(Struct( 198 | 'sh' / Pointer(elf_header.e_shoff + i * SectionHeader.sizeof(), SectionHeader), 199 | 'data' / Pointer(sh.sh_offset, Bytes(sh.sh_size)), 200 | )) 201 | 202 | args = [ 203 | 'elf_header' / ElfHeader, 204 | 'load_segments' / Sequence(*load_segment_subcons), 205 | 'note_segments' / Sequence(*note_segment_subcons), 206 | 'sections' / Sequence(*section_subcons), 207 | ] 208 | if string_table_sh is not None: 209 | args.append('string_table' / Pointer(string_table_sh.sh_offset, Bytes(string_table_sh.sh_size))) 210 | 211 | return Struct(*args) 212 | 213 | 214 | class ElfSection(object): 215 | SHF_WRITE = 0x01 216 | SHF_ALLOC = 0x02 217 | SHF_EXECINSTR = 0x04 218 | SHF_MASKPROC = 0xf0000000 219 | 220 | def __init__(self, name, addr, data, flags): # type: (str, int, bytes, int) -> None 221 | self.name = name 222 | self.addr = addr 223 | self.data = data 224 | self.flags = flags 225 | 226 | def attr_str(self): # type: () -> str 227 | if self.flags & self.SHF_MASKPROC: 228 | return 'MS' 229 | 230 | res = 'R' 231 | res += 'W' if self.flags & self.SHF_WRITE else ' ' 232 | res += 'X' if self.flags & self.SHF_EXECINSTR else ' ' 233 | res += 'A' if self.flags & self.SHF_ALLOC else ' ' 234 | return res 235 | 236 | def __repr__(self): # type: () -> str 237 | return '{:>32} [Addr] 0x{:>08X}, [Size] 0x{:>08X} {:>4}' \ 238 | .format(self.name, self.addr, len(self.data), self.attr_str()) 239 | 240 | 241 | class ElfSegment(object): 242 | PF_X = 0x01 243 | PF_W = 0x02 244 | PF_R = 0x04 245 | 246 | def __init__(self, addr, data, flags): # type: (int, bytes, int) -> None 247 | self.addr = addr 248 | self.data = data 249 | self.flags = flags 250 | self.type = ElfFile.PT_LOAD 251 | 252 | def attr_str(self): # type: () -> str 253 | res = '' 254 | res += 'R' if self.flags & self.PF_R else ' ' 255 | res += 'W' if self.flags & self.PF_W else ' ' 256 | res += 'E' if self.flags & self.PF_X else ' ' 257 | return res 258 | 259 | @staticmethod 260 | def _type_str(): # type: () -> str 261 | return 'LOAD' 262 | 263 | def __repr__(self): # type: () -> str 264 | return '{:>8} Addr 0x{:>08X}, Size 0x{:>08X} Flags {:4}' \ 265 | .format(self._type_str(), self.addr, len(self.data), self.attr_str()) 266 | 267 | 268 | class ElfNoteSegment(ElfSegment): 269 | def __init__(self, addr, data, flags): # type: (int, bytes, int) -> None 270 | super(ElfNoteSegment, self).__init__(addr, data, flags) 271 | self.type = ElfFile.PT_NOTE 272 | self.note_secs = NoteSections.parse(self.data) 273 | for note in self.note_secs: 274 | # note.name should include a terminating NUL byte, plus possible 275 | # padding 276 | # 277 | # (note: construct.PaddingString can't parse this if there 278 | # are non-zero padding bytes after the NUL, it also parses those.) 279 | note.name = note.name.split(b'\x00')[0] 280 | 281 | @staticmethod 282 | def _type_str(): # type: () -> str 283 | return 'NOTE' 284 | 285 | 286 | TASK_STATUS_CORRECT = 0x00 287 | TASK_STATUS_TCB_CORRUPTED = 0x01 288 | TASK_STATUS_STACK_CORRUPTED = 0x02 289 | 290 | EspTaskStatus = Struct( 291 | 'task_index' / Int32ul, 292 | 'task_flags' / Int32ul, 293 | 'task_tcb_addr' / Int32ul, 294 | 'task_stack_start' / Int32ul, 295 | 'task_stack_len' / Int32ul, 296 | 'task_name' / Bytes(16), 297 | ) 298 | 299 | 300 | class ESPCoreDumpElfFile(ElfFile): 301 | PT_ESP_INFO = 8266 302 | PT_ESP_PANIC_DETAILS = 679 303 | PT_ESP_TASK_INFO = 678 304 | PT_ESP_EXTRA_INFO = 677 305 | 306 | CURR_TASK_MARKER = 0xdeadbeef 307 | 308 | # ELF file machine type 309 | EM_XTENSA = 0x5E 310 | EM_RISCV = 0xF3 311 | 312 | def __init__(self, elf_path=None, e_type=None, e_machine=None): 313 | # type: (Optional[str], Optional[int], Optional[int]) -> None 314 | _e_type = e_type or self.ET_CORE 315 | _e_machine = e_machine or self.EM_XTENSA 316 | super(ESPCoreDumpElfFile, self).__init__(elf_path, _e_type, _e_machine) 317 | 318 | def add_segment(self, addr, data, seg_type, flags): # type: (int, bytes, int, int) -> None 319 | if seg_type != self.PT_NOTE: 320 | self.load_segments.append(ElfSegment(addr, data, flags)) 321 | else: 322 | self.note_segments.append(ElfNoteSegment(addr, data, flags)) 323 | 324 | def dump(self, output_path): # type: (str) -> None 325 | """ 326 | Dump self.model into file 327 | :param output_path: output file path 328 | :return: None 329 | """ 330 | res = b'' 331 | res += ElfHeader.build({ 332 | 'e_type': self.e_type, 333 | 'e_machine': self.e_machine, 334 | 'e_version': self.EV_CURRENT, 335 | 'e_entry': 0, 336 | 'e_phoff': ElfHeader.sizeof(), 337 | 'e_shoff': 0, 338 | 'e_flags': 0, 339 | 'e_ehsize': ElfHeader.sizeof(), 340 | 'e_phentsize': ProgramHeader.sizeof(), 341 | 'e_phnum': len(self.load_segments) + len(self.note_segments), 342 | 'e_shentsize': 0, 343 | 'e_shnum': 0, 344 | 'e_shstrndx': self.SHN_UNDEF, 345 | }) 346 | 347 | offset = ElfHeader.sizeof() + (len(self.load_segments) + len(self.note_segments)) * ProgramHeader.sizeof() 348 | _segments = self.load_segments + self.note_segments # type: ignore 349 | for seg in _segments: 350 | res += ProgramHeader.build({ 351 | 'p_type': seg.type, 352 | 'p_offset': offset, 353 | 'p_vaddr': seg.addr, 354 | 'p_paddr': seg.addr, 355 | 'p_filesz': len(seg.data), 356 | 'p_memsz': len(seg.data), 357 | 'p_flags': seg.flags, 358 | 'p_align': 0, 359 | }) 360 | offset += len(seg.data) 361 | 362 | for seg in _segments: 363 | res += seg.data 364 | 365 | with open(output_path, 'wb') as fw: 366 | fw.write(res) 367 | -------------------------------------------------------------------------------- /tests/esp32c6/expected_output: -------------------------------------------------------------------------------- 1 | =============================================================== 2 | ==================== ESP32 CORE DUMP START ==================== 3 | The ROM ELF file won't load automatically since it was not found for the provided chip type. 4 | 5 | Crashed task handle: 0x4080fe20, name: 'main', GDB name: 'process 1082195488' 6 | Crashed task is not in the interrupt context 7 | Panic reason: abort() was called at PC 0x4200c3d5 on core 0 8 | 9 | ================== CURRENT THREAD REGISTERS =================== 10 | ra 0x40804754 0x40804754 11 | sp 0x4080fc50 0x4080fc50 12 | gp 0x4080b104 0x4080b104 13 | tp 0x4080fe10 0x4080fe10 14 | t0 0x37363534 926299444 15 | t1 0x7271706f 1920036975 16 | t2 0x33323130 858927408 17 | fp 0x4 0x4 18 | s1 0x4080fcb4 1082195124 19 | a0 0x4080fc7c 1082195068 20 | a1 0x4080fcb2 1082195122 21 | a2 0x0 0 22 | a3 0x4080fca9 1082195113 23 | a4 0x1 1 24 | a5 0x4080d000 1082183680 25 | a6 0x0 0 26 | a7 0x76757473 1987409011 27 | s2 0x0 0 28 | s3 0x4080fd00 1082195200 29 | s4 0x4080fd94 1082195348 30 | s5 0x0 0 31 | s6 0x0 0 32 | s7 0x40018e9e 1073843870 33 | s8 0x4080fd00 1082195200 34 | s9 0x0 0 35 | s10 0x42019d25 1107402021 36 | s11 0x0 0 37 | t3 0x6e6d6c6b 1852664939 38 | t4 0x6a696867 1785292903 39 | t5 0x66656463 1717920867 40 | t6 0x62613938 1650538808 41 | pc 0x40804796 0x40804796 42 | 43 | ==================== CURRENT THREAD STACK ===================== 44 | #0 panic_abort (details=details@entry=0x4080fc7c "abort() was called at PC 0x4200c3d5 on core 0") at /builds/espressif/esp-idf/components/esp_system/panic.c:483 45 | #1 0x40804754 in esp_system_abort (details=details@entry=0x4080fc7c "abort() was called at PC 0x4200c3d5 on core 0") at /builds/espressif/esp-idf/components/esp_system/port/esp_system_chip.c:87 46 | #2 0x40808c84 in abort () at /builds/espressif/esp-idf/components/newlib/src/abort.c:38 47 | #3 0x4200c3d8 in fail_once (unused=) at /Users/erhan/dev/esp-coredump/tests/test_apps/main/test_core_dump.c:14 48 | #4 0x40018ebe in ?? () 49 | 50 | ======================== THREADS INFO ========================= 51 | Id Target Id Frame 52 | * 1 process 1082195488 panic_abort (details=details@entry=0x4080fc7c "abort() was called at PC 0x4200c3d5 on core 0") at /builds/espressif/esp-idf/components/esp_system/panic.c:483 53 | 2 process 1082197368 vPortTaskWrapper (pxCode=0x40805e78 , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:248 54 | 3 process 1082190408 vPortClearInterruptMaskFromISR (prev_int_level=1) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:511 55 | 56 | 57 | TCB NAME PRIO C/B STACK USED/FREE 58 | ---------- ---------------- -------- ---------------- 59 | 0x4080fe20 main 1/1 160/3924 60 | 0x40810578 IDLE 0/0 160/1372 61 | 0x4080ea48 esp_timer 22/22 224/3868 62 | 63 | ==================== THREAD 1 (TCB: 0x4080fe20, name: 'main') ===================== 64 | #0 panic_abort (details=details@entry=0x4080fc7c "abort() was called at PC 0x4200c3d5 on core 0") at /builds/espressif/esp-idf/components/esp_system/panic.c:483 65 | #1 0x40804754 in esp_system_abort (details=details@entry=0x4080fc7c "abort() was called at PC 0x4200c3d5 on core 0") at /builds/espressif/esp-idf/components/esp_system/port/esp_system_chip.c:87 66 | #2 0x40808c84 in abort () at /builds/espressif/esp-idf/components/newlib/src/abort.c:38 67 | #3 0x4200c3d8 in fail_once (unused=) at /Users/erhan/dev/esp-coredump/tests/test_apps/main/test_core_dump.c:14 68 | #4 0x40018ebe in ?? () 69 | 70 | ==================== THREAD 2 (TCB: 0x40810578, name: 'IDLE') ===================== 71 | #0 vPortTaskWrapper (pxCode=0x40805e78 , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:248 72 | #1 0x00000000 in ?? () 73 | Backtrace stopped: frame did not save the PC 74 | 75 | ==================== THREAD 3 (TCB: 0x4080ea48, name: 'esp_timer') ===================== 76 | #0 vPortClearInterruptMaskFromISR (prev_int_level=1) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:511 77 | #1 0x408056f4 in vPortExitCritical () at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:621 78 | #2 0x40806c02 in ulTaskGenericNotifyTake (uxIndexToWait=uxIndexToWait@entry=0, xClearCountOnExit=xClearCountOnExit@entry=1, xTicksToWait=xTicksToWait@entry=4294967295) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/tasks.c:5768 79 | #3 0x4200f76a in timer_task (arg=) at /builds/espressif/esp-idf/components/esp_timer/src/esp_timer.c:459 80 | #4 0x408054be in vPortTaskWrapper (pxCode=, pvParameters=) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:252 81 | 82 | 83 | ======================= ALL MEMORY REGIONS ======================== 84 | Name Address Size Attrs 85 | .rtc.text 0x50000000 0x0 RW 86 | .rtc.force_fast 0x50000000 0x0 RW 87 | .rtc_noinit 0x50000000 0x0 RW 88 | .rtc.force_slow 0x50000000 0x0 RW 89 | .iram0.text 0x40800000 0xa8fe R XA 90 | .iram0.bss 0x4080a900 0x0 RW 91 | .dram0.data 0x4080a900 0x12c0 RW A 92 | .flash.text 0x42000020 0x12bd6 R XA 93 | .flash.appdesc 0x42018020 0x100 R A 94 | .flash.rodata 0x42018120 0x3dac RW A 95 | .flash.tdata 0x4201becc 0x0 RW 96 | .dram0.heap_start 0x4080ce40 0x0 RW 97 | .coredump.tasks.data 0x4080fe20 0x150 RW 98 | .coredump.tasks.data 0x4080fbb0 0x260 RW 99 | .coredump.tasks.data 0x40810578 0x150 RW 100 | .coredump.tasks.data 0x408104d0 0xa0 RW 101 | .coredump.tasks.data 0x4080ea48 0x150 RW 102 | .coredump.tasks.data 0x4080e960 0xe0 RW 103 | 104 | ====================== CORE DUMP MEMORY CONTENTS ======================== 105 | .coredump.tasks.data 0x4080fe20 0x150 RW 106 | 0x4080fe20: 0x4080fd70 0x00000000 0x4080bdec 0x4080bdec 107 | 0x4080fe30: 0x4080fe20 0x4080bde4 0x00000018 0x00000000 108 | 0x4080fe40: 0x00000000 0x4080fe20 0x00000000 0x00000001 109 | 0x4080fe50: 0x4080ee1c 0x6e69616d 0x00000000 0x00000000 110 | 0x4080fe60: 0x00000000 0x4080fe10 0x00000001 0x00000000 111 | 0x4080fe70: 0x00000000 0x00000000 0x00000000 0x4080d788 112 | 0x4080fe80: 0x4080d7f0 0x4080d858 0x00000000 0x00000000 113 | 0x4080fe90: 0x00000001 0x00000000 0x00000000 0x00000000 114 | 0x4080fea0: 0x42006868 0x00000000 0x00000000 0x00000000 115 | 0x4080feb0: 0x00000000 0x00000000 0x00000000 0x00000000 116 | 0x4080fec0: 0x00000000 0x00000000 0x00000000 0x00000000 117 | 0x4080fed0: 0x00000000 0x00000000 0x00000000 0x00000000 118 | 0x4080fee0: 0x00000000 0x00000000 0x00000000 0x00000000 119 | 0x4080fef0: 0x00000000 0x00000000 0x00000000 0x00000000 120 | 0x4080ff00: 0x00000000 0x00000000 0x00000000 0x00000000 121 | 0x4080ff10: 0x00000000 0x00000000 0x00000000 0x00000000 122 | 0x4080ff20: 0x00000000 0x00000000 0x00000000 0x00000000 123 | 0x4080ff30: 0x00000000 0x00000000 0x00000000 0x00000000 124 | 0x4080ff40: 0x00000000 0x00000000 0x00000000 0x00000000 125 | 0x4080ff50: 0x00000000 0x00000000 0x00000000 0x00000000 126 | 0x4080ff60: 0x00000000 0x00000000 0x00000000 0x00000000 127 | .coredump.tasks.data 0x4080fbb0 0x260 RW 128 | 0x4080fbb0: 0x40804796 0x40804754 0x4080fc50 0x4080b104 129 | 0x4080fbc0: 0x4080fe10 0x37363534 0x7271706f 0x33323130 130 | 0x4080fbd0: 0x00000004 0x4080fcb4 0x4080fc7c 0x4080fcb2 131 | 0x4080fbe0: 0x00000000 0x4080fca9 0x00000001 0x4080d000 132 | 0x4080fbf0: 0x00000000 0x76757473 0x00000000 0x4080fd00 133 | 0x4080fc00: 0x4080fd94 0x00000000 0x00000000 0x40018e9e 134 | 0x4080fc10: 0x4080fd00 0x00000000 0x42019d25 0x00000000 135 | 0x4080fc20: 0x6e6d6c6b 0x6a696867 0x66656463 0x62613938 136 | 0x4080fc30: 0x00001881 0x40800001 0x00000002 0x00000000 137 | 0x4080fc40: 0x00000000 0x4080fcb4 0x4080fcb0 0x40030a96 138 | 0x4080fc50: 0xa5a5a5a5 0xa5a5a5a5 0x4080fcb0 0x40808c84 139 | 0x4080fc60: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0x4080b694 140 | 0x4080fc70: 0x4080fcb4 0x4080b6b0 0x4080fcb0 0x726f6261 141 | 0x4080fc80: 0x20292874 0x20736177 0x6c6c6163 0x61206465 142 | 0x4080fc90: 0x43502074 0x34783020 0x63303032 0x20356433 143 | 0x4080fca0: 0x63206e6f 0x2065726f 0x00000030 0x40020000 144 | 0x4080fcb0: 0x40870030 0x30303234 0x35643363 0x40022500 145 | 0x4080fcc0: 0x00000000 0x00000000 0x00000061 0x4200c3d8 146 | 0x4080fcd0: 0x00000000 0x00000000 0x00000061 0x40018ebe 147 | 0x4080fce0: 0x00000000 0x00000000 0x42019000 0x4001925e 148 | 0x4080fcf0: 0xa5a5a5a5 0x00001800 0x00000010 0x00000001 149 | 0x4080fd00: 0x00000000 0x00000010 0x00000010 0x00000000 150 | 0x4080fd10: 0x00000000 0x00000000 0x42018d8c 0x40808b80 151 | 0x4080fd20: 0x40810578 0x00000000 0x42018d8c 0x00000000 152 | 0x4080fd30: 0x00000000 0x00000000 0x00000000 0x00000000 153 | 0x4080fd40: 0x00000000 0x00000000 0x00000000 0x00000000 154 | 0x4080fd50: 0x00000000 0x00000000 0x42019000 0x400193a6 155 | 0x4080fd60: 0x00000000 0x00000000 0x42019000 0x40808ad8 156 | 0x4080fd70: 0x00000000 0x00000000 0x00000001 0x4080fd94 157 | 0x4080fd80: 0x00000000 0x00000010 0x4080fdc4 0x4200c3fe 158 | 0x4080fd90: 0x00000000 0x4200c3bc 0x00000000 0x00000001 159 | 0x4080fda0: 0x00000002 0x40880000 0x00000001 0x0000000a 160 | 0x4080fdb0: 0x42018d8c 0x000000cb 0xfe7fffff 0x420128e6 161 | 0x4080fdc0: 0x00000000 0x00001388 0x00000001 0x00000000 162 | 0x4080fdd0: 0x00000000 0x00000000 0x00000000 0x408054be 163 | 0x4080fde0: 0x00000000 0x00000000 0x00000000 0x00000000 164 | 0x4080fdf0: 0x00000000 0x00000000 0x00000000 0x00000000 165 | 0x4080fe00: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 166 | .coredump.tasks.data 0x40810578 0x150 RW 167 | 0x40810578: 0x408104d0 0x00000000 0x4080bdd8 0x4080bdd8 168 | 0x40810588: 0x40810578 0x4080bdd0 0x00000019 0x00000000 169 | 0x40810598: 0x00000000 0x40810578 0x00000000 0x00000000 170 | 0x408105a8: 0x4080ff74 0x454c4449 0x00000000 0x00000000 171 | 0x408105b8: 0x00000000 0x40810570 0x00000000 0x00000000 172 | 0x408105c8: 0x00000000 0x00000000 0x00000000 0x4080d788 173 | 0x408105d8: 0x4080d7f0 0x4080d858 0x00000000 0x00000000 174 | 0x408105e8: 0x00000001 0x00000000 0x00000000 0x00000000 175 | 0x408105f8: 0x42006868 0x00000000 0x00000000 0x00000000 176 | 0x40810608: 0x00000000 0x00000000 0x00000000 0x00000000 177 | 0x40810618: 0x00000000 0x00000000 0x00000000 0x00000000 178 | 0x40810628: 0x00000000 0x00000000 0x00000000 0x00000000 179 | 0x40810638: 0x00000000 0x00000000 0x00000000 0x00000000 180 | 0x40810648: 0x00000000 0x00000000 0x00000000 0x00000000 181 | 0x40810658: 0x00000000 0x00000000 0x00000000 0x00000000 182 | 0x40810668: 0x00000000 0x00000000 0x00000000 0x00000000 183 | 0x40810678: 0x00000000 0x00000000 0x00000000 0x00000000 184 | 0x40810688: 0x00000000 0x00000000 0x00000000 0x00000000 185 | 0x40810698: 0x00000000 0x00000000 0x00000000 0x00000000 186 | 0x408106a8: 0x00000000 0x00000000 0x00000000 0x00000000 187 | 0x408106b8: 0x00000000 0x00000000 0x00000000 0x00000200 188 | .coredump.tasks.data 0x408104d0 0xa0 RW 189 | 0x408104d0: 0x408054b2 0x00000000 0x00000000 0x4080b104 190 | 0x408104e0: 0x40810570 0x00000000 0x00000000 0x00000000 191 | 0x408104f0: 0x00000000 0x00000000 0x40805e78 0x00000000 192 | 0x40810500: 0x00000000 0x00000000 0x00000000 0x00000000 193 | 0x40810510: 0x00000000 0x00000000 0x00000000 0x00000000 194 | 0x40810520: 0x00000000 0x00000000 0x00000000 0x00000000 195 | 0x40810530: 0x00000000 0x00000000 0x00000000 0x00000000 196 | 0x40810540: 0x00000000 0x00000000 0x00000000 0x00000000 197 | 0x40810550: 0x00000000 0x00000000 0x00000000 0x00000000 198 | 0x40810560: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 199 | .coredump.tasks.data 0x4080ea48 0x150 RW 200 | 0x4080ea48: 0x4080e960 0x00000000 0x4080bd74 0x4080bd74 201 | 0x4080ea58: 0x4080ea48 0x4080bd6c 0x00000003 0x00000000 202 | 0x4080ea68: 0x00000000 0x4080ea48 0x00000000 0x00000016 203 | 0x4080ea78: 0x4080da44 0x5f707365 0x656d6974 0x00000072 204 | 0x4080ea88: 0x00000000 0x4080ea40 0x00000016 0x00000000 205 | 0x4080ea98: 0x00000000 0x00000000 0x00000000 0x4080d788 206 | 0x4080eaa8: 0x4080d7f0 0x4080d858 0x00000000 0x00000000 207 | 0x4080eab8: 0x00000001 0x00000000 0x00000000 0x00000000 208 | 0x4080eac8: 0x4002849c 0x00000000 0x00000000 0x00000000 209 | 0x4080ead8: 0x00000000 0x00000000 0x00000000 0x00000000 210 | 0x4080eae8: 0x00000000 0x00000000 0x00000000 0x00000000 211 | 0x4080eaf8: 0x00000000 0x00000000 0x00000000 0x00000000 212 | 0x4080eb08: 0x00000000 0x00000000 0x00000000 0x00000000 213 | 0x4080eb18: 0x00000000 0x00000000 0x00000000 0x00000000 214 | 0x4080eb28: 0x00000000 0x00000000 0x00000000 0x00000000 215 | 0x4080eb38: 0x00000000 0x00000000 0x00000000 0x00000000 216 | 0x4080eb48: 0x00000000 0x00000000 0x00000000 0x00000000 217 | 0x4080eb58: 0x00000000 0x00000000 0x00000000 0x00000000 218 | 0x4080eb68: 0x00000000 0x00000000 0x00000000 0x00000000 219 | 0x4080eb78: 0x00000000 0x00000000 0x00000000 0x00000000 220 | 0x4080eb88: 0x00000000 0x00000000 0x00000000 0x00000001 221 | .coredump.tasks.data 0x4080e960 0xe0 RW 222 | 0x4080e960: 0x40805676 0x408056f4 0x4080e9e0 0x4080b104 223 | 0x4080e970: 0x4080ea40 0x00000000 0x00000000 0x00000000 224 | 0x4080e980: 0x00000000 0xffffffff 0x00000001 0x00000001 225 | 0x4080e990: 0x4080ea4c 0x00000004 0x00000000 0x20001000 226 | 0x4080e9a0: 0x00000000 0x00000000 0x00000001 0x00000000 227 | 0x4080e9b0: 0x00000000 0x00000000 0x00000000 0x00000000 228 | 0x4080e9c0: 0x00000000 0x00000000 0x00000000 0x00000000 229 | 0x4080e9d0: 0x00000000 0x00000000 0x00000000 0x00000000 230 | 0x4080e9e0: 0x00000001 0xffffffff 0x00000000 0x40806c02 231 | 0x4080e9f0: 0x00000000 0x00000000 0x00000000 0x4200f76a 232 | 0x4080ea00: 0x00000000 0x00000000 0x00000000 0x408054be 233 | 0x4080ea10: 0x00000000 0x00000000 0x00000000 0x00000000 234 | 0x4080ea20: 0x00000000 0x00000000 0x00000000 0x00000000 235 | 0x4080ea30: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 236 | 237 | ===================== ESP32 CORE DUMP END ===================== 238 | =============================================================== 239 | Done! 240 | -------------------------------------------------------------------------------- /tests/esp32c3/expected_output: -------------------------------------------------------------------------------- 1 | =============================================================== 2 | ==================== ESP32 CORE DUMP START ==================== 3 | 4 | Crashed task handle: 0x3fc8ec30, name: 'main', GDB name: 'process 1070132272' 5 | Crashed task is not in the interrupt context 6 | Panic reason: abort() was called at PC 0x42009351 on core 0 7 | 8 | ================== CURRENT THREAD REGISTERS =================== 9 | ra 0x4038368e 0x4038368e <__ubsan_include> 10 | sp 0x3fc8ea70 0x3fc8ea70 11 | gp 0x3fc8a600 0x3fc8a600 12 | tp 0x3fc87ee0 0x3fc87ee0 13 | t0 0x37363534 926299444 14 | t1 0x7271706f 1920036975 15 | t2 0x33323130 858927408 16 | fp 0x4 0x4 17 | s1 0x3fc8ead4 1070131924 18 | a0 0x3fc8ea9c 1070131868 19 | a1 0x3fc8ead2 1070131922 20 | a2 0x0 0 21 | a3 0x3fc8eac9 1070131913 22 | a4 0x1 1 23 | a5 0x3fc8c000 1070120960 24 | a6 0x7a797877 2054781047 25 | a7 0x76757473 1987409011 26 | s2 0x0 0 27 | s3 0x3fc8eb10 1070131984 28 | s4 0x3fc8eba4 1070132132 29 | s5 0x0 0 30 | s6 0x400481b0 1074037168 31 | s7 0x3c023849 1006778441 32 | s8 0x0 0 33 | s9 0x3fc8eb10 1070131984 34 | s10 0x0 0 35 | s11 0x0 0 36 | t3 0x6e6d6c6b 1852664939 37 | t4 0x6a696867 1785292903 38 | t5 0x66656463 1717920867 39 | t6 0x62613938 1650538808 40 | pc 0x40380698 0x40380698 41 | 42 | ==================== CURRENT THREAD STACK ===================== 43 | #0 panic_abort (details=details@entry=0x3fc8ea9c "abort() was called at PC 0x42009351 on core 0") at /builds/espressif/esp-idf/components/esp_system/panic.c:472 44 | #1 0x4038368e in esp_system_abort (details=details@entry=0x3fc8ea9c "abort() was called at PC 0x42009351 on core 0") at /builds/espressif/esp-idf/components/esp_system/port/esp_system_chip.c:93 45 | #2 0x403887b8 in abort () at /builds/espressif/esp-idf/components/newlib/abort.c:38 46 | #3 0x42009354 in fail_once (unused=) at /Users/erhan/dev/esp-coredump/tests/test_apps/main/test_core_dump.c:14 47 | #4 0x400485e4 in ets_vprintf () 48 | #5 0x40048722 in ets_printf () 49 | #6 0x4200937a in app_main () at /Users/erhan/dev/esp-coredump/tests/test_apps/main/test_core_dump.c:20 50 | #7 0x420176ba in main_task (args=) at /builds/espressif/esp-idf/components/freertos/app_startup.c:208 51 | #8 0x40384088 in vPortTaskWrapper (pxCode=, pvParameters=) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:255 52 | 53 | ======================== THREADS INFO ========================= 54 | Id Target Id Frame 55 | * 1 process 1070132272 panic_abort (details=details@entry=0x3fc8ea9c "abort() was called at PC 0x42009351 on core 0") at /builds/espressif/esp-idf/components/esp_system/panic.c:472 56 | 2 process 1070134156 vPortTaskWrapper (pxCode=0x403849a6 , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:251 57 | 3 process 1070127764 0x4038424e in vPortClearInterruptMaskFromISR (prev_int_level=1) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:516 58 | 59 | 60 | TCB NAME PRIO C/B STACK USED/FREE 61 | ---------- ---------------- -------- ---------------- 62 | 0x3fc8ec30 main 1/1 160/3924 63 | 0x3fc8f38c IDLE 0/0 160/1368 64 | 0x3fc8da94 esp_timer 22/22 224/3856 65 | 66 | ==================== THREAD 1 (TCB: 0x3fc8ec30, name: 'main') ===================== 67 | #0 panic_abort (details=details@entry=0x3fc8ea9c "abort() was called at PC 0x42009351 on core 0") at /builds/espressif/esp-idf/components/esp_system/panic.c:472 68 | #1 0x4038368e in esp_system_abort (details=details@entry=0x3fc8ea9c "abort() was called at PC 0x42009351 on core 0") at /builds/espressif/esp-idf/components/esp_system/port/esp_system_chip.c:93 69 | #2 0x403887b8 in abort () at /builds/espressif/esp-idf/components/newlib/abort.c:38 70 | #3 0x42009354 in fail_once (unused=) at /Users/erhan/dev/esp-coredump/tests/test_apps/main/test_core_dump.c:14 71 | #4 0x400485e4 in ets_vprintf () 72 | #5 0x40048722 in ets_printf () 73 | #6 0x4200937a in app_main () at /Users/erhan/dev/esp-coredump/tests/test_apps/main/test_core_dump.c:20 74 | #7 0x420176ba in main_task (args=) at /builds/espressif/esp-idf/components/freertos/app_startup.c:208 75 | #8 0x40384088 in vPortTaskWrapper (pxCode=, pvParameters=) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:255 76 | 77 | ==================== THREAD 2 (TCB: 0x3fc8f38c, name: 'IDLE') ===================== 78 | #0 vPortTaskWrapper (pxCode=0x403849a6 , pvParameters=0x0) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:251 79 | #1 0x00000000 in ?? () 80 | Backtrace stopped: frame did not save the PC 81 | 82 | ==================== THREAD 3 (TCB: 0x3fc8da94, name: 'esp_timer') ===================== 83 | #0 0x4038424e in vPortClearInterruptMaskFromISR (prev_int_level=1) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:516 84 | #1 0x403842b4 in vPortExitCritical () at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:616 85 | #2 0x403856f2 in ulTaskGenericNotifyTake (uxIndexToWait=uxIndexToWait@entry=0, xClearCountOnExit=xClearCountOnExit@entry=1, xTicksToWait=xTicksToWait@entry=4294967295) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/tasks.c:5659 86 | #3 0x42005370 in timer_task (arg=) at /builds/espressif/esp-idf/components/esp_timer/src/esp_timer.c:477 87 | #4 0x40384088 in vPortTaskWrapper (pxCode=, pvParameters=) at /builds/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:255 88 | 89 | 90 | ======================= ALL MEMORY REGIONS ======================== 91 | Name Address Size Attrs 92 | .rtc.force_fast 0x50000010 0x0 RW 93 | .rtc_noinit 0x50000010 0x0 RW 94 | .rtc.force_slow 0x50000010 0x0 RW 95 | .iram0.text 0x40380000 0x9d14 R XA 96 | .dram0.data 0x3fc89e00 0xc08 RW A 97 | .flash.text 0x42000020 0x1809e R XA 98 | .flash.appdesc 0x3c020020 0x100 R A 99 | .flash.rodata 0x3c020120 0x6d40 RW A 100 | .eh_frame 0x3c026e60 0xa50 R A 101 | .flash.rodata_noload 0x3c0278b0 0x0 RW 102 | .iram0.data 0x40389e00 0x0 RW 103 | .iram0.bss 0x40389e00 0x0 RW 104 | .dram0.heap_start 0x3fc8bd40 0x0 RW 105 | .coredump.tasks.data 0x3fc8ec30 0x154 RW 106 | .coredump.tasks.data 0x3fc8e9d0 0x250 RW 107 | .coredump.tasks.data 0x3fc8f38c 0x154 RW 108 | .coredump.tasks.data 0x3fc8f2e0 0xa0 RW 109 | .coredump.tasks.data 0x3fc8da94 0x154 RW 110 | .coredump.tasks.data 0x3fc8d9a0 0xe0 RW 111 | 112 | ====================== CORE DUMP MEMORY CONTENTS ======================== 113 | .coredump.tasks.data 0x3fc8ec30 0x154 RW 114 | 0x3fc8ec30: 0x3fc8eb80 0x00000000 0x3fc8abc8 0x3fc8abc8 115 | 0x3fc8ec40: 0x3fc8ec30 0x3fc8abc0 0x00000018 0x00000000 116 | 0x3fc8ec50: 0x00000000 0x3fc8ec30 0x00000000 0x00000001 117 | 0x3fc8ec60: 0x3fc8dc2c 0x6e69616d 0x00000000 0x00000000 118 | 0x3fc8ec70: 0x00000000 0x00000000 0x3fc8ec20 0x00000001 119 | 0x3fc8ec80: 0x00000000 0x00000000 0x00000000 0x00000000 120 | 0x3fc8ec90: 0x3fc8c52c 0x3fc8c594 0x3fc8c5fc 0x00000000 121 | 0x3fc8eca0: 0x00000000 0x00000001 0x00000000 0x00000000 122 | 0x3fc8ecb0: 0x00000000 0x420048ca 0x00000000 0x00000000 123 | 0x3fc8ecc0: 0x00000000 0x00000000 0x00000000 0x00000000 124 | 0x3fc8ecd0: 0x00000000 0x00000000 0x00000000 0x00000000 125 | 0x3fc8ece0: 0x00000000 0x00000000 0x00000000 0x00000000 126 | 0x3fc8ecf0: 0x00000000 0x00000000 0x00000000 0x00000000 127 | 0x3fc8ed00: 0x00000000 0x00000000 0x00000000 0x00000000 128 | 0x3fc8ed10: 0x00000000 0x00000000 0x00000000 0x00000000 129 | 0x3fc8ed20: 0x00000000 0x00000000 0x00000000 0x00000000 130 | 0x3fc8ed30: 0x00000000 0x00000000 0x00000000 0x00000000 131 | 0x3fc8ed40: 0x00000000 0x00000000 0x00000000 0x00000000 132 | 0x3fc8ed50: 0x00000000 0x00000000 0x00000000 0x00000000 133 | 0x3fc8ed60: 0x00000000 0x00000000 0x00000000 0x00000000 134 | 0x3fc8ed70: 0x00000000 0x00000000 0x00000000 0x00000000 135 | 0x3fc8ed80: 0x00000000 136 | .coredump.tasks.data 0x3fc8e9d0 0x250 RW 137 | 0x3fc8e9d0: 0x40380698 0x4038368e 0x3fc8ea70 0x3fc8a600 138 | 0x3fc8e9e0: 0x3fc87ee0 0x37363534 0x7271706f 0x33323130 139 | 0x3fc8e9f0: 0x00000004 0x3fc8ead4 0x3fc8ea9c 0x3fc8ead2 140 | 0x3fc8ea00: 0x00000000 0x3fc8eac9 0x00000001 0x3fc8c000 141 | 0x3fc8ea10: 0x7a797877 0x76757473 0x00000000 0x3fc8eb10 142 | 0x3fc8ea20: 0x3fc8eba4 0x00000000 0x400481b0 0x3c023849 143 | 0x3fc8ea30: 0x00000000 0x3fc8eb10 0x00000000 0x00000000 144 | 0x3fc8ea40: 0x6e6d6c6b 0x6a696867 0x66656463 0x62613938 145 | 0x3fc8ea50: 0x00001881 0x40380001 0x00000007 0x00000000 146 | 0x3fc8ea60: 0x00000000 0x3fc8ead4 0x3fc8ead0 0x40031da4 147 | 0x3fc8ea70: 0xa5a5a5a5 0xa5a5a5a5 0x3fc8ead0 0x403887b8 148 | 0x3fc8ea80: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0x3fc8a498 149 | 0x3fc8ea90: 0x3fc8ead4 0x3fc8a4b4 0x3fc8ead0 0x726f6261 150 | 0x3fc8eaa0: 0x20292874 0x20736177 0x6c6c6163 0x61206465 151 | 0x3fc8eab0: 0x43502074 0x34783020 0x39303032 0x20313533 152 | 0x3fc8eac0: 0x63206e6f 0x2065726f 0x00000030 0x40040000 153 | 0x3fc8ead0: 0x00000030 0x30303234 0x31353339 0x40387700 154 | 0x3fc8eae0: 0x00000000 0x00000000 0x3c022000 0x42009354 155 | 0x3fc8eaf0: 0x00000000 0x00000000 0x3c022000 0x400485e4 156 | 0x3fc8eb00: 0x00000804 0x00000054 0x00000000 0x00000000 157 | 0x3fc8eb10: 0x00001800 0x00000010 0x00000010 0x403809a4 158 | 0x3fc8eb20: 0x3fc8f38c 0x00000010 0x00000010 0x3fc8ebbc 159 | 0x3fc8eb30: 0x3c0227d0 0x3c022798 0x3c022798 0x00000000 160 | 0x3fc8eb40: 0x00000000 0x00000000 0x00000000 0x00000000 161 | 0x3fc8eb50: 0x00000000 0x00000000 0x00000000 0x00000000 162 | 0x3fc8eb60: 0x00000000 0x00000000 0x3c022000 0x40048722 163 | 0x3fc8eb70: 0x00000000 0x00000000 0x00000000 0x00000000 164 | 0x3fc8eb80: 0x00000000 0x00000000 0x3c022000 0x3fc8eba4 165 | 0x3fc8eb90: 0x3fc8f5fc 0x3fc8f5fc 0x3fc8ebd4 0x4200937a 166 | 0x3fc8eba0: 0x00000000 0x42009338 0x00000000 0x00000001 167 | 0x3fc8ebb0: 0x00000002 0x3fcdf000 0x60023000 0x0000000a 168 | 0x3fc8ebc0: 0x3c022798 0x000000b4 0xfe7fffff 0x420176ba 169 | 0x3fc8ebd0: 0x00000000 0x00001388 0x00000001 0x00000000 170 | 0x3fc8ebe0: 0x00000000 0x00000000 0x00000000 0x40384088 171 | 0x3fc8ebf0: 0x00000000 0x00000000 0x00000000 0x00000000 172 | 0x3fc8ec00: 0x00000000 0x00000000 0x00000000 0x00000000 173 | 0x3fc8ec10: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 174 | .coredump.tasks.data 0x3fc8f38c 0x154 RW 175 | 0x3fc8f38c: 0x3fc8f2e0 0x00000000 0x3fc8abb4 0x3fc8abb4 176 | 0x3fc8f39c: 0x3fc8f38c 0x3fc8abac 0x00000019 0x00000000 177 | 0x3fc8f3ac: 0x00000000 0x3fc8f38c 0x00000000 0x00000000 178 | 0x3fc8f3bc: 0x3fc8ed88 0x454c4449 0x00000000 0x00000000 179 | 0x3fc8f3cc: 0x00000000 0x00000000 0x3fc8f380 0x00000000 180 | 0x3fc8f3dc: 0x00000000 0x00000000 0x00000000 0x00000000 181 | 0x3fc8f3ec: 0x3fc8c52c 0x3fc8c594 0x3fc8c5fc 0x00000000 182 | 0x3fc8f3fc: 0x00000000 0x00000001 0x00000000 0x00000000 183 | 0x3fc8f40c: 0x00000000 0x420048ca 0x00000000 0x00000000 184 | 0x3fc8f41c: 0x00000000 0x00000000 0x00000000 0x00000000 185 | 0x3fc8f42c: 0x00000000 0x00000000 0x00000000 0x00000000 186 | 0x3fc8f43c: 0x00000000 0x00000000 0x00000000 0x00000000 187 | 0x3fc8f44c: 0x00000000 0x00000000 0x00000000 0x00000000 188 | 0x3fc8f45c: 0x00000000 0x00000000 0x00000000 0x00000000 189 | 0x3fc8f46c: 0x00000000 0x00000000 0x00000000 0x00000000 190 | 0x3fc8f47c: 0x00000000 0x00000000 0x00000000 0x00000000 191 | 0x3fc8f48c: 0x00000000 0x00000000 0x00000000 0x00000000 192 | 0x3fc8f49c: 0x00000000 0x00000000 0x00000000 0x00000000 193 | 0x3fc8f4ac: 0x00000000 0x00000000 0x00000000 0x00000000 194 | 0x3fc8f4bc: 0x00000000 0x00000000 0x00000000 0x00000000 195 | 0x3fc8f4cc: 0x00000000 0x00000000 0x00000000 0x00000000 196 | 0x3fc8f4dc: 0x00000200 197 | .coredump.tasks.data 0x3fc8f2e0 0xa0 RW 198 | 0x3fc8f2e0: 0x4038407c 0x00000000 0x00000000 0x3fc8a600 199 | 0x3fc8f2f0: 0x3fc88640 0x00000000 0x00000000 0x00000000 200 | 0x3fc8f300: 0x00000000 0x00000000 0x403849a6 0x00000000 201 | 0x3fc8f310: 0x00000000 0x00000000 0x00000000 0x00000000 202 | 0x3fc8f320: 0x00000000 0x00000000 0x00000000 0x00000000 203 | 0x3fc8f330: 0x00000000 0x00000000 0x00000000 0x00000000 204 | 0x3fc8f340: 0x00000000 0x00000000 0x00000000 0x00000000 205 | 0x3fc8f350: 0x00000000 0x00000000 0x00000000 0x00000000 206 | 0x3fc8f360: 0x00000000 0x00000000 0x00000000 0x00000000 207 | 0x3fc8f370: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 208 | .coredump.tasks.data 0x3fc8da94 0x154 RW 209 | 0x3fc8da94: 0x3fc8d9a0 0x00000000 0x3fc8ab50 0x3fc8ab50 210 | 0x3fc8daa4: 0x3fc8da94 0x3fc8ab48 0x00000003 0x00000000 211 | 0x3fc8dab4: 0x00000000 0x3fc8da94 0x00000000 0x00000016 212 | 0x3fc8dac4: 0x3fc8ca90 0x5f707365 0x656d6974 0x00000072 213 | 0x3fc8dad4: 0x00000000 0x00000000 0x3fc8da80 0x00000016 214 | 0x3fc8dae4: 0x00000000 0x00000000 0x00000000 0x00000000 215 | 0x3fc8daf4: 0x3fc8c52c 0x3fc8c594 0x3fc8c5fc 0x00000000 216 | 0x3fc8db04: 0x00000000 0x00000001 0x00000000 0x00000000 217 | 0x3fc8db14: 0x00000000 0x420048ca 0x00000000 0x00000000 218 | 0x3fc8db24: 0x00000000 0x00000000 0x00000000 0x00000000 219 | 0x3fc8db34: 0x00000000 0x00000000 0x00000000 0x00000000 220 | 0x3fc8db44: 0x00000000 0x00000000 0x00000000 0x00000000 221 | 0x3fc8db54: 0x00000000 0x00000000 0x00000000 0x00000000 222 | 0x3fc8db64: 0x00000000 0x00000000 0x00000000 0x00000000 223 | 0x3fc8db74: 0x00000000 0x00000000 0x00000000 0x00000000 224 | 0x3fc8db84: 0x00000000 0x00000000 0x00000000 0x00000000 225 | 0x3fc8db94: 0x00000000 0x00000000 0x00000000 0x00000000 226 | 0x3fc8dba4: 0x00000000 0x00000000 0x00000000 0x00000000 227 | 0x3fc8dbb4: 0x00000000 0x00000000 0x00000000 0x00000000 228 | 0x3fc8dbc4: 0x00000000 0x00000000 0x00000000 0x00000000 229 | 0x3fc8dbd4: 0x00000000 0x00000000 0x00000000 0x00000000 230 | 0x3fc8dbe4: 0x00000001 231 | .coredump.tasks.data 0x3fc8d9a0 0xe0 RW 232 | 0x3fc8d9a0: 0x4038424e 0x403842b4 0x3fc8da20 0x3fc8a600 233 | 0x3fc8d9b0: 0x3fc86d40 0x00000000 0x00000000 0x00000000 234 | 0x3fc8d9c0: 0x00000000 0xffffffff 0x00000001 0x00000001 235 | 0x3fc8d9d0: 0x3fc8da98 0x00000004 0x00000000 0x600c2000 236 | 0x3fc8d9e0: 0x00000000 0x00000000 0x00000001 0x00000000 237 | 0x3fc8d9f0: 0x00000000 0x00000000 0x00000000 0x00000000 238 | 0x3fc8da00: 0x00000000 0x00000000 0x00000000 0x00000000 239 | 0x3fc8da10: 0x00000000 0x00000000 0x00000000 0x00000000 240 | 0x3fc8da20: 0x00000001 0xffffffff 0x00000000 0x403856f2 241 | 0x3fc8da30: 0x00000000 0x00000000 0x00000000 0x42005370 242 | 0x3fc8da40: 0x00000000 0x00000000 0x00000000 0x40384088 243 | 0x3fc8da50: 0x00000000 0x00000000 0x00000000 0x00000000 244 | 0x3fc8da60: 0x00000000 0x00000000 0x00000000 0x00000000 245 | 0x3fc8da70: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 246 | 247 | ===================== ESP32 CORE DUMP END ===================== 248 | =============================================================== 249 | Done! 250 | --------------------------------------------------------------------------------