mirror of
https://github.com/espressif/esp-idf
synced 2025-03-10 01:29:21 -04:00
sys_view: Adds processing scripts for heap & log traces
This commit is contained in:
parent
5ef3a64c00
commit
8c6a924cdf
1
.flake8
1
.flake8
@ -160,5 +160,4 @@ exclude =
|
|||||||
components/wifi_provisioning/python/wifi_constants_pb2.py,
|
components/wifi_provisioning/python/wifi_constants_pb2.py,
|
||||||
examples/provisioning/custom_config/components/custom_provisioning/python/custom_config_pb2.py,
|
examples/provisioning/custom_config/components/custom_provisioning/python/custom_config_pb2.py,
|
||||||
# temporary list (should be empty)
|
# temporary list (should be empty)
|
||||||
tools/esp_app_trace/pylibelf,
|
|
||||||
tools/mass_mfg/mfg_gen.py,
|
tools/mass_mfg/mfg_gen.py,
|
||||||
|
@ -643,6 +643,18 @@ test_espcoredump:
|
|||||||
- cd components/espcoredump/test/
|
- cd components/espcoredump/test/
|
||||||
- ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test_espcoredump.sh
|
- ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test_espcoredump.sh
|
||||||
|
|
||||||
|
test_sysview_trace_proc:
|
||||||
|
<<: *host_test_template
|
||||||
|
artifacts:
|
||||||
|
when: on_failure
|
||||||
|
paths:
|
||||||
|
- tools/esp_app_trace/test/sysview/output
|
||||||
|
- tools/esp_app_trace/test/sysview/.coverage
|
||||||
|
expire_in: 1 week
|
||||||
|
script:
|
||||||
|
- cd ${IDF_PATH}/tools/esp_app_trace/test/sysview
|
||||||
|
- ${IDF_PATH}/tools/ci/multirun_with_pyenv.sh ./test.sh
|
||||||
|
|
||||||
push_to_github:
|
push_to_github:
|
||||||
stage: deploy
|
stage: deploy
|
||||||
image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
|
image: $CI_DOCKER_REGISTRY/esp32-ci-env$BOT_DOCKER_IMAGE_TAG
|
||||||
|
@ -15,15 +15,15 @@ To compile with ESP-IDF you need to get the following packages:
|
|||||||
|
|
||||||
- CentOS 7::
|
- CentOS 7::
|
||||||
|
|
||||||
sudo yum install git wget ncurses-devel flex bison gperf python pyserial cmake ninja-build ccache
|
sudo yum install git wget ncurses-devel flex bison gperf python pyserial python-pyelftools cmake ninja-build ccache
|
||||||
|
|
||||||
- Ubuntu and Debian::
|
- Ubuntu and Debian::
|
||||||
|
|
||||||
sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing cmake ninja-build ccache
|
sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing python-pyelftools cmake ninja-build ccache
|
||||||
|
|
||||||
- Arch::
|
- Arch::
|
||||||
|
|
||||||
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing cmake ninja ccache
|
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing python2-pyelftools cmake ninja ccache
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
CMake version 3.5 or newer is required for use with ESP-IDF. Older Linux distributions may require updating, enabling of a "backports" repository, or installing of a "cmake3" package rather than "cmake".
|
CMake version 3.5 or newer is required for use with ESP-IDF. Older Linux distributions may require updating, enabling of a "backports" repository, or installing of a "cmake3" package rather than "cmake".
|
||||||
|
@ -13,15 +13,15 @@ To compile with ESP-IDF you need to get the following packages:
|
|||||||
|
|
||||||
- CentOS 7::
|
- CentOS 7::
|
||||||
|
|
||||||
sudo yum install git wget ncurses-devel flex bison gperf python pyserial cmake ninja-build ccache
|
sudo yum install git wget ncurses-devel flex bison gperf python pyserial python-pyelftools cmake ninja-build ccache
|
||||||
|
|
||||||
- Ubuntu and Debian::
|
- Ubuntu and Debian::
|
||||||
|
|
||||||
sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing cmake ninja-build ccache
|
sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing python-pyelftools cmake ninja-build ccache
|
||||||
|
|
||||||
- Arch::
|
- Arch::
|
||||||
|
|
||||||
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing cmake ninja ccache
|
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing python2-pyelftools cmake ninja ccache
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
CMake version 3.5 or newer is required for use with ESP-IDF. Older Linux distributions may require updating, enabling of a "backports" repository, or installing of a "cmake3" package rather than "cmake".
|
CMake version 3.5 or newer is required for use with ESP-IDF. Older Linux distributions may require updating, enabling of a "backports" repository, or installing of a "cmake3" package rather than "cmake".
|
||||||
|
@ -14,11 +14,11 @@ To compile with ESP-IDF you need to get the following packages:
|
|||||||
|
|
||||||
- Ubuntu and Debian::
|
- Ubuntu and Debian::
|
||||||
|
|
||||||
sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing
|
sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing python-pyelftools
|
||||||
|
|
||||||
- Arch::
|
- Arch::
|
||||||
|
|
||||||
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing
|
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing python2-pyelftools
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
@ -14,11 +14,11 @@ To compile with ESP-IDF you need to get the following packages:
|
|||||||
|
|
||||||
- Ubuntu and Debian::
|
- Ubuntu and Debian::
|
||||||
|
|
||||||
sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing
|
sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing python-pyelftools
|
||||||
|
|
||||||
- Arch::
|
- Arch::
|
||||||
|
|
||||||
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing
|
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing python2-pyelftools
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
@ -15,15 +15,15 @@
|
|||||||
|
|
||||||
- CentOS 7::
|
- CentOS 7::
|
||||||
|
|
||||||
sudo yum install git wget ncurses-devel flex bison gperf python pyserial cmake ninja-build ccache
|
sudo yum install git wget ncurses-devel flex bison gperf python pyserial cmake ninja-build ccache python-pyelftools
|
||||||
|
|
||||||
- Ubuntu 和 Debian::
|
- Ubuntu 和 Debian::
|
||||||
|
|
||||||
sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing cmake ninja-build ccache
|
sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing cmake ninja-build ccache python-pyelftools
|
||||||
|
|
||||||
- Arch::
|
- Arch::
|
||||||
|
|
||||||
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing cmake ninja ccache
|
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing cmake ninja ccache python2-pyelftools
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
使用 ESP-IDF 需要 CMake 3.5 或以上版本。较早版本的 Linux 可能需要升级才能向后移植仓库,或安装 "cmake3" 软件包,而不是安装 "cmake"。
|
使用 ESP-IDF 需要 CMake 3.5 或以上版本。较早版本的 Linux 可能需要升级才能向后移植仓库,或安装 "cmake3" 软件包,而不是安装 "cmake"。
|
||||||
|
@ -13,15 +13,15 @@ Linux 平台工具链的标准设置 (CMake)
|
|||||||
|
|
||||||
- CentOS 7::
|
- CentOS 7::
|
||||||
|
|
||||||
sudo yum install git wget ncurses-devel flex bison gperf python pyserial cmake ninja-build ccache
|
sudo yum install git wget ncurses-devel flex bison gperf python pyserial cmake ninja-build ccache python-pyelftools
|
||||||
|
|
||||||
- Ubuntu 和 Debian::
|
- Ubuntu 和 Debian::
|
||||||
|
|
||||||
sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing cmake ninja-build ccache
|
sudo apt-get install git wget libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing cmake ninja-build ccache python-pyelftools
|
||||||
|
|
||||||
- Arch::
|
- Arch::
|
||||||
|
|
||||||
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing cmake ninja ccache
|
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing cmake ninja ccache python2-pyelftools
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
使用 ESP-IDF 需要 CMake 3.5 或以上版本。较早版本的 Linux 可能需要升级才能向后移植仓库,或安装 "cmake3" 软件包,而不是安装 "cmake"。
|
使用 ESP-IDF 需要 CMake 3.5 或以上版本。较早版本的 Linux 可能需要升级才能向后移植仓库,或安装 "cmake3" 软件包,而不是安装 "cmake"。
|
||||||
|
@ -15,11 +15,11 @@
|
|||||||
|
|
||||||
- Ubuntu 和 Debian::
|
- Ubuntu 和 Debian::
|
||||||
|
|
||||||
sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing
|
sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing python-pyelftools
|
||||||
|
|
||||||
- Arch::
|
- Arch::
|
||||||
|
|
||||||
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing
|
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing python2-pyelftools
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
@ -12,15 +12,15 @@ Linux 平台工具链的标准设置
|
|||||||
|
|
||||||
- CentOS 7::
|
- CentOS 7::
|
||||||
|
|
||||||
sudo yum install gcc git wget make ncurses-devel flex bison gperf python pyserial
|
sudo yum install gcc git wget make ncurses-devel flex bison gperf python pyserial python-pyelftools
|
||||||
|
|
||||||
- Ubuntu and Debian::
|
- Ubuntu and Debian::
|
||||||
|
|
||||||
sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing
|
sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing python-pyelftools
|
||||||
|
|
||||||
- Arch::
|
- Arch::
|
||||||
|
|
||||||
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing
|
sudo pacman -S --needed gcc git make ncurses flex bison gperf python2-pyserial python2-cryptography python2-future python2-pyparsing python2-pyelftools
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
@ -9,3 +9,4 @@ pyserial>=3.0
|
|||||||
future>=0.15.2
|
future>=0.15.2
|
||||||
cryptography>=2.1.4
|
cryptography>=2.1.4
|
||||||
pyparsing>=2.0.3
|
pyparsing>=2.0.3
|
||||||
|
pyelftools>=0.22
|
||||||
|
@ -34,8 +34,9 @@ tools/ci/test_build_system_cmake.sh
|
|||||||
tools/ci/test_configure_ci_environment.sh
|
tools/ci/test_configure_ci_environment.sh
|
||||||
tools/cmake/convert_to_cmake.py
|
tools/cmake/convert_to_cmake.py
|
||||||
tools/cmake/run_cmake_lint.sh
|
tools/cmake/run_cmake_lint.sh
|
||||||
tools/esp_app_trace/apptrace_proc.py
|
|
||||||
tools/esp_app_trace/logtrace_proc.py
|
tools/esp_app_trace/logtrace_proc.py
|
||||||
|
tools/esp_app_trace/sysviewtrace_proc.py
|
||||||
|
tools/esp_app_trace/test/sysview/test.sh
|
||||||
tools/format.sh
|
tools/format.sh
|
||||||
tools/gen_esp_err_to_name.py
|
tools/gen_esp_err_to_name.py
|
||||||
tools/idf.py
|
tools/idf.py
|
||||||
|
107
tools/esp_app_trace/SYSVIEW_FreeRTOS.txt
Normal file
107
tools/esp_app_trace/SYSVIEW_FreeRTOS.txt
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
128 vTaskAllocateMPURegions xTask=%t pxRegions=%u
|
||||||
|
33 vTaskDelete xTaskToDelete=%t
|
||||||
|
34 vTaskDelay xTicksToDelay=%u
|
||||||
|
35 vTaskDelayUntil
|
||||||
|
129 uxTaskPriorityGet xTask=%t
|
||||||
|
56 uxTaskPriorityGetFromISR xTask=%t
|
||||||
|
130 eTaskGetState xTask=%t
|
||||||
|
55 vTaskPrioritySet xTask=%t uxNewPriority=%u
|
||||||
|
36 vTaskSuspend xTaskToSuspend=%t
|
||||||
|
40 vTaskResume xTaskToResume=%t
|
||||||
|
43 xTaskResumeFromISR xTaskToResume=%t
|
||||||
|
131 vTaskStartScheduler
|
||||||
|
132 vTaskEndScheduler
|
||||||
|
133 vTaskSuspendAll
|
||||||
|
134 xTaskResumeAll
|
||||||
|
135 xTaskGetTickCount
|
||||||
|
57 xTaskGetTickCountFromISR
|
||||||
|
136 uxTaskGetNumberOfTasks
|
||||||
|
137 pcTaskGetTaskName xTaskToQuery=%t
|
||||||
|
138 uxTaskGetStackHighWaterMark xTask=%t
|
||||||
|
139 vTaskSetApplicationTaskTag xTask=%t pxHookFunction=%u
|
||||||
|
140 xTaskGetApplicationTaskTag xTask=%t
|
||||||
|
141 vTaskSetThreadLocalStoragePointer xTaskToSet=%T xIndex=%u pvValue=%u
|
||||||
|
142 pvTaskGetThreadLocalStoragePointer xTaskToQuery=%T xIndex=%u
|
||||||
|
143 xTaskCallApplicationTaskHook xTask=%T pvParameter=%u
|
||||||
|
144 xTaskGetIdleTaskHandle
|
||||||
|
145 uxTaskGetSystemState pxTaskStatusArray=%u uxArraySize=%u pulTotalRunTime=%u
|
||||||
|
146 vTaskList pcWriteBuffer=%u
|
||||||
|
147 vTaskGetRunTimeStats pcWriteBuffer=%u
|
||||||
|
44 xTaskGenericNotify xTaskToNotify=%t ulValue=%u eAction=%u pulPreviousNotificationValue=%u
|
||||||
|
45 xTaskGenericNotifyFromISR xTaskToNotify=%t ulValue=%u eAction=%u pulPreviousNotificationValue=%u pxHigherPriorityTaskWoken=%u
|
||||||
|
46 xTaskNotifyWait ulBitsToClearOnEntry=%u ulBitsToClearOnExit=%u pulNotificationValue=%u xTicksToWait=%u
|
||||||
|
38 vTaskNotifyGiveFromISR xTaskToNotify=%t pxHigherPriorityTaskWoken=%u
|
||||||
|
37 ulTaskNotifyTake xClearCountOnExit=%u xTicksToWait=%u
|
||||||
|
148 xTaskNotifyStateClear xTask=%t
|
||||||
|
149 xTaskGetCurrentTaskHandle
|
||||||
|
150 vTaskSetTimeOutState pxTimeOut=%u
|
||||||
|
151 xTaskCheckForTimeOut pxTimeOut=%u pxTicksToWait=%u
|
||||||
|
152 vTaskMissedYield
|
||||||
|
153 xTaskGetSchedulerState
|
||||||
|
39 vTaskPriorityInherit pxMutexHolder=%p
|
||||||
|
42 xTaskPriorityDisinherit pxMutexHolder=%p
|
||||||
|
154 xTaskGenericCreate pxTaskCode=%u pcName=%u usStackDepth=%u pvParameters=%u uxPriority=%u pxCreatedTask=%u puxStackBuffer=%u xRegions=%u
|
||||||
|
155 uxTaskGetTaskNumber xTask=%u
|
||||||
|
156 vTaskSetTaskNumber xTask=%u uxHandle=%u
|
||||||
|
41 vTaskStepTick xTicksToJump=%u
|
||||||
|
157 eTaskConfirmSleepModeStatus
|
||||||
|
158 xTimerCreate pcTimerName=%u xTimerPeriodInTicks=%u uxAutoReload=%u pvTimerID=%u pxCallbackFunction=%u
|
||||||
|
159 pvTimerGetTimerID xTimer=%u
|
||||||
|
160 vTimerSetTimerID xTimer=%u pvNewID=%u
|
||||||
|
161 xTimerIsTimerActive xTimer=%u
|
||||||
|
162 xTimerGetTimerDaemonTaskHandle
|
||||||
|
163 xTimerPendFunctionCallFromISR xFunctionToPend=%u pvParameter1=%u ulParameter2=%u pxHigherPriorityTaskWoken=%u
|
||||||
|
164 xTimerPendFunctionCall xFunctionToPend=%u pvParameter1=%u ulParameter2=%u xTicksToWait=%u
|
||||||
|
165 pcTimerGetTimerName xTimer=%u
|
||||||
|
166 xTimerCreateTimerTask
|
||||||
|
167 xTimerGenericCommand xTimer=%u xCommandID=%u xOptionalValue=%u pxHigherPriorityTaskWoken=%u xTicksToWait=%u
|
||||||
|
53 xQueueGenericSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u xCopyPosition=%u
|
||||||
|
50 xQueuePeekFromISR xQueue=%I pvBuffer=%p
|
||||||
|
49 xQueueGenericReceive xQueue=%I pvBuffer=%p xTicksToWait=%u xJustPeek=%u
|
||||||
|
168 uxQueueMessagesWaiting xQueue=%I
|
||||||
|
169 uxQueueSpacesAvailable xQueue=%I
|
||||||
|
48 vQueueDelete xQueue=%I
|
||||||
|
54 xQueueGenericSendFromISR xQueue=%I pvItemToQueue=%p pxHigherPriorityTaskWoken=%u xCopyPosition=%u
|
||||||
|
61 xQueueGiveFromISR xQueue=%I pxHigherPriorityTaskWoken=%u
|
||||||
|
51 xQueueReceiveFromISR xQueue=%I pvBuffer=%p pxHigherPriorityTaskWoken=%u
|
||||||
|
62 xQueueIsQueueEmptyFromISR xQueue=%I
|
||||||
|
63 xQueueIsQueueFullFromISR xQueue=%I
|
||||||
|
170 uxQueueMessagesWaitingFromISR xQueue=%I
|
||||||
|
171 xQueueAltGenericSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u xCopyPosition=%u
|
||||||
|
172 xQueueAltGenericReceive xQueue=%I pvBuffer=%p xTicksToWait=%u xJustPeeking=%u
|
||||||
|
173 xQueueCRSendFromISR xQueue=%I pvItemToQueue=%p xCoRoutinePreviouslyWoken=%u
|
||||||
|
174 xQueueCRReceiveFromISR xQueue=%I pvBuffer=%p pxTaskWoken=%u
|
||||||
|
175 xQueueCRSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u
|
||||||
|
176 xQueueCRReceive xQueue=%I pvBuffer=%p xTicksToWait=%u
|
||||||
|
177 xQueueCreateMutex ucQueueType=%u
|
||||||
|
178 xQueueCreateCountingSemaphore uxMaxCount=%u uxInitialCount=%u
|
||||||
|
179 xQueueGetMutexHolder xSemaphore=%u
|
||||||
|
180 xQueueTakeMutexRecursive xMutex=%u xTicksToWait=%u
|
||||||
|
181 xQueueGiveMutexRecursive pxMutex=%u
|
||||||
|
52 vQueueAddToRegistry xQueue=%I pcName=%u
|
||||||
|
182 vQueueUnregisterQueue xQueue=%I
|
||||||
|
47 xQueueGenericCreate uxQueueLength=%u uxItemSize=%u ucQueueType=%u
|
||||||
|
183 xQueueCreateSet uxEventQueueLength=%u
|
||||||
|
184 xQueueAddToSet xQueueOrSemaphore=%u xQueueSet=%u
|
||||||
|
185 xQueueRemoveFromSet xQueueOrSemaphore=%u xQueueSet=%u
|
||||||
|
186 xQueueSelectFromSet xQueueSet=%u xTicksToWait=%u
|
||||||
|
187 xQueueSelectFromSetFromISR xQueueSet=%u
|
||||||
|
188 xQueueGenericReset xQueue=%I xNewQueue=%u
|
||||||
|
189 vListInitialise pxList=%u
|
||||||
|
190 vListInitialiseItem pxItem=%u
|
||||||
|
191 vListInsert pxList=%u pxNewListItem=%u
|
||||||
|
192 vListInsertEnd pxList=%u pxNewListItem=%u
|
||||||
|
193 uxListRemove pxItemToRemove=%u
|
||||||
|
194 xEventGroupCreate
|
||||||
|
195 xEventGroupWaitBits xEventGroup=%u uxBitsToWaitFor=%u xClearOnExit=%u xWaitForAllBits=%u xTicksToWait=%u
|
||||||
|
196 xEventGroupClearBits xEventGroup=%u uxBitsToClear=%u
|
||||||
|
58 xEventGroupClearBitsFromISR xEventGroup=%u uxBitsToSet=%u
|
||||||
|
197 xEventGroupSetBits xEventGroup=%u uxBitsToSet=%u
|
||||||
|
59 xEventGroupSetBitsFromISR xEventGroup=%u uxBitsToSet=%u pxHigherPriorityTaskWoken=%u
|
||||||
|
198 xEventGroupSync xEventGroup=%u uxBitsToSet=%u uxBitsToWaitFor=%u xTicksToWait=%u
|
||||||
|
60 xEventGroupGetBitsFromISR xEventGroup=%u
|
||||||
|
199 vEventGroupDelete xEventGroup=%u
|
||||||
|
200 uxEventGroupGetNumber xEventGroup=%u
|
||||||
|
|
||||||
|
512 esp_sysview_heap_trace_alloc addr=%p size=%u callers=%x
|
||||||
|
513 esp_sysview_heap_trace_free addr=%p callers=%x
|
@ -1,130 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
#
|
|
||||||
|
|
||||||
from __future__ import print_function
|
|
||||||
import argparse
|
|
||||||
import struct
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
class bcolors:
|
|
||||||
HEADER = '\033[95m'
|
|
||||||
OKBLUE = '\033[94m'
|
|
||||||
OKGREEN = '\033[92m'
|
|
||||||
WARNING = '\033[93m'
|
|
||||||
FAIL = '\033[91m'
|
|
||||||
ENDC = '\033[0m'
|
|
||||||
BOLD = '\033[1m'
|
|
||||||
UNDERLINE = '\033[4m'
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
ESP32_TRACE_BLOCK_HDR_SZ = 8
|
|
||||||
ESP32_TRACE_BLOCK_TASK_IDX = 0
|
|
||||||
ESP32_TRACE_BLOCK_TS_IDX = 1
|
|
||||||
ESP32_TRACE_BLOCK_DATA_IDX = 2
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='ESP32 App Trace Parse Tool')
|
|
||||||
|
|
||||||
parser.add_argument('file', help='Path to app trace file', type=str)
|
|
||||||
parser.add_argument('--print-tasks', '-p', help='Print tasks', action='store_true')
|
|
||||||
parser.add_argument('--print-details', '-d', help='Print detailed stats', action='store_true')
|
|
||||||
parser.add_argument('--no-errors', '-n', help='Do not print errors', action='store_true')
|
|
||||||
parser.add_argument('--block-len', '-b', help='Block length', type=int, default=1024)
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
print("====================================================================")
|
|
||||||
try:
|
|
||||||
ftrc = open(args.file, 'rb')
|
|
||||||
except IOError as e:
|
|
||||||
print("Failed to open trace file (%s)!" % e)
|
|
||||||
sys.exit(2)
|
|
||||||
|
|
||||||
passed = True
|
|
||||||
off = 0
|
|
||||||
data_stats = {}
|
|
||||||
last_ts = None
|
|
||||||
tot_discont = 0
|
|
||||||
while True:
|
|
||||||
# ftrc.seek(off)
|
|
||||||
task = None
|
|
||||||
ts = 0
|
|
||||||
trc_buf = ftrc.read(args.block_len)
|
|
||||||
if len(trc_buf) == 0:
|
|
||||||
# print('EOF')
|
|
||||||
break
|
|
||||||
trc_data = struct.unpack('<LL%sB' % (len(trc_buf) - ESP32_TRACE_BLOCK_HDR_SZ), trc_buf)
|
|
||||||
if len(trc_data):
|
|
||||||
# print("%x %x, len %d" % (trc_data[0], trc_data[1], len(trc_data) - 2))
|
|
||||||
# print(trc_data[2:])
|
|
||||||
# sys.exit(0)
|
|
||||||
task = trc_data[ESP32_TRACE_BLOCK_TASK_IDX]
|
|
||||||
ts = trc_data[ESP32_TRACE_BLOCK_TS_IDX]
|
|
||||||
# print(ts)
|
|
||||||
if last_ts and last_ts >= ts:
|
|
||||||
# print("Global TS discontinuity %x -> %x, task %x, stamp %x at %x" % (last_ts, ts, task,
|
|
||||||
# data_stats[task]['stamp'], off))
|
|
||||||
if args.print_details:
|
|
||||||
print("Global TS discontinuity %x -> %x, task %x at %x" % (last_ts, ts, task, off))
|
|
||||||
# tot_discont += 1
|
|
||||||
# passed = False
|
|
||||||
last_ts = ts
|
|
||||||
if task not in data_stats:
|
|
||||||
print("%x: NEW TASK" % task)
|
|
||||||
data_stats[task] = {'stamp': trc_data[ESP32_TRACE_BLOCK_DATA_IDX], 'last_ts': ts, 'count': 1, 'discont_offs': [], 'inv_stamps_offs': []}
|
|
||||||
else:
|
|
||||||
if data_stats[task]['last_ts'] == ts:
|
|
||||||
print("Task TS discontinuity %x -> %x, task %x, stamp %x at %x" % (last_ts, ts, task, data_stats[task]['stamp'], off))
|
|
||||||
data_stats[task]['discont_offs'].append(off)
|
|
||||||
tot_discont += 1
|
|
||||||
passed = False
|
|
||||||
data_stats[task]['last_ts'] = ts
|
|
||||||
data_stats[task]['count'] += 1
|
|
||||||
if len(trc_data) > ESP32_TRACE_BLOCK_DATA_IDX:
|
|
||||||
# print("DATA = %x %x %x %x" % (trc_data[-4], trc_data[-3], trc_data[-2], trc_data[-1]))
|
|
||||||
if args.print_tasks:
|
|
||||||
print("Task[%d] %x, ts %08x, stamp %x" % (off / args.block_len, task, ts, trc_data[ESP32_TRACE_BLOCK_DATA_IDX]))
|
|
||||||
else:
|
|
||||||
print("%x: NO DATA" % task)
|
|
||||||
else:
|
|
||||||
print("Failed to unpack data!")
|
|
||||||
sys.exit(2)
|
|
||||||
|
|
||||||
# check data
|
|
||||||
for i in range(ESP32_TRACE_BLOCK_DATA_IDX, len(trc_data)):
|
|
||||||
if trc_data[i] != data_stats[task]['stamp']:
|
|
||||||
if not args.no_errors:
|
|
||||||
print("Invalid stamp %x->%x at %x, task %x" % (data_stats[task]['stamp'], trc_data[i], off + ESP32_TRACE_BLOCK_HDR_SZ + i, task))
|
|
||||||
passed = False
|
|
||||||
data_stats[task]['stamp'] = trc_data[i]
|
|
||||||
data_stats[task]['inv_stamps_offs'].append(off)
|
|
||||||
# break
|
|
||||||
if len(trc_buf) < args.block_len:
|
|
||||||
print('Last block (not full)')
|
|
||||||
break
|
|
||||||
|
|
||||||
if data_stats[task]['stamp'] is not None:
|
|
||||||
data_stats[task]['stamp'] = (data_stats[task]['stamp'] + 1) & 0xFF
|
|
||||||
# print("stamp=%x" % data_stats[task][ESP32_TRACE_STAMP_IDX])
|
|
||||||
off += args.block_len
|
|
||||||
|
|
||||||
ftrc.close()
|
|
||||||
print("====================================================================")
|
|
||||||
print("Trace size %d bytes, discont %d\n" % (off, tot_discont))
|
|
||||||
for t in data_stats:
|
|
||||||
print("Task %x. Total count %d. Inv stamps %d. TS Discontinuities %d." % (t, data_stats[t]['count'],
|
|
||||||
len(data_stats[t]['inv_stamps_offs']), len(data_stats[t]['discont_offs'])))
|
|
||||||
if args.print_details:
|
|
||||||
print('Invalid stamps offs: [{}]'.format(', '.join(hex(x) for x in data_stats[t]['inv_stamps_offs'])))
|
|
||||||
print('TS Discontinuities offs: [{}]'.format(', '.join(hex(x) for x in data_stats[t]['discont_offs'])))
|
|
||||||
print("\n")
|
|
||||||
|
|
||||||
if passed:
|
|
||||||
print("Data - OK")
|
|
||||||
else:
|
|
||||||
print("Data - FAILED!")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
5
tools/esp_app_trace/espytrace/README.md
Normal file
5
tools/esp_app_trace/espytrace/README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# espytrace Python package
|
||||||
|
|
||||||
|
This package implements base routines and classes for processing ESP32 application level trace data.
|
||||||
|
- `apptrace.py` includes functionality which is common for all types of trace data.
|
||||||
|
- `sysview.py` includes functionality which is specific for SystemView trace data format.
|
0
tools/esp_app_trace/espytrace/__init__.py
Normal file
0
tools/esp_app_trace/espytrace/__init__.py
Normal file
720
tools/esp_app_trace/espytrace/apptrace.py
Normal file
720
tools/esp_app_trace/espytrace/apptrace.py
Normal file
@ -0,0 +1,720 @@
|
|||||||
|
import os
|
||||||
|
try:
|
||||||
|
from urlparse import urlparse
|
||||||
|
except ImportError:
|
||||||
|
from urllib.parse import urlparse
|
||||||
|
try:
|
||||||
|
import SocketServer
|
||||||
|
except ImportError:
|
||||||
|
import socketserver as SocketServer
|
||||||
|
import threading
|
||||||
|
import tempfile
|
||||||
|
import time
|
||||||
|
import subprocess
|
||||||
|
import os.path
|
||||||
|
import elftools.elf.elffile as elffile
|
||||||
|
import elftools.elf.constants as elfconst
|
||||||
|
|
||||||
|
|
||||||
|
def addr2line(toolchain, elf_path, addr):
|
||||||
|
"""
|
||||||
|
Creates trace reader.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
toolchain : string
|
||||||
|
toolchain prefix to retrieve source line locations using addresses
|
||||||
|
elf_path : string
|
||||||
|
path to ELF file to use
|
||||||
|
addr : int
|
||||||
|
address to retrieve source line location
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
string
|
||||||
|
source line location string
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
return subprocess.check_output(['%saddr2line' % toolchain, '-e', elf_path, '0x%x' % addr]).decode("utf-8")
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
return ''
|
||||||
|
|
||||||
|
|
||||||
|
class ParseError(RuntimeError):
|
||||||
|
"""
|
||||||
|
Parse error exception
|
||||||
|
"""
|
||||||
|
def __init__(self, message):
|
||||||
|
RuntimeError.__init__(self, message)
|
||||||
|
|
||||||
|
|
||||||
|
class ReaderError(RuntimeError):
|
||||||
|
"""
|
||||||
|
Trace reader error exception
|
||||||
|
"""
|
||||||
|
def __init__(self, message):
|
||||||
|
RuntimeError.__init__(self, message)
|
||||||
|
|
||||||
|
|
||||||
|
class ReaderTimeoutError(ReaderError):
|
||||||
|
"""
|
||||||
|
Trace reader timeout error
|
||||||
|
"""
|
||||||
|
def __init__(self, tmo, sz):
|
||||||
|
ReaderError.__init__(self, 'Timeout %f sec while reading %d bytes!' % (tmo, sz))
|
||||||
|
|
||||||
|
|
||||||
|
class ReaderShutdownRequest(ReaderError):
|
||||||
|
"""
|
||||||
|
Trace reader shutdown request error
|
||||||
|
Raised when user presses CTRL+C (SIGINT).
|
||||||
|
"""
|
||||||
|
def __init__(self):
|
||||||
|
ReaderError.__init__(self, 'Shutdown request!')
|
||||||
|
|
||||||
|
|
||||||
|
class Reader:
|
||||||
|
"""
|
||||||
|
Base abstract reader class
|
||||||
|
"""
|
||||||
|
def __init__(self, tmo):
|
||||||
|
"""
|
||||||
|
Constructor
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
tmo : int
|
||||||
|
read timeout
|
||||||
|
"""
|
||||||
|
self.timeout = tmo
|
||||||
|
self.need_stop = False
|
||||||
|
|
||||||
|
def read(self, sz):
|
||||||
|
"""
|
||||||
|
Reads a number of bytes
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
sz : int
|
||||||
|
number of bytes to read
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
bytes object
|
||||||
|
read bytes
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
ReaderTimeoutError
|
||||||
|
if timeout expires
|
||||||
|
ReaderShutdownRequest
|
||||||
|
if SIGINT was received during reading
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def readline(self):
|
||||||
|
"""
|
||||||
|
Reads line
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
sz : int
|
||||||
|
number of bytes to read
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
string
|
||||||
|
read line
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def forward(self, sz):
|
||||||
|
"""
|
||||||
|
Moves read pointer to a number of bytes
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
sz : int
|
||||||
|
number of bytes to read
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def cleanup(self):
|
||||||
|
"""
|
||||||
|
Cleans up reader
|
||||||
|
"""
|
||||||
|
self.need_stop = True
|
||||||
|
|
||||||
|
|
||||||
|
class FileReader(Reader):
|
||||||
|
"""
|
||||||
|
File reader class
|
||||||
|
"""
|
||||||
|
def __init__(self, path, tmo):
|
||||||
|
"""
|
||||||
|
Constructor
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
path : string
|
||||||
|
path to file to read
|
||||||
|
tmo : int
|
||||||
|
see Reader.__init__()
|
||||||
|
"""
|
||||||
|
Reader.__init__(self, tmo)
|
||||||
|
self.trace_file_path = path
|
||||||
|
self.trace_file = open(path, 'rb')
|
||||||
|
|
||||||
|
def read(self, sz):
|
||||||
|
"""
|
||||||
|
see Reader.read()
|
||||||
|
"""
|
||||||
|
data = b''
|
||||||
|
start_tm = time.clock()
|
||||||
|
while not self.need_stop:
|
||||||
|
data += self.trace_file.read(sz - len(data))
|
||||||
|
if len(data) == sz:
|
||||||
|
break
|
||||||
|
if self.timeout != -1 and time.clock() >= start_tm + self.timeout:
|
||||||
|
raise ReaderTimeoutError(self.timeout, sz)
|
||||||
|
if self.need_stop:
|
||||||
|
raise ReaderShutdownRequest()
|
||||||
|
return data
|
||||||
|
|
||||||
|
def get_pos(self):
|
||||||
|
"""
|
||||||
|
Retrieves current file read position
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
int
|
||||||
|
read position
|
||||||
|
"""
|
||||||
|
return self.trace_file.tell()
|
||||||
|
|
||||||
|
def readline(self, linesep=os.linesep):
|
||||||
|
"""
|
||||||
|
see Reader.read()
|
||||||
|
"""
|
||||||
|
line = ''
|
||||||
|
start_tm = time.clock()
|
||||||
|
while not self.need_stop:
|
||||||
|
line += self.trace_file.readline().decode("utf-8")
|
||||||
|
if line.endswith(linesep):
|
||||||
|
break
|
||||||
|
if self.timeout != -1 and time.clock() >= start_tm + self.timeout:
|
||||||
|
raise ReaderTimeoutError(self.timeout, 1)
|
||||||
|
if self.need_stop:
|
||||||
|
raise ReaderShutdownRequest()
|
||||||
|
return line
|
||||||
|
|
||||||
|
def forward(self, sz):
|
||||||
|
"""
|
||||||
|
see Reader.read()
|
||||||
|
"""
|
||||||
|
cur_pos = self.trace_file.tell()
|
||||||
|
start_tm = time.clock()
|
||||||
|
while not self.need_stop:
|
||||||
|
file_sz = os.path.getsize(self.trace_file_path)
|
||||||
|
if file_sz - cur_pos >= sz:
|
||||||
|
break
|
||||||
|
if self.timeout != -1 and time.clock() >= start_tm + self.timeout:
|
||||||
|
raise ReaderTimeoutError(self.timeout, sz)
|
||||||
|
if self.need_stop:
|
||||||
|
raise ReaderShutdownRequest()
|
||||||
|
self.trace_file.seek(sz, os.SEEK_CUR)
|
||||||
|
|
||||||
|
|
||||||
|
class NetRequestHandler:
|
||||||
|
"""
|
||||||
|
Handler for incoming network requests (connections, datagrams)
|
||||||
|
"""
|
||||||
|
def handle(self):
|
||||||
|
while not self.server.need_stop:
|
||||||
|
data = self.rfile.read(1024)
|
||||||
|
if len(data) == 0:
|
||||||
|
break
|
||||||
|
self.server.wtrace.write(data)
|
||||||
|
self.server.wtrace.flush()
|
||||||
|
|
||||||
|
|
||||||
|
class NetReader(FileReader):
|
||||||
|
"""
|
||||||
|
Base netwoek socket reader class
|
||||||
|
"""
|
||||||
|
def __init__(self, tmo):
|
||||||
|
"""
|
||||||
|
see Reader.__init__()
|
||||||
|
"""
|
||||||
|
fhnd,fname = tempfile.mkstemp()
|
||||||
|
FileReader.__init__(self, fname, tmo)
|
||||||
|
self.wtrace = os.fdopen(fhnd, 'wb')
|
||||||
|
self.server_thread = threading.Thread(target=self.serve_forever)
|
||||||
|
self.server_thread.start()
|
||||||
|
|
||||||
|
def cleanup(self):
|
||||||
|
"""
|
||||||
|
see Reader.cleanup()
|
||||||
|
"""
|
||||||
|
FileReader.cleanup(self)
|
||||||
|
self.shutdown()
|
||||||
|
self.server_close()
|
||||||
|
self.server_thread.join()
|
||||||
|
time.sleep(0.1)
|
||||||
|
self.trace_file.close()
|
||||||
|
self.wtrace.close()
|
||||||
|
|
||||||
|
|
||||||
|
class TCPRequestHandler(NetRequestHandler, SocketServer.StreamRequestHandler):
|
||||||
|
"""
|
||||||
|
Handler for incoming TCP connections
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class TCPReader(NetReader, SocketServer.TCPServer):
|
||||||
|
"""
|
||||||
|
TCP socket reader class
|
||||||
|
"""
|
||||||
|
def __init__(self, host, port, tmo):
|
||||||
|
"""
|
||||||
|
Constructor
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
host : string
|
||||||
|
see SocketServer.BaseServer.__init__()
|
||||||
|
port : int
|
||||||
|
see SocketServer.BaseServer.__init__()
|
||||||
|
tmo : int
|
||||||
|
see Reader.__init__()
|
||||||
|
"""
|
||||||
|
SocketServer.TCPServer.__init__(self, (host, port), TCPRequestHandler)
|
||||||
|
NetReader.__init__(self, tmo)
|
||||||
|
|
||||||
|
|
||||||
|
class UDPRequestHandler(NetRequestHandler, SocketServer.DatagramRequestHandler):
|
||||||
|
"""
|
||||||
|
Handler for incoming UDP datagrams
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class UDPReader(NetReader, SocketServer.UDPServer):
|
||||||
|
"""
|
||||||
|
UDP socket reader class
|
||||||
|
"""
|
||||||
|
def __init__(self, host, port, tmo):
|
||||||
|
"""
|
||||||
|
Constructor
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
host : string
|
||||||
|
see SocketServer.BaseServer.__init__()
|
||||||
|
port : int
|
||||||
|
see SocketServer.BaseServer.__init__()
|
||||||
|
tmo : int
|
||||||
|
see Reader.__init__()
|
||||||
|
"""
|
||||||
|
SocketServer.UDPServer.__init__(self, (host, port), UDPRequestHandler)
|
||||||
|
NetReader.__init__(self, tmo)
|
||||||
|
|
||||||
|
|
||||||
|
def reader_create(trc_src, tmo):
|
||||||
|
"""
|
||||||
|
Creates trace reader.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
trc_src : string
|
||||||
|
trace source URL. Supports 'file:///path/to/file' or (tcp|udp)://host:port
|
||||||
|
tmo : int
|
||||||
|
read timeout
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
Reader
|
||||||
|
reader object or None if URL scheme is not supported
|
||||||
|
"""
|
||||||
|
url = urlparse(trc_src)
|
||||||
|
if len(url.scheme) == 0 or url.scheme == 'file':
|
||||||
|
if os.name == 'nt':
|
||||||
|
# workaround for Windows path
|
||||||
|
return FileReader(trc_src[7:], tmo)
|
||||||
|
else:
|
||||||
|
return FileReader(url.path, tmo)
|
||||||
|
if url.scheme == 'tcp':
|
||||||
|
return TCPReader(url.hostname, url.port, tmo)
|
||||||
|
if url.scheme == 'udp':
|
||||||
|
return UDPReader(url.hostname, url.port, tmo)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
class TraceDataProcessor:
|
||||||
|
"""
|
||||||
|
Base abstract class for all trace data processors.
|
||||||
|
"""
|
||||||
|
def __init__(self, print_events, keep_all_events=False):
|
||||||
|
"""
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
print_events : bool
|
||||||
|
if True every event will be printed as they arrive
|
||||||
|
keep_all_events : bool
|
||||||
|
if True all events will be kept in self.events in the order they arrive
|
||||||
|
"""
|
||||||
|
self.print_events = print_events
|
||||||
|
self.keep_all_events = keep_all_events
|
||||||
|
self.total_events = 0
|
||||||
|
self.events = []
|
||||||
|
# This can be changed by the root procesor that includes several sub-processors.
|
||||||
|
# It is used access some method of root processor which can contain methods/data common for all sub-processors.
|
||||||
|
# Common info could be current execution context, info about running tasks, available IRQs etc.
|
||||||
|
self.root_proc = self
|
||||||
|
|
||||||
|
def _print_event(self, event):
|
||||||
|
"""
|
||||||
|
Base method to print an event.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
event : object
|
||||||
|
Event object
|
||||||
|
"""
|
||||||
|
print("EVENT[{:d}]: {}".format(self.total_events, event))
|
||||||
|
|
||||||
|
def print_report(self):
|
||||||
|
"""
|
||||||
|
Base method to print report.
|
||||||
|
"""
|
||||||
|
print("Processed {:d} events".format(self.total_events))
|
||||||
|
|
||||||
|
def cleanup(self):
|
||||||
|
"""
|
||||||
|
Base method to make cleanups.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def on_new_event(self, event):
|
||||||
|
"""
|
||||||
|
Base method to process event.
|
||||||
|
"""
|
||||||
|
if self.print_events:
|
||||||
|
self._print_event(event)
|
||||||
|
if self.keep_all_events:
|
||||||
|
self.events.append(event)
|
||||||
|
self.total_events += 1
|
||||||
|
|
||||||
|
|
||||||
|
class LogTraceParseError(ParseError):
|
||||||
|
"""
|
||||||
|
Log trace parse error exception.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def get_str_from_elf(felf, str_addr):
|
||||||
|
"""
|
||||||
|
Retrieves string from ELF file.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
felf : elffile.ELFFile
|
||||||
|
open ELF file handle to retrive format string from
|
||||||
|
str_addr : int
|
||||||
|
address of the string
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
string
|
||||||
|
string or None if it was not found
|
||||||
|
"""
|
||||||
|
tgt_str = ''
|
||||||
|
for sect in felf.iter_sections():
|
||||||
|
if sect['sh_addr'] == 0 or (sect['sh_flags'] & elfconst.SH_FLAGS.SHF_ALLOC) == 0:
|
||||||
|
continue
|
||||||
|
if str_addr < sect['sh_addr'] or str_addr >= sect['sh_addr'] + sect['sh_size']:
|
||||||
|
continue
|
||||||
|
sec_data = sect.data()
|
||||||
|
for i in range(str_addr - sect['sh_addr'], sect['sh_size']):
|
||||||
|
if type(sec_data) is str:
|
||||||
|
ch = sec_data[i]
|
||||||
|
else:
|
||||||
|
ch = str(chr(sec_data[i]))
|
||||||
|
if ch == '\0':
|
||||||
|
break
|
||||||
|
tgt_str += ch
|
||||||
|
if len(tgt_str) > 0:
|
||||||
|
return tgt_str
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
class LogTraceEvent:
|
||||||
|
"""
|
||||||
|
Log trace event.
|
||||||
|
"""
|
||||||
|
def __init__(self, fmt_addr, log_args):
|
||||||
|
"""
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fmt_addr : int
|
||||||
|
address of the format string
|
||||||
|
log_args : list
|
||||||
|
list of log message arguments
|
||||||
|
"""
|
||||||
|
self.fmt_addr = fmt_addr
|
||||||
|
self.args = log_args
|
||||||
|
|
||||||
|
def get_message(self, felf):
|
||||||
|
"""
|
||||||
|
Retrieves log message.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
felf : elffile.ELFFile
|
||||||
|
open ELF file handle to retrive format string from
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
string
|
||||||
|
formatted log message
|
||||||
|
|
||||||
|
Raises
|
||||||
|
------
|
||||||
|
LogTraceParseError
|
||||||
|
if format string has not been found in ELF file
|
||||||
|
"""
|
||||||
|
fmt_str = get_str_from_elf(felf, self.fmt_addr)
|
||||||
|
if not fmt_str:
|
||||||
|
raise LogTraceParseError('Failed to find format string for 0x%x' % self.fmt_addr)
|
||||||
|
prcnt_idx = 0
|
||||||
|
for i, arg in enumerate(self.args):
|
||||||
|
prcnt_idx = fmt_str.find('%', prcnt_idx, -2) # TODO: check str ending with %
|
||||||
|
if prcnt_idx == -1:
|
||||||
|
break
|
||||||
|
prcnt_idx += 1 # goto next char
|
||||||
|
if fmt_str[prcnt_idx] == 's':
|
||||||
|
# find string
|
||||||
|
arg_str = get_str_from_elf(felf, self.args[i])
|
||||||
|
if arg_str:
|
||||||
|
self.args[i] = arg_str
|
||||||
|
else:
|
||||||
|
self.args[i] = '<None>'
|
||||||
|
fmt_str = fmt_str.replace('%p', '%x')
|
||||||
|
return fmt_str % tuple(self.args)
|
||||||
|
|
||||||
|
|
||||||
|
class BaseLogTraceDataProcessorImpl:
|
||||||
|
"""
|
||||||
|
Base implementation for log data processors.
|
||||||
|
"""
|
||||||
|
def __init__(self, print_log_events=False, elf_path=''):
|
||||||
|
"""
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
print_log_events : bool
|
||||||
|
if True every log event will be printed as they arrive
|
||||||
|
elf_path : string
|
||||||
|
path to ELF file to retrieve format strings for log messages
|
||||||
|
"""
|
||||||
|
if len(elf_path):
|
||||||
|
self.felf = elffile.ELFFile(open(elf_path, 'rb'))
|
||||||
|
else:
|
||||||
|
self.felf = None
|
||||||
|
self.print_log_events = print_log_events
|
||||||
|
self.messages = []
|
||||||
|
|
||||||
|
def cleanup(self):
|
||||||
|
"""
|
||||||
|
Cleanup
|
||||||
|
"""
|
||||||
|
if self.felf:
|
||||||
|
self.felf.stream.close()
|
||||||
|
|
||||||
|
def print_report(self):
|
||||||
|
"""
|
||||||
|
Prints log report
|
||||||
|
"""
|
||||||
|
print("=============== LOG TRACE REPORT ===============")
|
||||||
|
print("Processed {:d} log messages.".format(len(self.messages)))
|
||||||
|
|
||||||
|
def on_new_event(self, event):
|
||||||
|
"""
|
||||||
|
Processes log events.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
event : LogTraceEvent
|
||||||
|
Event object.
|
||||||
|
"""
|
||||||
|
msg = event.get_message(self.felf)
|
||||||
|
self.messages.append(msg)
|
||||||
|
if self.print_log_events:
|
||||||
|
print(msg),
|
||||||
|
|
||||||
|
|
||||||
|
class HeapTraceParseError(ParseError):
|
||||||
|
"""
|
||||||
|
Heap trace parse error exception.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class HeapTraceDuplicateAllocError(HeapTraceParseError):
|
||||||
|
"""
|
||||||
|
Heap trace duplicate allocation error exception.
|
||||||
|
"""
|
||||||
|
def __init__(self, addr, new_size, prev_size):
|
||||||
|
"""
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
addr : int
|
||||||
|
memory block address
|
||||||
|
new_size : int
|
||||||
|
size of the new allocation
|
||||||
|
prev_size : int
|
||||||
|
size of the previous allocation
|
||||||
|
"""
|
||||||
|
HeapTraceParseError.__init__(self, """Duplicate alloc @ 0x{:x}!
|
||||||
|
New alloc is {:d} bytes,
|
||||||
|
previous is {:d} bytes.""".format(addr, new_size, prev_size))
|
||||||
|
|
||||||
|
|
||||||
|
class HeapTraceEvent:
|
||||||
|
"""
|
||||||
|
Heap trace event.
|
||||||
|
"""
|
||||||
|
def __init__(self, ctx_name, in_irq, core_id, ts, alloc, size, addr, callers, toolchain='', elf_path=''):
|
||||||
|
"""
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
ctx_name : string
|
||||||
|
name of event context (task or IRQ name)
|
||||||
|
in_irq : bool
|
||||||
|
True if event has been generated in IRQ context, otherwise False
|
||||||
|
core_id : int
|
||||||
|
core which generated the event
|
||||||
|
ts : float
|
||||||
|
event timestamp
|
||||||
|
alloc : bool
|
||||||
|
True for allocation event, otherwise False
|
||||||
|
size : int
|
||||||
|
size of allocation; has no meaning for de-allocation event
|
||||||
|
addr : int
|
||||||
|
address of allocation/de-allocation
|
||||||
|
callers : list
|
||||||
|
list of callers (callstack) for event
|
||||||
|
toolchain_pref : string
|
||||||
|
toolchain prefix to retrieve source line locations using addresses
|
||||||
|
elf_path : string
|
||||||
|
path to ELF file to retrieve format strings for log messages
|
||||||
|
"""
|
||||||
|
self.ctx_name = ctx_name
|
||||||
|
self.in_irq = in_irq
|
||||||
|
self.core_id = core_id
|
||||||
|
self.ts = ts
|
||||||
|
self.alloc = alloc
|
||||||
|
self.size = size
|
||||||
|
self.addr = addr
|
||||||
|
self.callers = callers
|
||||||
|
self.toolchain = toolchain
|
||||||
|
self.elf_path = elf_path
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
if len(self.toolchain) and len(self.elf_path):
|
||||||
|
callers = os.linesep
|
||||||
|
for addr in self.callers:
|
||||||
|
callers += '{}'.format(addr2line(self.toolchain, self.elf_path, addr))
|
||||||
|
else:
|
||||||
|
callers = ''
|
||||||
|
for addr in self.callers:
|
||||||
|
if len(callers):
|
||||||
|
callers += ':'
|
||||||
|
callers += '0x{:x}'.format(addr)
|
||||||
|
if self.in_irq:
|
||||||
|
ctx_desc = 'IRQ "%s"' % self.ctx_name
|
||||||
|
else:
|
||||||
|
ctx_desc = 'task "%s"' % self.ctx_name
|
||||||
|
if self.alloc:
|
||||||
|
return "[{:.9f}] HEAP: Allocated {:d} bytes @ 0x{:x} from {} on core {:d} by: {}".format(self.ts, self.size,
|
||||||
|
self.addr, ctx_desc,
|
||||||
|
self.core_id, callers)
|
||||||
|
else:
|
||||||
|
return "[{:.9f}] HEAP: Freed bytes @ 0x{:x} from {} on core {:d} by: {}".format(self.ts, self.addr, ctx_desc,
|
||||||
|
self.core_id, callers)
|
||||||
|
|
||||||
|
|
||||||
|
class BaseHeapTraceDataProcessorImpl:
|
||||||
|
"""
|
||||||
|
Base implementation for heap data processors.
|
||||||
|
"""
|
||||||
|
def __init__(self, print_heap_events=False):
|
||||||
|
"""
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
print_heap_events : bool
|
||||||
|
if True every heap event will be printed as they arrive
|
||||||
|
"""
|
||||||
|
self._alloc_addrs = {}
|
||||||
|
self.allocs = []
|
||||||
|
self.frees = []
|
||||||
|
self.heap_events_count = 0
|
||||||
|
self.print_heap_events = print_heap_events
|
||||||
|
|
||||||
|
def on_new_event(self, event):
|
||||||
|
"""
|
||||||
|
Processes heap events. Keeps track of active allocations list.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
event : HeapTraceEvent
|
||||||
|
Event object.
|
||||||
|
"""
|
||||||
|
self.heap_events_count += 1
|
||||||
|
if self.print_heap_events:
|
||||||
|
print(event)
|
||||||
|
if event.alloc:
|
||||||
|
if event.addr in self._alloc_addrs:
|
||||||
|
raise HeapTraceDuplicateAllocError(event.addr, event.size, self._alloc_addrs[event.addr].size)
|
||||||
|
self.allocs.append(event)
|
||||||
|
self._alloc_addrs[event.addr] = event
|
||||||
|
else:
|
||||||
|
# do not treat free on unknown addresses as errors, because these blocks coould be allocated when tracing was disabled
|
||||||
|
if event.addr in self._alloc_addrs:
|
||||||
|
event.size = self._alloc_addrs[event.addr].size
|
||||||
|
self.allocs.remove(self._alloc_addrs[event.addr])
|
||||||
|
del self._alloc_addrs[event.addr]
|
||||||
|
else:
|
||||||
|
self.frees.append(event)
|
||||||
|
|
||||||
|
def print_report(self):
|
||||||
|
"""
|
||||||
|
Prints heap report
|
||||||
|
"""
|
||||||
|
print("=============== HEAP TRACE REPORT ===============")
|
||||||
|
print("Processed {:d} heap events.".format(self.heap_events_count))
|
||||||
|
if len(self.allocs) == 0:
|
||||||
|
print("OK - Heap errors was not found.")
|
||||||
|
return
|
||||||
|
leaked_bytes = 0
|
||||||
|
for alloc in self.allocs:
|
||||||
|
leaked_bytes += alloc.size
|
||||||
|
print(alloc)
|
||||||
|
for free in self.frees:
|
||||||
|
if free.addr > alloc.addr and free.addr <= alloc.addr + alloc.size:
|
||||||
|
print("Possible wrong free operation found")
|
||||||
|
print(free)
|
||||||
|
print("Found {:d} leaked bytes in {:d} blocks.".format(leaked_bytes, len(self.allocs)))
|
1220
tools/esp_app_trace/espytrace/sysview.py
Normal file
1220
tools/esp_app_trace/espytrace/sysview.py
Normal file
File diff suppressed because it is too large
Load Diff
@ -5,11 +5,9 @@ from __future__ import print_function
|
|||||||
import argparse
|
import argparse
|
||||||
import struct
|
import struct
|
||||||
import sys
|
import sys
|
||||||
import pylibelf as elf
|
import elftools.elf.elffile as elffile
|
||||||
import pylibelf.util as elfutil
|
|
||||||
import pylibelf.iterators as elfiter
|
|
||||||
import pylibelf.constants as elfconst
|
|
||||||
import ctypes
|
import ctypes
|
||||||
|
import espytrace.apptrace as apptrace
|
||||||
|
|
||||||
|
|
||||||
class ESPLogTraceParserError(RuntimeError):
|
class ESPLogTraceParserError(RuntimeError):
|
||||||
@ -77,34 +75,14 @@ def logtrace_parse(fname):
|
|||||||
return recs
|
return recs
|
||||||
|
|
||||||
|
|
||||||
def logtrace_get_str_from_elf(felf, str_addr):
|
|
||||||
tgt_str = ""
|
|
||||||
for sect in elfiter.sections(felf):
|
|
||||||
hdr = elfutil.section_hdr(felf, sect)
|
|
||||||
if hdr.sh_addr == 0 or hdr.sh_type != elfconst.SHT_PROGBITS:
|
|
||||||
continue
|
|
||||||
if str_addr < hdr.sh_addr or str_addr >= hdr.sh_addr + hdr.sh_size:
|
|
||||||
continue
|
|
||||||
# print("Found SECT: %x..%x @ %x" % (hdr.sh_addr, hdr.sh_addr + hdr.sh_size, str_addr - hdr.sh_addr))
|
|
||||||
sec_data = elfiter.getOnlyData(sect).contents
|
|
||||||
buf = ctypes.cast(sec_data.d_buf, ctypes.POINTER(ctypes.c_char))
|
|
||||||
for i in range(str_addr - hdr.sh_addr, hdr.sh_size):
|
|
||||||
if buf[i] == "\0":
|
|
||||||
break
|
|
||||||
tgt_str += buf[i]
|
|
||||||
if len(tgt_str) > 0:
|
|
||||||
return tgt_str
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def logtrace_formated_print(recs, elfname, no_err):
|
def logtrace_formated_print(recs, elfname, no_err):
|
||||||
try:
|
try:
|
||||||
felf = elfutil.open_elf(elfname)
|
felf = elffile.ELFFile(open(elfname, 'rb'))
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
raise ESPLogTraceParserError("Failed to open ELF file (%s)!" % e)
|
raise ESPLogTraceParserError("Failed to open ELF file (%s)!" % e)
|
||||||
|
|
||||||
for lrec in recs:
|
for lrec in recs:
|
||||||
fmt_str = logtrace_get_str_from_elf(felf, lrec.fmt_addr)
|
fmt_str = apptrace.get_str_from_elf(felf, lrec.fmt_addr)
|
||||||
i = 0
|
i = 0
|
||||||
prcnt_idx = 0
|
prcnt_idx = 0
|
||||||
while i < len(lrec.args):
|
while i < len(lrec.args):
|
||||||
@ -114,7 +92,7 @@ def logtrace_formated_print(recs, elfname, no_err):
|
|||||||
prcnt_idx += 1 # goto next char
|
prcnt_idx += 1 # goto next char
|
||||||
if fmt_str[prcnt_idx] == 's':
|
if fmt_str[prcnt_idx] == 's':
|
||||||
# find string
|
# find string
|
||||||
arg_str = logtrace_get_str_from_elf(felf, lrec.args[i])
|
arg_str = apptrace.get_str_from_elf(felf, lrec.args[i])
|
||||||
if arg_str:
|
if arg_str:
|
||||||
lrec.args[i] = arg_str
|
lrec.args[i] = arg_str
|
||||||
i += 1
|
i += 1
|
||||||
@ -129,8 +107,7 @@ def logtrace_formated_print(recs, elfname, no_err):
|
|||||||
if not no_err:
|
if not no_err:
|
||||||
print("Print error (%s)" % e)
|
print("Print error (%s)" % e)
|
||||||
print("\nFmt = {%s}, args = %d/%s" % (fmt_str, len(lrec.args), lrec.args))
|
print("\nFmt = {%s}, args = %d/%s" % (fmt_str, len(lrec.args), lrec.args))
|
||||||
|
felf.stream.close()
|
||||||
elf.elf_end(felf)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
59
tools/esp_app_trace/pylibelf/.gitignore
vendored
59
tools/esp_app_trace/pylibelf/.gitignore
vendored
@ -1,59 +0,0 @@
|
|||||||
# Byte-compiled / optimized / DLL files
|
|
||||||
__pycache__/
|
|
||||||
*.py[cod]
|
|
||||||
|
|
||||||
# C extensions
|
|
||||||
*.so
|
|
||||||
|
|
||||||
# Distribution / packaging
|
|
||||||
.Python
|
|
||||||
env/
|
|
||||||
build/
|
|
||||||
develop-eggs/
|
|
||||||
dist/
|
|
||||||
downloads/
|
|
||||||
eggs/
|
|
||||||
lib/
|
|
||||||
lib64/
|
|
||||||
parts/
|
|
||||||
sdist/
|
|
||||||
var/
|
|
||||||
*.egg-info/
|
|
||||||
.installed.cfg
|
|
||||||
*.egg
|
|
||||||
|
|
||||||
# PyInstaller
|
|
||||||
# Usually these files are written by a python script from a template
|
|
||||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
||||||
*.manifest
|
|
||||||
*.spec
|
|
||||||
|
|
||||||
# Installer logs
|
|
||||||
pip-log.txt
|
|
||||||
pip-delete-this-directory.txt
|
|
||||||
|
|
||||||
# Unit test / coverage reports
|
|
||||||
htmlcov/
|
|
||||||
.tox/
|
|
||||||
.coverage
|
|
||||||
.cache
|
|
||||||
nosetests.xml
|
|
||||||
coverage.xml
|
|
||||||
|
|
||||||
# Translations
|
|
||||||
*.mo
|
|
||||||
*.pot
|
|
||||||
|
|
||||||
# Django stuff:
|
|
||||||
*.log
|
|
||||||
|
|
||||||
# Sphinx documentation
|
|
||||||
docs/_build/
|
|
||||||
|
|
||||||
# PyBuilder
|
|
||||||
target/
|
|
||||||
|
|
||||||
*.swp
|
|
||||||
*.swo
|
|
||||||
*.swn
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
|||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2014 d1m0
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
pylibelf
|
|
||||||
========
|
|
||||||
|
|
||||||
Python binding for libelf.
|
|
||||||
|
|
@ -1,155 +0,0 @@
|
|||||||
from types import *
|
|
||||||
from constants import *
|
|
||||||
from ctypes import *
|
|
||||||
|
|
||||||
lelf=CDLL("libelf.so.1")
|
|
||||||
|
|
||||||
__all__ = []
|
|
||||||
|
|
||||||
all_objs = []
|
|
||||||
|
|
||||||
class ElfError(Exception):
|
|
||||||
def __init__(self, msg):
|
|
||||||
self.msg = msg
|
|
||||||
self.errno = elf_errno()
|
|
||||||
self.elfmsg = elf_errmsg(self.errno)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return "ElfError(%d, %s): %s" % (self.errno, self.elfmsg, self.msg)
|
|
||||||
|
|
||||||
__all__.append("ElfError")
|
|
||||||
|
|
||||||
def nonNullDec(f):
|
|
||||||
def decorated(*args):
|
|
||||||
res = f(*args)
|
|
||||||
try:
|
|
||||||
a = res.contents
|
|
||||||
all_objs.append(res)
|
|
||||||
except ValueError: # NULL
|
|
||||||
raise ElfError(f.__name__ + " returned NULL")
|
|
||||||
return res
|
|
||||||
return decorated
|
|
||||||
|
|
||||||
def nonNegDec(f):
|
|
||||||
def decorated(*args):
|
|
||||||
res = f(*args)
|
|
||||||
if 0 > res:
|
|
||||||
raise ElfError(f.__name__ + " returned %d" % (res,))
|
|
||||||
return res
|
|
||||||
return decorated
|
|
||||||
|
|
||||||
def badValDec(badVal):
|
|
||||||
def decorator(f):
|
|
||||||
def decorated(*args):
|
|
||||||
res = f(*args)
|
|
||||||
if res == badVal:
|
|
||||||
raise ElfError(f.__name__ + " returned %s" % (str(res),))
|
|
||||||
return res
|
|
||||||
return decorated
|
|
||||||
return decorator
|
|
||||||
|
|
||||||
def define(f, argtypes, restype, err_decorator = None):
|
|
||||||
f.argtypes = argtypes
|
|
||||||
f.restype = restype
|
|
||||||
name = f.__name__
|
|
||||||
__all__.append(name)
|
|
||||||
|
|
||||||
if (err_decorator != None):
|
|
||||||
f = err_decorator(f)
|
|
||||||
|
|
||||||
globals()[name] = f
|
|
||||||
|
|
||||||
define(lelf.elf_version, [ c_int ], c_int )
|
|
||||||
|
|
||||||
if (elf_version(EV_CURRENT) == EV_NONE):
|
|
||||||
raise Exception("Version mismatch")
|
|
||||||
|
|
||||||
off_t = c_size_t # TODO(dbounov): Figure out actual off_t type
|
|
||||||
|
|
||||||
define(lelf.elf_begin, [ c_int, Elf_Cmd, ElfP ], ElfP)
|
|
||||||
define(lelf.elf_getident, [ ElfP, POINTER(c_int) ], POINTER(Elf_IdentT), nonNullDec)
|
|
||||||
define(lelf.elf_end, [ ElfP ], c_int, nonNegDec )
|
|
||||||
define(lelf.elf_cntl, [ ElfP, c_int ], c_int, nonNegDec)
|
|
||||||
define(lelf.elf_errmsg, [ c_int ], c_char_p)
|
|
||||||
define(lelf.elf_errno, [ ], c_int)
|
|
||||||
define(lelf.elf_fill, [ c_int ], None)
|
|
||||||
define(lelf.elf_flagdata, [ Elf_DataP, c_int, c_uint ], c_uint)
|
|
||||||
define(lelf.elf_flagehdr, [ ElfP, c_int, c_uint ], c_uint)
|
|
||||||
define(lelf.elf_flagelf, [ ElfP, c_int, c_uint ], c_uint)
|
|
||||||
define(lelf.elf_flagphdr, [ ElfP, c_int, c_uint ], c_uint)
|
|
||||||
define(lelf.elf_flagscn, [ Elf_ScnP, c_int, c_uint ], c_uint)
|
|
||||||
define(lelf.elf_flagshdr, [ Elf_ScnP, c_int, c_uint ], c_uint)
|
|
||||||
define(lelf.elf_getarhdr, [ ElfP ], POINTER(Elf_Arhdr))
|
|
||||||
#define(lelf.elf_getarsym, [ ], )
|
|
||||||
define(lelf.elf_getbase, [ ElfP ], off_t, nonNegDec)
|
|
||||||
define(lelf.elf_getdata, [ Elf_ScnP, Elf_DataP ], Elf_DataP)
|
|
||||||
define(lelf.elf_getscn, [ ElfP, c_size_t ], Elf_ScnP, nonNullDec )
|
|
||||||
define(lelf.elf_getshnum, [ ElfP, POINTER(c_size_t) ], c_int, nonNegDec )
|
|
||||||
define(lelf.elf_getshstrndx, [ ElfP, POINTER(c_size_t) ], c_int, nonNegDec )
|
|
||||||
define(lelf.elf_hash, [ c_char_p ], c_ulong)
|
|
||||||
define(lelf.elf_kind, [ ElfP ], c_int )
|
|
||||||
define(lelf.elf_memory, [ POINTER(c_char), c_size_t ], ElfP, nonNullDec)
|
|
||||||
define(lelf.elf_ndxscn, [ Elf_ScnP ], c_size_t, badValDec(SHN_UNDEF))
|
|
||||||
define(lelf.elf_newdata, [ Elf_ScnP ], Elf_DataP, nonNullDec)
|
|
||||||
define(lelf.elf_newscn, [ ElfP ], Elf_ScnP, nonNullDec)
|
|
||||||
#define(lelf.elf_next, [ ], )
|
|
||||||
define(lelf.elf_nextscn, [ ElfP, Elf_ScnP ], Elf_ScnP)
|
|
||||||
#define(lelf.elf_rand, [ ], )
|
|
||||||
define(lelf.elf_rawdata, [ Elf_ScnP, Elf_DataP ], Elf_DataP)
|
|
||||||
#define(lelf.elf_rawfile, [ ], )
|
|
||||||
define(lelf.elf_strptr, [ ElfP, c_size_t, c_size_t ], c_char_p)
|
|
||||||
define(lelf.elf_update, [ ElfP, c_int], off_t, nonNegDec)
|
|
||||||
|
|
||||||
define(lelf.elf32_checksum, [ ElfP ], c_long)
|
|
||||||
define(lelf.elf32_fsize, [ c_int, c_size_t, c_uint ], c_size_t, nonNegDec)
|
|
||||||
define(lelf.elf32_getehdr, [ ElfP ], POINTER(Elf32_Ehdr), nonNullDec)
|
|
||||||
define(lelf.elf32_getphdr, [ ElfP ], POINTER(Elf32_Phdr), nonNullDec)
|
|
||||||
define(lelf.elf32_getshdr, [ Elf_ScnP ], POINTER(Elf32_Shdr), nonNullDec)
|
|
||||||
define(lelf.elf32_newehdr, [ ElfP ], POINTER(Elf32_Ehdr), nonNullDec)
|
|
||||||
define(lelf.elf32_newphdr, [ ElfP, c_size_t ], POINTER(Elf32_Phdr), nonNullDec)
|
|
||||||
define(lelf.elf32_xlatetof, [ Elf_DataP, Elf_DataP, c_uint ], Elf_DataP, nonNullDec)
|
|
||||||
define(lelf.elf32_xlatetom, [ Elf_DataP, Elf_DataP, c_uint ], Elf_DataP, nonNullDec)
|
|
||||||
|
|
||||||
|
|
||||||
define(lelf.elf64_checksum, [ ElfP ], c_long )
|
|
||||||
define(lelf.elf64_fsize, [ c_int, c_size_t, c_uint ], c_size_t, nonNegDec)
|
|
||||||
define(lelf.elf64_getehdr,[ ElfP ], POINTER(Elf64_Ehdr), nonNullDec)
|
|
||||||
define(lelf.elf64_getphdr, [ ElfP ], POINTER(Elf64_Phdr), nonNullDec)
|
|
||||||
define(lelf.elf64_getshdr, [ Elf_ScnP ], POINTER(Elf64_Shdr), nonNullDec)
|
|
||||||
define(lelf.elf64_newehdr, [ ElfP ], POINTER(Elf64_Ehdr), nonNullDec)
|
|
||||||
define(lelf.elf64_newphdr, [ ElfP, c_size_t ], POINTER(Elf64_Phdr), nonNullDec)
|
|
||||||
define(lelf.elf64_xlatetof, [ Elf_DataP, Elf_DataP, c_uint ], Elf_DataP, nonNullDec)
|
|
||||||
define(lelf.elf64_xlatetom, [ Elf_DataP, Elf_DataP, c_uint ], Elf_DataP, nonNullDec)
|
|
||||||
|
|
||||||
# NOTE(dbounov): Ignoring gelf functions for now
|
|
||||||
|
|
||||||
#define(lelf.gelf_checksum, [ ], )
|
|
||||||
#define(lelf.gelf_fsize, [ ], )
|
|
||||||
#define(lelf.gelf_getcap, [ ], )
|
|
||||||
#define(lelf.gelf_getclass, [ ], )
|
|
||||||
#define(lelf.gelf_getdyn, [ ], )
|
|
||||||
#define(lelf.gelf_getehdr, [ ], )
|
|
||||||
#define(lelf.gelf_getmove, [ ], )
|
|
||||||
#define(lelf.gelf_getphdr, [ ], )
|
|
||||||
#define(lelf.gelf_getrel, [ ], )
|
|
||||||
#define(lelf.gelf_getrela, [ ], )
|
|
||||||
#define(lelf.gelf_getshdr, [ ], )
|
|
||||||
#define(lelf.gelf_getsym, [ ], )
|
|
||||||
#define(lelf.gelf_getsyminfo, [ ], )
|
|
||||||
#define(lelf.gelf_getsymshndx, [ ], )
|
|
||||||
#define(lelf.gelf_newehdr, [ ], )
|
|
||||||
#define(lelf.gelf_newphdr, [ ], )
|
|
||||||
#define(lelf.gelf_update_cap, [ ], )
|
|
||||||
#define(lelf.gelf_update_dyn, [ ], )
|
|
||||||
#define(lelf.gelf_update_ehdr, [ ], )
|
|
||||||
#define(lelf.gelf_update_move, [ ], )
|
|
||||||
#define(lelf.gelf_update_phdr, [ ], )
|
|
||||||
#define(lelf.gelf_update_rel, [ ], )
|
|
||||||
#define(lelf.gelf_update_rela, [ ], )
|
|
||||||
#define(lelf.gelf_update_shdr, [ ], )
|
|
||||||
#define(lelf.gelf_update_sym, [ ], )
|
|
||||||
#define(lelf.gelf_update_symshndx, [ ], )
|
|
||||||
#define(lelf.gelf_update_syminfo, [ ], )
|
|
||||||
#define(lelf.gelf_xlatetof, [ ], )
|
|
||||||
#define(lelf.gelf_xlatetom, [ ], )
|
|
||||||
#define(lelf.nlist, [ ], )
|
|
File diff suppressed because it is too large
Load Diff
@ -1,216 +0,0 @@
|
|||||||
import sys
|
|
||||||
import os
|
|
||||||
from .. import *
|
|
||||||
from ..constants import *
|
|
||||||
from ..types import *
|
|
||||||
from ..util import *
|
|
||||||
from ctypes import *
|
|
||||||
|
|
||||||
def sections(elf, **kwargs):
|
|
||||||
i = None
|
|
||||||
ndx = 0 # we skip the first null section
|
|
||||||
if 'info' in kwargs:
|
|
||||||
if (isinstance(kwargs['info'], Elf_Scn)):
|
|
||||||
info = elf_ndxscn(kwargs['info'])
|
|
||||||
else:
|
|
||||||
info = kwargs['info']
|
|
||||||
else:
|
|
||||||
info = None
|
|
||||||
while 1:
|
|
||||||
i = elf_nextscn(elf, i)
|
|
||||||
ndx += 1
|
|
||||||
|
|
||||||
if (not bool(i)):
|
|
||||||
break
|
|
||||||
|
|
||||||
try:
|
|
||||||
if ('name' in kwargs and section_name(elf, i) != kwargs['name']):
|
|
||||||
continue
|
|
||||||
|
|
||||||
if ('type' in kwargs and section_type(elf, i) != kwargs['type']):
|
|
||||||
continue
|
|
||||||
|
|
||||||
if ('link' in kwargs and section_link(elf, i) != kwargs['link']):
|
|
||||||
continue
|
|
||||||
|
|
||||||
if (info != None and section_hdr(elf, i).sh_info != info):
|
|
||||||
continue
|
|
||||||
except ValueError:
|
|
||||||
print "Error iterating over section ", i
|
|
||||||
continue
|
|
||||||
|
|
||||||
if ('ndx' in kwargs and kwargs['ndx']):
|
|
||||||
yield (ndx, i.contents)
|
|
||||||
else:
|
|
||||||
yield i.contents
|
|
||||||
|
|
||||||
|
|
||||||
def shdrs(elf):
|
|
||||||
i = None
|
|
||||||
while 1:
|
|
||||||
i = elf_nextscn(elf, i)
|
|
||||||
if (not bool(i)):
|
|
||||||
break
|
|
||||||
|
|
||||||
yield select(elf, 'getshdr')(i.contents).contents
|
|
||||||
|
|
||||||
def phdrs(elf):
|
|
||||||
phdrTbl = select(elf, "getphdr")(elf)
|
|
||||||
ehdr = select(elf, "getehdr")(elf).contents
|
|
||||||
phdrCnt = ehdr.e_phnum
|
|
||||||
|
|
||||||
for i in xrange(0, phdrCnt):
|
|
||||||
yield phdrTbl[i]
|
|
||||||
|
|
||||||
def data(elf_scn):
|
|
||||||
i = None
|
|
||||||
while 1:
|
|
||||||
i = elf_getdata(elf_scn, i)
|
|
||||||
|
|
||||||
if (not bool(i)):
|
|
||||||
break
|
|
||||||
|
|
||||||
yield i.contents
|
|
||||||
|
|
||||||
def strings(v):
|
|
||||||
if (isinstance(v, Elf_Data)):
|
|
||||||
strtab_data = v
|
|
||||||
size = strtab_data.d_size
|
|
||||||
buf = cast(strtab_data.d_buf, POINTER(c_char))
|
|
||||||
start = 0;
|
|
||||||
while start < size:
|
|
||||||
end = start;
|
|
||||||
while buf[end] != '\x00': end += 1
|
|
||||||
yield (strtab_data.d_off + start, buf[start:end])
|
|
||||||
|
|
||||||
start = end+1
|
|
||||||
elif (isinstance(v, Elf_Scn)):
|
|
||||||
for d in data(v):
|
|
||||||
strtab_data = d
|
|
||||||
size = strtab_data.d_size
|
|
||||||
buf = cast(strtab_data.d_buf, POINTER(c_char))
|
|
||||||
start = 0;
|
|
||||||
while start < size:
|
|
||||||
end = start;
|
|
||||||
while buf[end] != '\x00': end += 1
|
|
||||||
yield (strtab_data.d_off + start, buf[start:end])
|
|
||||||
|
|
||||||
start = end+1
|
|
||||||
|
|
||||||
|
|
||||||
def arr_iter(data, itemT, ind = False):
|
|
||||||
size = data.d_size
|
|
||||||
|
|
||||||
if size % sizeof(itemT) != 0:
|
|
||||||
raise Exception("Data size not a multiple of symbol size!")
|
|
||||||
|
|
||||||
buf = cast(data.d_buf, POINTER(itemT))
|
|
||||||
nelems = size / sizeof(itemT)
|
|
||||||
|
|
||||||
for i in xrange(0, nelems):
|
|
||||||
if ind:
|
|
||||||
yield (i, buf[i])
|
|
||||||
else:
|
|
||||||
yield buf[i]
|
|
||||||
|
|
||||||
def syms(elf, v = None):
|
|
||||||
symT = Elf32_Sym if (is32(elf)) else Elf64_Sym
|
|
||||||
if v == None:
|
|
||||||
for s in sections(elf):
|
|
||||||
hdr = section_hdr(elf, s)
|
|
||||||
|
|
||||||
if (hdr.sh_type != SHT_SYMTAB and hdr.sh_type != SHT_DYNSYM):
|
|
||||||
continue
|
|
||||||
|
|
||||||
for d in data(s):
|
|
||||||
for (ind, sym) in arr_iter(d, symT, True):
|
|
||||||
yield (ind, sym)
|
|
||||||
elif isinstance(v, Elf_Scn):
|
|
||||||
for d in data(v):
|
|
||||||
for (ind, sym) in arr_iter(d, symT, True):
|
|
||||||
yield (ind, sym)
|
|
||||||
else:
|
|
||||||
assert isinstance(v, Elf_Data)
|
|
||||||
for (ind, sym) in arr_iter(v, symT, True):
|
|
||||||
yield (ind, sym)
|
|
||||||
|
|
||||||
def rels(elf, **kwargs):
|
|
||||||
relT = Elf32_Rel if (is32(elf)) else Elf64_Rel
|
|
||||||
if 'section' in kwargs:
|
|
||||||
secl = sections(elf, type = SHT_REL, info = kwargs['section'])
|
|
||||||
else:
|
|
||||||
secl = sections(elf, type = SHT_REL)
|
|
||||||
|
|
||||||
|
|
||||||
if 'range' in kwargs:
|
|
||||||
for scn in secl:
|
|
||||||
for d in data(scn):
|
|
||||||
for rel in arr_iter(d, relT):
|
|
||||||
if (rel.r_offset >= kwargs['range'][0] and
|
|
||||||
rel.r_offset < kwargs['range'][1]):
|
|
||||||
yield (rel, section_hdr(elf, scn).sh_link)
|
|
||||||
else:
|
|
||||||
for scn in secl:
|
|
||||||
for d in data(scn):
|
|
||||||
for rel in arr_iter(d, relT):
|
|
||||||
yield (rel, section_hdr(elf, scn).sh_link)
|
|
||||||
|
|
||||||
def relas(elf, **kwargs):
|
|
||||||
relT = Elf32_Rela if (is32(elf)) else Elf64_Rela
|
|
||||||
if 'section' in kwargs:
|
|
||||||
scn = kwargs['section']
|
|
||||||
if (type(scn) == str): scn = list(sections(elf, name=scn))[0]
|
|
||||||
if (isinstance(scn, Elf_Scn)): scn = elf_ndxscn(byref(scn))
|
|
||||||
secl = list(sections(elf, type = SHT_RELA, info = scn))
|
|
||||||
else:
|
|
||||||
secl = list(sections(elf, type = SHT_RELA))
|
|
||||||
|
|
||||||
if 'range' in kwargs:
|
|
||||||
for scn in secl:
|
|
||||||
for d in data(scn):
|
|
||||||
for rel in arr_iter(d, relT):
|
|
||||||
if (rel.r_offset + rel.r_addend >= kwargs['range'][0] and
|
|
||||||
rel.r_offset + rel.r_addend < kwargs['range'][1]):
|
|
||||||
yield (rel, section_hdr(elf, scn).sh_link)
|
|
||||||
else:
|
|
||||||
addSecId = kwargs['withSectionId']==True \
|
|
||||||
if 'withSectionId' in kwargs \
|
|
||||||
else False
|
|
||||||
if not addSecId:
|
|
||||||
for scn in secl:
|
|
||||||
for d in data(scn):
|
|
||||||
for rel in arr_iter(d, relT):
|
|
||||||
yield (rel, section_hdr(elf, scn).sh_link)
|
|
||||||
else:
|
|
||||||
for scn in secl:
|
|
||||||
for d in data(scn):
|
|
||||||
for rel in arr_iter(d, relT):
|
|
||||||
yield (rel, section_hdr(elf, scn).sh_info)
|
|
||||||
|
|
||||||
def getOnlyData(scn):
|
|
||||||
d = elf_getdata(scn, None);
|
|
||||||
assert bool(elf_getdata(scn, d)) == False
|
|
||||||
return d
|
|
||||||
|
|
||||||
def dyns(elf):
|
|
||||||
relT = Elf64_Dyn
|
|
||||||
for scn in sections(elf, name=".dynamic"):
|
|
||||||
for d in data(scn):
|
|
||||||
for dyn in arr_iter(d, relT):
|
|
||||||
yield dyn
|
|
||||||
|
|
||||||
def elfs(fname):
|
|
||||||
fd = os.open(fname, os.O_RDONLY)
|
|
||||||
ar = elf_begin(fd, ELF_C_READ, None)
|
|
||||||
|
|
||||||
i = None
|
|
||||||
while 1:
|
|
||||||
i = elf_begin(fd, ELF_C_READ, ar)
|
|
||||||
if (not bool(i)):
|
|
||||||
break
|
|
||||||
|
|
||||||
yield i
|
|
||||||
|
|
||||||
elf_end(ar)
|
|
||||||
os.close(fd)
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
|||||||
def ELF32_R_SYM(i):
|
|
||||||
if type(i) == str:
|
|
||||||
assert(len(i) == 1) # Single char
|
|
||||||
i = ord(i)
|
|
||||||
return i >> 8
|
|
||||||
|
|
||||||
def ELF32_R_TYPE(i):
|
|
||||||
if type(i) == str:
|
|
||||||
assert(len(i) == 1) # Single char
|
|
||||||
i = ord(i)
|
|
||||||
return i % 256 # Lowest 8 bits
|
|
||||||
|
|
||||||
def ELF32_R_INFO(sym, typ):
|
|
||||||
return (((sym) << 8) + typ % 256)
|
|
||||||
|
|
||||||
def ELF64_R_SYM(i):
|
|
||||||
if type(i) == str:
|
|
||||||
assert(len(i) == 1) # Single char
|
|
||||||
i = ord(i)
|
|
||||||
return i >> 32
|
|
||||||
|
|
||||||
def ELF64_R_TYPE(i):
|
|
||||||
if type(i) == str:
|
|
||||||
assert(len(i) == 1) # Single char
|
|
||||||
i = ord(i)
|
|
||||||
return i & 0xffffffffL
|
|
||||||
|
|
||||||
def ELF64_R_INFO(sym, typ):
|
|
||||||
return ((sym << 32) + (typ & 0xffffffffL))
|
|
||||||
|
|
||||||
# symbol st_info
|
|
||||||
|
|
||||||
def ELF32_ST_BIND(val):
|
|
||||||
if type(val) == str:
|
|
||||||
assert(len(val) == 1) # Single char
|
|
||||||
val = ord(val)
|
|
||||||
return val >> 4
|
|
||||||
|
|
||||||
def ELF32_ST_TYPE(val):
|
|
||||||
if type(val) == str:
|
|
||||||
assert(len(val) == 1) # Single char
|
|
||||||
val = ord(val)
|
|
||||||
return val & 0xf
|
|
||||||
|
|
||||||
def ELF32_ST_INFO(bind, type):
|
|
||||||
return (((bind) << 4) + ((type) & 0xf))
|
|
||||||
|
|
||||||
def ELF64_ST_BIND(val):
|
|
||||||
return ELF32_ST_BIND(val)
|
|
||||||
|
|
||||||
def ELF64_ST_TYPE(val):
|
|
||||||
return ELF32_ST_TYPE(val)
|
|
||||||
|
|
||||||
def ELF64_ST_INFO(bind, type):
|
|
||||||
return ELF32_ST_INFO(bind, type)
|
|
@ -1,274 +0,0 @@
|
|||||||
from ctypes import *
|
|
||||||
from ..constants import EI_NIDENT
|
|
||||||
|
|
||||||
# Obtained from /usr/lib/elf.h
|
|
||||||
|
|
||||||
# Type for a 16-bit quantity.
|
|
||||||
Elf32_Half = c_uint16
|
|
||||||
Elf64_Half = c_uint16
|
|
||||||
|
|
||||||
# Types for signed and unsigned 32-bit quantities.
|
|
||||||
Elf32_Word = c_uint32
|
|
||||||
Elf32_Sword = c_int32
|
|
||||||
Elf64_Word = c_uint32
|
|
||||||
Elf64_Sword = c_int32
|
|
||||||
|
|
||||||
# Types for signed and unsigned 64-bit quantities.
|
|
||||||
Elf32_Xword = c_uint64
|
|
||||||
Elf32_Sxword = c_int64
|
|
||||||
Elf64_Xword = c_uint64
|
|
||||||
Elf64_Sxword = c_int64
|
|
||||||
|
|
||||||
# Type of addresses.
|
|
||||||
Elf32_Addr = c_uint32
|
|
||||||
Elf64_Addr = c_uint64
|
|
||||||
|
|
||||||
# Type of file offsets.
|
|
||||||
Elf32_Off = c_uint32
|
|
||||||
Elf64_Off = c_uint64
|
|
||||||
|
|
||||||
# Type for section indices, which are 16-bit quantities.
|
|
||||||
Elf32_Section = c_uint16
|
|
||||||
Elf64_Section = c_uint16
|
|
||||||
|
|
||||||
# Type for version symbol information.
|
|
||||||
Elf32_Versym = Elf32_Half
|
|
||||||
Elf64_Versym = Elf64_Half
|
|
||||||
|
|
||||||
# The ELF file header. This appears at the start of every ELF file.
|
|
||||||
|
|
||||||
Elf_IdentT = c_char * EI_NIDENT
|
|
||||||
|
|
||||||
Elf_Cmd = c_int
|
|
||||||
|
|
||||||
class _ElfStructure(Structure):
|
|
||||||
def __str__(self):
|
|
||||||
return self.__class__.__name__ + '(' + \
|
|
||||||
','.join([field[0] + '=' + str(getattr(self, field[0])) for field in self._fields_]) + ')'
|
|
||||||
|
|
||||||
class _ElfUnion(Union):
|
|
||||||
def __str__(self):
|
|
||||||
return self.__class__.__name__ + '(' + \
|
|
||||||
','.join([field[0] + '=' + str(getattr(self, field[0])) for field in self._fields_]) + ')'
|
|
||||||
|
|
||||||
# Libelf opaque handles
|
|
||||||
class Elf(_ElfStructure):
|
|
||||||
_fields_ = []
|
|
||||||
class Elf_Scn(_ElfStructure):
|
|
||||||
_fields_ = []
|
|
||||||
|
|
||||||
class Elf_Data(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('d_buf', c_void_p),
|
|
||||||
('d_type', c_int),
|
|
||||||
('d_size', c_size_t),
|
|
||||||
('d_off', c_size_t),
|
|
||||||
('d_align', c_size_t),
|
|
||||||
('d_version', c_uint)
|
|
||||||
]
|
|
||||||
|
|
||||||
ElfP = POINTER(Elf)
|
|
||||||
Elf_ScnP = POINTER(Elf_Scn)
|
|
||||||
Elf_DataP = POINTER(Elf_Data)
|
|
||||||
|
|
||||||
class Elf32_Ehdr(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('e_ident', Elf_IdentT ), # Magic number and other info
|
|
||||||
('e_type', Elf32_Half ), # Object file type
|
|
||||||
('e_machine', Elf32_Half ), # Architecture
|
|
||||||
('e_version', Elf32_Word ), # Object file version
|
|
||||||
('e_entry', Elf32_Addr ), # Entry point virtual address
|
|
||||||
('e_phoff', Elf32_Off), # Program header table file offset
|
|
||||||
('e_shoff', Elf32_Off), # Section header table file offset
|
|
||||||
('e_flags', Elf32_Word ), # Processor-specific flags
|
|
||||||
('e_ehsize', Elf32_Half ), # ELF header size in bytes
|
|
||||||
('e_phentsize', Elf32_Half ), # Program header table entry size
|
|
||||||
('e_phnum', Elf32_Half ), # Program header table entry count
|
|
||||||
('e_shentsize', Elf32_Half ), # Section header table entry size
|
|
||||||
('e_shnum', Elf32_Half ), # Section header table entry count
|
|
||||||
('e_shstrndx', Elf32_Half ), # Section header string table index
|
|
||||||
]
|
|
||||||
|
|
||||||
class Elf64_Ehdr(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('e_ident', Elf_IdentT ), # Magic number and other info
|
|
||||||
('e_type', Elf64_Half ), # Object file type
|
|
||||||
('e_machine', Elf64_Half ), # Architecture
|
|
||||||
('e_version', Elf64_Word ), # Object file version
|
|
||||||
('e_entry', Elf64_Addr ), # Entry point virtual address
|
|
||||||
('e_phoff', Elf64_Off), # Program header table file offset
|
|
||||||
('e_shoff', Elf64_Off), # Section header table file offset
|
|
||||||
('e_flags', Elf64_Word ), # Processor-specific flags
|
|
||||||
('e_ehsize', Elf64_Half ), # ELF header size in bytes
|
|
||||||
('e_phentsize', Elf64_Half ), # Program header table entry size
|
|
||||||
('e_phnum', Elf64_Half ), # Program header table entry count
|
|
||||||
('e_shentsize', Elf64_Half ), # Section header table entry size
|
|
||||||
('e_shnum', Elf64_Half ), # Section header table entry count
|
|
||||||
('e_shstrndx', Elf64_Half ), # Section header string table index
|
|
||||||
]
|
|
||||||
|
|
||||||
class Elf32_Shdr(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('sh_name', Elf32_Word), # Section name (string tbl index)
|
|
||||||
('sh_type', Elf32_Word), # Section type
|
|
||||||
('sh_flags', Elf32_Word), # Section flags
|
|
||||||
('sh_addr', Elf32_Addr), # Section virtual addr at execution
|
|
||||||
('sh_offset', Elf32_Off), # Section file offset
|
|
||||||
('sh_size', Elf32_Word), # Section size in bytes
|
|
||||||
('sh_link', Elf32_Word), # Link to another section
|
|
||||||
('sh_info', Elf32_Word), # Additional section information
|
|
||||||
('sh_addralign', Elf32_Word), # Section alignment
|
|
||||||
('sh_entsize', Elf32_Word), # Entry size if section holds table
|
|
||||||
]
|
|
||||||
|
|
||||||
class Elf64_Shdr(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('sh_name', Elf64_Word), # Section name (string tbl index)
|
|
||||||
('sh_type', Elf64_Word), # Section type
|
|
||||||
('sh_flags', Elf64_Xword), # Section flags
|
|
||||||
('sh_addr', Elf64_Addr), # Section virtual addr at execution
|
|
||||||
('sh_offset', Elf64_Off), # Section file offset
|
|
||||||
('sh_size', Elf64_Xword), # Section size in bytes
|
|
||||||
('sh_link', Elf64_Word), # Link to another section
|
|
||||||
('sh_info', Elf64_Word), # Additional section information
|
|
||||||
('sh_addralign', Elf64_Xword), # Section alignment
|
|
||||||
('sh_entsize', Elf64_Xword), # Entry size if section holds table
|
|
||||||
]
|
|
||||||
|
|
||||||
class Elf32_Phdr(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('p_type', Elf32_Word), # Segment type
|
|
||||||
('p_offset', Elf32_Off), # Segment file offset
|
|
||||||
('p_vaddr', Elf32_Addr), # Segment virtual address
|
|
||||||
('p_paddr', Elf32_Addr), # Segment physical address
|
|
||||||
('p_filesz', Elf32_Word), # Segment size in file
|
|
||||||
('p_memsz', Elf32_Word), # Segment size in memory
|
|
||||||
('p_flags', Elf32_Word), # Segment flags
|
|
||||||
('p_align', Elf32_Word), # Segment alignment
|
|
||||||
]
|
|
||||||
|
|
||||||
class Elf64_Phdr(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('p_type', Elf64_Word), # Segment type
|
|
||||||
('p_flags', Elf64_Word), # Segment flags
|
|
||||||
('p_offset', Elf64_Off), # Segment file offset
|
|
||||||
('p_vaddr', Elf64_Addr), # Segment virtual address
|
|
||||||
('p_paddr', Elf64_Addr), # Segment physical address
|
|
||||||
('p_filesz', Elf64_Xword), # Segment size in file
|
|
||||||
('p_memsz', Elf64_Xword), # Segment size in memory
|
|
||||||
('p_align', Elf64_Xword), # Segment alignment
|
|
||||||
]
|
|
||||||
|
|
||||||
# /* Symbol table entry. */
|
|
||||||
class Elf32_Sym(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('st_name', Elf32_Word), # Symbol name (string tbl index)
|
|
||||||
('st_value', Elf32_Addr), # Symbol value
|
|
||||||
('st_size', Elf32_Word), # Symbol size
|
|
||||||
('st_info', c_char), # Symbol type and binding
|
|
||||||
('st_other', c_char), # Symbol visibility
|
|
||||||
('st_shndx', Elf32_Section), # Section index
|
|
||||||
]
|
|
||||||
|
|
||||||
class Elf64_Sym(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('st_name', Elf64_Word), # Symbol name (string tbl index)
|
|
||||||
('st_info', c_char), # Symbol type and binding
|
|
||||||
('st_other', c_char), # Symbol visibility
|
|
||||||
('st_shndx', Elf64_Section), # Section index
|
|
||||||
('st_value', Elf64_Addr), # Symbol value
|
|
||||||
('st_size', Elf64_Xword), # Symbol size
|
|
||||||
]
|
|
||||||
|
|
||||||
#/* The syminfo section if available contains additional information about
|
|
||||||
# every dynamic symbol. */
|
|
||||||
|
|
||||||
class Elf32_Syminfo(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('si_boundto', Elf32_Half), # Direct bindings, symbol bound to
|
|
||||||
('si_flags', Elf32_Half), # Per symbol flags
|
|
||||||
]
|
|
||||||
|
|
||||||
class Elf64_Syminfo(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('si_boundto', Elf64_Half), # Direct bindings, symbol bound to
|
|
||||||
('si_flags', Elf64_Half), # Per symbol flags
|
|
||||||
]
|
|
||||||
|
|
||||||
# /* Relocation table entry without addend (in section of type SHT_REL). */
|
|
||||||
|
|
||||||
class Elf32_Rel(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('r_offset', Elf32_Addr), # Address
|
|
||||||
('r_info', Elf32_Word), # Relocation type and symbol index
|
|
||||||
]
|
|
||||||
|
|
||||||
class Elf64_Rel(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('r_offset', Elf64_Addr), # Address
|
|
||||||
('r_info', Elf64_Xword), # Relocation type and symbol index
|
|
||||||
]
|
|
||||||
|
|
||||||
# # Relocation table entry with addend (in section of type SHT_RELA).
|
|
||||||
|
|
||||||
class Elf32_Rela(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('r_offset', Elf32_Addr), # Address
|
|
||||||
('r_info', Elf32_Word), # Relocation type and symbol index
|
|
||||||
('r_addend', Elf32_Sword), # Addend
|
|
||||||
]
|
|
||||||
|
|
||||||
class Elf64_Rela(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('r_offset', Elf64_Addr), # Address
|
|
||||||
('r_info', Elf64_Xword), # Relocation type and symbol index
|
|
||||||
('r_addend', Elf64_Sxword), # Addend
|
|
||||||
]
|
|
||||||
|
|
||||||
time_t = c_int64
|
|
||||||
uid_t = c_int32
|
|
||||||
gid_t = c_int32
|
|
||||||
mode_t = c_int32
|
|
||||||
off_t = c_int64
|
|
||||||
|
|
||||||
class Elf_Arhdr(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('ar_name', c_char_p),
|
|
||||||
('ar_date', time_t),
|
|
||||||
('ar_uid', uid_t),
|
|
||||||
('ar_gid', gid_t),
|
|
||||||
('ar_mode', mode_t),
|
|
||||||
('ar_size', off_t),
|
|
||||||
('ar_fmag', POINTER(c_char)),
|
|
||||||
]
|
|
||||||
|
|
||||||
class _Elf64_DynUnion(_ElfUnion):
|
|
||||||
_fields_ = [
|
|
||||||
('d_val', Elf64_Xword),
|
|
||||||
('d_ptr', Elf64_Addr),
|
|
||||||
]
|
|
||||||
|
|
||||||
class Elf64_Dyn(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('d_tag', Elf64_Xword),
|
|
||||||
('d_un', _Elf64_DynUnion),
|
|
||||||
]
|
|
||||||
|
|
||||||
# GNU Extensions
|
|
||||||
class Elf64_Verneed(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('vn_version', Elf64_Half),
|
|
||||||
('vn_cnt', Elf64_Half),
|
|
||||||
('vn_file', Elf64_Word),
|
|
||||||
('vn_aux', Elf64_Word),
|
|
||||||
('vn_next', Elf64_Word),
|
|
||||||
]
|
|
||||||
|
|
||||||
class Elf64_Vernaux(_ElfStructure):
|
|
||||||
_fields_ = [
|
|
||||||
('vna_hash', Elf64_Word),
|
|
||||||
('vna_flags', Elf64_Half),
|
|
||||||
('vna_other', Elf64_Half),
|
|
||||||
('vna_name', Elf64_Word),
|
|
||||||
('vna_next', Elf64_Word),
|
|
||||||
]
|
|
@ -1,38 +0,0 @@
|
|||||||
from .. import *
|
|
||||||
from ..types import *
|
|
||||||
from ..constants import *
|
|
||||||
from ctypes import *
|
|
||||||
import os
|
|
||||||
|
|
||||||
def _class(elf): return ord(elf_getident(elf, None).contents[EI_CLASS])
|
|
||||||
|
|
||||||
def is32(elf): return _class(elf) == ELFCLASS32
|
|
||||||
def is64(elf): return _class(elf) == ELFCLASS64
|
|
||||||
|
|
||||||
def select(elf, fname):
|
|
||||||
if is32(elf):
|
|
||||||
return globals()['elf32_' + fname]
|
|
||||||
else:
|
|
||||||
return globals()['elf64_' + fname]
|
|
||||||
|
|
||||||
def section_name(elfP, secP):
|
|
||||||
shstrndx = c_size_t()
|
|
||||||
r = elf_getshstrndx(elfP, byref(shstrndx))
|
|
||||||
shdr = select(elfP, 'getshdr')(secP)
|
|
||||||
return elf_strptr(elfP, shstrndx, shdr.contents.sh_name)
|
|
||||||
|
|
||||||
def section_type(elfP, secP):
|
|
||||||
return select(elfP, 'getshdr')(secP).contents.sh_type
|
|
||||||
|
|
||||||
def section_link(elfP, secP):
|
|
||||||
return select(elfP, 'getshdr')(secP).contents.sh_link
|
|
||||||
|
|
||||||
def section_hdr(elfP, secP):
|
|
||||||
return select(elfP, 'getshdr')(secP).contents
|
|
||||||
|
|
||||||
def open_elf(fname):
|
|
||||||
fd = os.open(fname, os.O_RDONLY)
|
|
||||||
return elf_begin(fd, ELF_C_READ, None)
|
|
||||||
|
|
||||||
def sym_name(elf, scn, sym):
|
|
||||||
return elf_strptr(elf, section_link(elf, scn), sym.st_name)
|
|
@ -1,58 +0,0 @@
|
|||||||
from .. import *
|
|
||||||
from ...types import *
|
|
||||||
from ...iterators import *
|
|
||||||
|
|
||||||
def defined(s): return s.st_shndx != SHN_UNDEF
|
|
||||||
|
|
||||||
def defines(elf, symN):
|
|
||||||
s = findSymbol(elf, symN)
|
|
||||||
print elf, symN, s
|
|
||||||
if s != None:
|
|
||||||
print s.st_shndx, s.st_name
|
|
||||||
return s != None and defined(s[1])
|
|
||||||
|
|
||||||
def derefSymbol(elf, s):
|
|
||||||
assert defined(s)
|
|
||||||
if s.st_shndx == SHN_ABS:
|
|
||||||
raise Exception("NYI")
|
|
||||||
else:
|
|
||||||
scn = elf_getscn(elf, s.st_shndx)
|
|
||||||
shdr = section_hdr(elf, scn);
|
|
||||||
off = 0
|
|
||||||
base = shdr.sh_addr if shdr.sh_addr != 0 else 0
|
|
||||||
start = s.st_value
|
|
||||||
end = s.st_value + s.st_size
|
|
||||||
r = ''
|
|
||||||
for d in data(scn):
|
|
||||||
if start >= end: break;
|
|
||||||
off = base + d.d_off
|
|
||||||
if start >= off and start < off + d.d_size:
|
|
||||||
c = cast(d.d_buf, POINTER(c_char))
|
|
||||||
l = min(off + d.d_size, end) - start
|
|
||||||
r += c[start- off : start - off + l]
|
|
||||||
start += l
|
|
||||||
|
|
||||||
return r
|
|
||||||
|
|
||||||
def derefSymbolFull(elf, s):
|
|
||||||
""" Given an elf file and a Elf{32/64}_Sym defined in the elf file,
|
|
||||||
return a tuple with the contents of memory refered to by the symbol,
|
|
||||||
and any Rel's and Rela's inside that memory.
|
|
||||||
"""
|
|
||||||
assert (defined(s))
|
|
||||||
contents = derefSymbol(elf, s)
|
|
||||||
relL = list(rels(elf, section=s.st_shndx, \
|
|
||||||
range=(s.st_value, s.st_size + s.st_value)))
|
|
||||||
relaL = list(relas(elf, section=s.st_shndx, \
|
|
||||||
range=(s.st_value, s.st_size + s.st_value)))
|
|
||||||
return (contents, relL, relaL)
|
|
||||||
|
|
||||||
# Given a symbol name return the symbol and section in which it occurs
|
|
||||||
def findSymbol(elf, s):
|
|
||||||
for scn in sections(elf, type=SHT_SYMTAB):
|
|
||||||
strndx = section_link(elf, scn)
|
|
||||||
for d in data(scn):
|
|
||||||
for (ind, sym) in syms(elf, d):
|
|
||||||
if s == elf_strptr(elf, strndx, sym.st_name):
|
|
||||||
return (scn, sym)
|
|
||||||
return None
|
|
119
tools/esp_app_trace/sysviewtrace_proc.py
Executable file
119
tools/esp_app_trace/sysviewtrace_proc.py
Executable file
@ -0,0 +1,119 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
# Copyright 2019 Espressif Systems (Shanghai) PTE LTD
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
# This is python script to process various types trace data streams in SystemView format.
|
||||||
|
# Trace data can be provided in multiple trace files (one per CPU). After processing phase
|
||||||
|
# script prints report for every type of trace data stream which was found.
|
||||||
|
#
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import sys
|
||||||
|
import os.path
|
||||||
|
import signal
|
||||||
|
import traceback
|
||||||
|
import espytrace.apptrace as apptrace
|
||||||
|
import espytrace.sysview as sysview
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description='ESP32 SEGGER SystemView Trace Parsing Tool')
|
||||||
|
|
||||||
|
parser.add_argument('trace_sources', help='Trace data sources. Format: [file://]/path/to/file.', nargs='+', type=str)
|
||||||
|
parser.add_argument('elf_file', help='Path to program ELF file.', type=str)
|
||||||
|
parser.add_argument('--tmo', '-w', help='Data wait timeout in sec. -1: infinite, 0: no wait', type=int, default=0)
|
||||||
|
parser.add_argument('--dump-events', '-d', help='Dump all events.', action='store_true')
|
||||||
|
parser.add_argument('--print-events', '-p', help='Print events of selected types. By default only reports are printed', action='store_true')
|
||||||
|
parser.add_argument('--include-events', '-i', help='Events types to be included into report.', type=str, choices=['heap', 'log', 'all'], default='all')
|
||||||
|
parser.add_argument('--toolchain', '-t', help='Toolchain prefix.', type=str, default='xtensa-esp32-elf-')
|
||||||
|
parser.add_argument('--events-map', '-e', help='Events map file.', type=str, default=os.path.join(os.path.dirname(__file__), 'SYSVIEW_FreeRTOS.txt'))
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
def sig_int_handler(signum, frame):
|
||||||
|
reader.cleanup()
|
||||||
|
|
||||||
|
signal.signal(signal.SIGINT, sig_int_handler)
|
||||||
|
|
||||||
|
include_events = {'heap': False, 'log': False}
|
||||||
|
if args.include_events == 'all':
|
||||||
|
for k in include_events:
|
||||||
|
include_events[k] = True
|
||||||
|
elif args.include_events == 'heap':
|
||||||
|
include_events['heap'] = True
|
||||||
|
elif args.include_events == 'log':
|
||||||
|
include_events['log'] = True
|
||||||
|
|
||||||
|
# parse trace files
|
||||||
|
parsers = []
|
||||||
|
for i, trace_source in enumerate(args.trace_sources):
|
||||||
|
try:
|
||||||
|
parser = sysview.SysViewMultiTraceDataParser(print_events=False, core_id=i)
|
||||||
|
if include_events['heap']:
|
||||||
|
parser.add_stream_parser(sysview.SysViewTraceDataParser.STREAMID_HEAP,
|
||||||
|
sysview.SysViewHeapTraceDataParser(print_events=False, core_id=i))
|
||||||
|
if include_events['log']:
|
||||||
|
parser.add_stream_parser(sysview.SysViewTraceDataParser.STREAMID_LOG,
|
||||||
|
sysview.SysViewLogTraceDataParser(print_events=False, core_id=i))
|
||||||
|
parsers.append(parser)
|
||||||
|
except Exception as e:
|
||||||
|
print("Failed to create data parser ({})!".format(e))
|
||||||
|
traceback.print_exc()
|
||||||
|
sys.exit(2)
|
||||||
|
reader = apptrace.reader_create(trace_source, args.tmo)
|
||||||
|
if not reader:
|
||||||
|
print("Failed to create trace reader!")
|
||||||
|
sys.exit(2)
|
||||||
|
try:
|
||||||
|
print("Parse trace from '{}'...".format(trace_source))
|
||||||
|
sysview.parse_trace(reader, parser, args.events_map)
|
||||||
|
print("Parsing completed.")
|
||||||
|
except (apptrace.ReaderTimeoutError, apptrace.ReaderShutdownRequest) as e:
|
||||||
|
print("Stop parsing trace. ({})".format(e))
|
||||||
|
except Exception as e:
|
||||||
|
print("Failed to parse trace ({})!".format(e))
|
||||||
|
parser.cleanup()
|
||||||
|
traceback.print_exc()
|
||||||
|
sys.exit(2)
|
||||||
|
finally:
|
||||||
|
reader.cleanup()
|
||||||
|
|
||||||
|
# merge and process traces
|
||||||
|
try:
|
||||||
|
proc = sysview.SysViewMultiTraceDataProcessor(traces=parsers, print_events=args.dump_events)
|
||||||
|
if include_events['heap']:
|
||||||
|
proc.add_stream_processor(sysview.SysViewTraceDataParser.STREAMID_HEAP,
|
||||||
|
sysview.SysViewHeapTraceDataProcessor(args.toolchain, args.elf_file, print_heap_events=args.print_events))
|
||||||
|
if include_events['log']:
|
||||||
|
proc.add_stream_processor(sysview.SysViewTraceDataParser.STREAMID_LOG,
|
||||||
|
sysview.SysViewLogTraceDataProcessor(print_log_events=args.print_events))
|
||||||
|
except Exception as e:
|
||||||
|
print("Failed to create data processor ({})!".format(e))
|
||||||
|
traceback.print_exc()
|
||||||
|
sys.exit(2)
|
||||||
|
try:
|
||||||
|
print("Process events from '{}'...".format(args.trace_sources))
|
||||||
|
proc.merge_and_process()
|
||||||
|
print("Processing completed.")
|
||||||
|
except Exception as e:
|
||||||
|
print("Failed to process trace ({})!".format(e))
|
||||||
|
traceback.print_exc()
|
||||||
|
sys.exit(2)
|
||||||
|
finally:
|
||||||
|
proc.print_report()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
88
tools/esp_app_trace/test/sysview/blink.c
Normal file
88
tools/esp_app_trace/test/sysview/blink.c
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/* Blink Example
|
||||||
|
|
||||||
|
This example code is in the Public Domain (or CC0 licensed, at your option.)
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, this
|
||||||
|
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||||||
|
CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
#include "driver/gpio.h"
|
||||||
|
#include "sdkconfig.h"
|
||||||
|
#include "esp_heap_trace.h"
|
||||||
|
|
||||||
|
/* Can run 'make menuconfig' to choose the GPIO to blink,
|
||||||
|
or you can edit the following line and set a number here.
|
||||||
|
*/
|
||||||
|
#define BLINK_GPIO CONFIG_BLINK_GPIO
|
||||||
|
|
||||||
|
void blink_task2(void *pvParameter)
|
||||||
|
{
|
||||||
|
TaskHandle_t task = (TaskHandle_t)pvParameter;
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
if (xTaskNotifyWait(0, 0, NULL, portMAX_DELAY) != pdPASS) {
|
||||||
|
printf("Failed to wait for main task!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
void *a = malloc(65);
|
||||||
|
printf("Alloced 65 bytes @ %p\n", a);
|
||||||
|
void *b = malloc(97);
|
||||||
|
printf("Alloced 97 bytes @ %p\n", b);
|
||||||
|
free(a);
|
||||||
|
printf("Freed @ %p\n", a);
|
||||||
|
b = malloc(11);
|
||||||
|
printf("Alloced 11 bytes @ %p\n", b);
|
||||||
|
b = malloc(24);
|
||||||
|
printf("Alloced 24 bytes @ %p\n", b);
|
||||||
|
free(b);
|
||||||
|
printf("Freed @ %p\n", b);
|
||||||
|
if (xTaskNotify(task, 0, eNoAction) != pdPASS) {
|
||||||
|
printf("Failed to notify main task!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void blink_task(void *pvParameter)
|
||||||
|
{
|
||||||
|
TaskHandle_t task = 0;
|
||||||
|
|
||||||
|
if(heap_trace_init_tohost() != ESP_OK) {
|
||||||
|
printf("Failed to init heap trace!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
xTaskCreatePinnedToCore(&blink_task2, "blink_task2", 2048, xTaskGetCurrentTaskHandle(), 5, &task, 1);
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
heap_trace_start(HEAP_TRACE_ALL);
|
||||||
|
if (xTaskNotify(task, 0, eNoAction) != pdPASS) {
|
||||||
|
printf("Failed to notify slave task!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
void *a = malloc(64);
|
||||||
|
printf("Alloced 64 bytes @ %p\n", a);
|
||||||
|
void *b = malloc(96);
|
||||||
|
printf("Alloced 96 bytes @ %p\n", b);
|
||||||
|
free(a);
|
||||||
|
printf("Freed @ %p\n", a);
|
||||||
|
b = malloc(10);
|
||||||
|
printf("Alloced 10 bytes @ %p\n", b);
|
||||||
|
b = malloc(23);
|
||||||
|
printf("Alloced 23 bytes @ %p\n", b);
|
||||||
|
free(b);
|
||||||
|
printf("Freed @ %p\n", b);
|
||||||
|
if (xTaskNotifyWait(0, 0, NULL, portMAX_DELAY) != pdPASS) {
|
||||||
|
printf("Failed to wait for slave task!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
heap_trace_stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void app_main()
|
||||||
|
{
|
||||||
|
xTaskCreatePinnedToCore(&blink_task, "blink_task", 2048, NULL, 5, NULL, 0);
|
||||||
|
}
|
BIN
tools/esp_app_trace/test/sysview/cpu0.svdat
Normal file
BIN
tools/esp_app_trace/test/sysview/cpu0.svdat
Normal file
Binary file not shown.
BIN
tools/esp_app_trace/test/sysview/cpu1.svdat
Normal file
BIN
tools/esp_app_trace/test/sysview/cpu1.svdat
Normal file
Binary file not shown.
450
tools/esp_app_trace/test/sysview/expected_output
Normal file
450
tools/esp_app_trace/test/sysview/expected_output
Normal file
@ -0,0 +1,450 @@
|
|||||||
|
Parse trace from 'cpu0.svdat'...
|
||||||
|
Stop parsing trace. (Timeout 0.000000 sec while reading 1 bytes!)
|
||||||
|
Parse trace from 'cpu1.svdat'...
|
||||||
|
Stop parsing trace. (Timeout 0.000000 sec while reading 1 bytes!)
|
||||||
|
Process events from '['cpu0.svdat', 'cpu1.svdat']'...
|
||||||
|
EVENT[0]: 0.000000000 - core[0].svTraceStart(10), plen 0: []
|
||||||
|
EVENT[1]: 0.000000000 - core[1].svTraceStart(10), plen 0: []
|
||||||
|
EVENT[2]: 0.000010950 - core[0].svInit(24), plen 14: [sys_freq: 40000000, cpu_freq: 160000000, ram_base: 1061158912, id_shift: 0]
|
||||||
|
EVENT[3]: 0.000010950 - core[1].svInit(24), plen 14: [sys_freq: 40000000, cpu_freq: 160000000, ram_base: 1061158912, id_shift: 0]
|
||||||
|
EVENT[4]: 0.000024800 - core[0].svSysDesc(14), plen 0: [desc: N=FreeRTOS Application,D=ESP32,C=Xtensa,O=FreeRTOS]
|
||||||
|
EVENT[5]: 0.000024800 - core[1].svSysDesc(14), plen 0: [desc: N=FreeRTOS Application,D=ESP32,C=Xtensa,O=FreeRTOS]
|
||||||
|
EVENT[6]: 0.000051650 - core[0].svSysDesc(14), plen 0: [desc: I#5=SysTick]
|
||||||
|
EVENT[7]: 0.000051650 - core[1].svSysDesc(14), plen 0: [desc: I#5=SysTick]
|
||||||
|
EVENT[8]: 0.000104150 - core[0].svSysDesc(14), plen 0: [desc: I#6=WIFI_MAC]
|
||||||
|
EVENT[9]: 0.000104150 - core[1].svSysDesc(14), plen 0: [desc: I#6=WIFI_MAC]
|
||||||
|
EVENT[10]: 0.000121100 - core[0].svSysDesc(14), plen 0: [desc: I#7=WIFI_NMI]
|
||||||
|
EVENT[11]: 0.000121100 - core[1].svSysDesc(14), plen 0: [desc: I#7=WIFI_NMI]
|
||||||
|
EVENT[12]: 0.000138125 - core[0].svSysDesc(14), plen 0: [desc: I#8=WIFI_BB]
|
||||||
|
EVENT[13]: 0.000138125 - core[1].svSysDesc(14), plen 0: [desc: I#8=WIFI_BB]
|
||||||
|
EVENT[14]: 0.000154825 - core[0].svSysDesc(14), plen 0: [desc: I#9=BT_MAC]
|
||||||
|
EVENT[15]: 0.000154825 - core[1].svSysDesc(14), plen 0: [desc: I#9=BT_MAC]
|
||||||
|
EVENT[16]: 0.000193350 - core[0].svSysDesc(14), plen 0: [desc: I#10=BT_BB]
|
||||||
|
EVENT[17]: 0.000193350 - core[1].svSysDesc(14), plen 0: [desc: I#10=BT_BB]
|
||||||
|
EVENT[18]: 0.000212875 - core[0].svSysDesc(14), plen 0: [desc: I#11=BT_BB_NMI]
|
||||||
|
EVENT[19]: 0.000212875 - core[1].svSysDesc(14), plen 0: [desc: I#11=BT_BB_NMI]
|
||||||
|
EVENT[20]: 0.000231625 - core[0].svSysDesc(14), plen 0: [desc: I#12=RWBT]
|
||||||
|
EVENT[21]: 0.000231625 - core[1].svSysDesc(14), plen 0: [desc: I#12=RWBT]
|
||||||
|
EVENT[22]: 0.000250250 - core[0].svSysDesc(14), plen 0: [desc: I#13=RWBLE]
|
||||||
|
EVENT[23]: 0.000250250 - core[1].svSysDesc(14), plen 0: [desc: I#13=RWBLE]
|
||||||
|
EVENT[24]: 0.000269450 - core[0].svSysDesc(14), plen 0: [desc: I#14=RWBT_NMI]
|
||||||
|
EVENT[25]: 0.000269450 - core[1].svSysDesc(14), plen 0: [desc: I#14=RWBT_NMI]
|
||||||
|
EVENT[26]: 0.000288925 - core[0].svSysDesc(14), plen 0: [desc: I#15=RWBLE_NMI]
|
||||||
|
EVENT[27]: 0.000288925 - core[1].svSysDesc(14), plen 0: [desc: I#15=RWBLE_NMI]
|
||||||
|
EVENT[28]: 0.000310575 - core[0].svSysDesc(14), plen 0: [desc: I#16=SLC0]
|
||||||
|
EVENT[29]: 0.000310575 - core[1].svSysDesc(14), plen 0: [desc: I#16=SLC0]
|
||||||
|
EVENT[30]: 0.000329150 - core[0].svSysDesc(14), plen 0: [desc: I#17=SLC1]
|
||||||
|
EVENT[31]: 0.000329150 - core[1].svSysDesc(14), plen 0: [desc: I#17=SLC1]
|
||||||
|
EVENT[32]: 0.000347675 - core[0].svSysDesc(14), plen 0: [desc: I#18=UHCI0]
|
||||||
|
EVENT[33]: 0.000347675 - core[1].svSysDesc(14), plen 0: [desc: I#18=UHCI0]
|
||||||
|
EVENT[34]: 0.000366225 - core[0].svSysDesc(14), plen 0: [desc: I#19=UHCI1]
|
||||||
|
EVENT[35]: 0.000366225 - core[1].svSysDesc(14), plen 0: [desc: I#19=UHCI1]
|
||||||
|
EVENT[36]: 0.000386350 - core[0].svSysDesc(14), plen 0: [desc: I#20=TG0_T0_LEVEL]
|
||||||
|
EVENT[37]: 0.000386350 - core[1].svSysDesc(14), plen 0: [desc: I#20=TG0_T0_LEVEL]
|
||||||
|
EVENT[38]: 0.000406575 - core[0].svSysDesc(14), plen 0: [desc: I#21=TG0_T1_LEVEL]
|
||||||
|
EVENT[39]: 0.000406575 - core[1].svSysDesc(14), plen 0: [desc: I#21=TG0_T1_LEVEL]
|
||||||
|
EVENT[40]: 0.000427300 - core[0].svSysDesc(14), plen 0: [desc: I#22=TG0_WDT_LEVEL]
|
||||||
|
EVENT[41]: 0.000427300 - core[1].svSysDesc(14), plen 0: [desc: I#22=TG0_WDT_LEVEL]
|
||||||
|
EVENT[42]: 0.000448000 - core[0].svSysDesc(14), plen 0: [desc: I#23=TG0_LACT_LEVEL]
|
||||||
|
EVENT[43]: 0.000448000 - core[1].svSysDesc(14), plen 0: [desc: I#23=TG0_LACT_LEVEL]
|
||||||
|
EVENT[44]: 0.000468250 - core[0].svSysDesc(14), plen 0: [desc: I#24=TG1_T0_LEVEL]
|
||||||
|
EVENT[45]: 0.000468250 - core[1].svSysDesc(14), plen 0: [desc: I#24=TG1_T0_LEVEL]
|
||||||
|
EVENT[46]: 0.000488500 - core[0].svSysDesc(14), plen 0: [desc: I#25=TG1_T1_LEVEL]
|
||||||
|
EVENT[47]: 0.000488500 - core[1].svSysDesc(14), plen 0: [desc: I#25=TG1_T1_LEVEL]
|
||||||
|
EVENT[48]: 0.000508975 - core[0].svSysDesc(14), plen 0: [desc: I#26=TG1_WDT_LEVEL]
|
||||||
|
EVENT[49]: 0.000508975 - core[1].svSysDesc(14), plen 0: [desc: I#26=TG1_WDT_LEVEL]
|
||||||
|
EVENT[50]: 0.000529850 - core[0].svSysDesc(14), plen 0: [desc: I#27=TG1_LACT_LEVEL]
|
||||||
|
EVENT[51]: 0.000529850 - core[1].svSysDesc(14), plen 0: [desc: I#27=TG1_LACT_LEVEL]
|
||||||
|
EVENT[52]: 0.000548375 - core[0].svSysDesc(14), plen 0: [desc: I#28=GPIO]
|
||||||
|
EVENT[53]: 0.000548375 - core[1].svSysDesc(14), plen 0: [desc: I#28=GPIO]
|
||||||
|
EVENT[54]: 0.000570825 - core[0].svSysDesc(14), plen 0: [desc: I#29=GPIO_NMI]
|
||||||
|
EVENT[55]: 0.000570825 - core[1].svSysDesc(14), plen 0: [desc: I#29=GPIO_NMI]
|
||||||
|
EVENT[56]: 0.000590425 - core[0].svSysDesc(14), plen 0: [desc: I#30=FROM_CPU0]
|
||||||
|
EVENT[57]: 0.000590425 - core[1].svSysDesc(14), plen 0: [desc: I#30=FROM_CPU0]
|
||||||
|
EVENT[58]: 0.000610000 - core[0].svSysDesc(14), plen 0: [desc: I#31=FROM_CPU1]
|
||||||
|
EVENT[59]: 0.000610000 - core[1].svSysDesc(14), plen 0: [desc: I#31=FROM_CPU1]
|
||||||
|
EVENT[60]: 0.000629625 - core[0].svSysDesc(14), plen 0: [desc: I#32=FROM_CPU2]
|
||||||
|
EVENT[61]: 0.000629625 - core[1].svSysDesc(14), plen 0: [desc: I#32=FROM_CPU2]
|
||||||
|
EVENT[62]: 0.000649425 - core[0].svSysDesc(14), plen 0: [desc: I#33=FROM_CPU3]
|
||||||
|
EVENT[63]: 0.000649425 - core[1].svSysDesc(14), plen 0: [desc: I#33=FROM_CPU3]
|
||||||
|
EVENT[64]: 0.000667975 - core[0].svSysDesc(14), plen 0: [desc: I#34=SPI0]
|
||||||
|
EVENT[65]: 0.000667975 - core[1].svSysDesc(14), plen 0: [desc: I#34=SPI0]
|
||||||
|
EVENT[66]: 0.000686500 - core[0].svSysDesc(14), plen 0: [desc: I#35=SPI1]
|
||||||
|
EVENT[67]: 0.000686500 - core[1].svSysDesc(14), plen 0: [desc: I#35=SPI1]
|
||||||
|
EVENT[68]: 0.000704825 - core[0].svSysDesc(14), plen 0: [desc: I#36=SPI2]
|
||||||
|
EVENT[69]: 0.000704825 - core[1].svSysDesc(14), plen 0: [desc: I#36=SPI2]
|
||||||
|
EVENT[70]: 0.000723100 - core[0].svSysDesc(14), plen 0: [desc: I#37=SPI3]
|
||||||
|
EVENT[71]: 0.000723100 - core[1].svSysDesc(14), plen 0: [desc: I#37=SPI3]
|
||||||
|
EVENT[72]: 0.000741550 - core[0].svSysDesc(14), plen 0: [desc: I#38=I2S0]
|
||||||
|
EVENT[73]: 0.000741550 - core[1].svSysDesc(14), plen 0: [desc: I#38=I2S0]
|
||||||
|
EVENT[74]: 0.000760000 - core[0].svSysDesc(14), plen 0: [desc: I#39=I2S1]
|
||||||
|
EVENT[75]: 0.000760000 - core[1].svSysDesc(14), plen 0: [desc: I#39=I2S1]
|
||||||
|
EVENT[76]: 0.000778475 - core[0].svSysDesc(14), plen 0: [desc: I#40=UART0]
|
||||||
|
EVENT[77]: 0.000778475 - core[1].svSysDesc(14), plen 0: [desc: I#40=UART0]
|
||||||
|
EVENT[78]: 0.000797050 - core[0].svSysDesc(14), plen 0: [desc: I#41=UART1]
|
||||||
|
EVENT[79]: 0.000797050 - core[1].svSysDesc(14), plen 0: [desc: I#41=UART1]
|
||||||
|
EVENT[80]: 0.000815625 - core[0].svSysDesc(14), plen 0: [desc: I#42=UART2]
|
||||||
|
EVENT[81]: 0.000815625 - core[1].svSysDesc(14), plen 0: [desc: I#42=UART2]
|
||||||
|
EVENT[82]: 0.000835000 - core[0].svSysDesc(14), plen 0: [desc: I#43=SDIO_HOST]
|
||||||
|
EVENT[83]: 0.000835000 - core[1].svSysDesc(14), plen 0: [desc: I#43=SDIO_HOST]
|
||||||
|
EVENT[84]: 0.000854075 - core[0].svSysDesc(14), plen 0: [desc: I#44=ETH_MAC]
|
||||||
|
EVENT[85]: 0.000854075 - core[1].svSysDesc(14), plen 0: [desc: I#44=ETH_MAC]
|
||||||
|
EVENT[86]: 0.000875600 - core[0].svSysDesc(14), plen 0: [desc: I#45=PWM0]
|
||||||
|
EVENT[87]: 0.000875600 - core[1].svSysDesc(14), plen 0: [desc: I#45=PWM0]
|
||||||
|
EVENT[88]: 0.000893850 - core[0].svSysDesc(14), plen 0: [desc: I#46=PWM1]
|
||||||
|
EVENT[89]: 0.000893850 - core[1].svSysDesc(14), plen 0: [desc: I#46=PWM1]
|
||||||
|
EVENT[90]: 0.000912375 - core[0].svSysDesc(14), plen 0: [desc: I#47=PWM2]
|
||||||
|
EVENT[91]: 0.000912375 - core[1].svSysDesc(14), plen 0: [desc: I#47=PWM2]
|
||||||
|
EVENT[92]: 0.000930950 - core[0].svSysDesc(14), plen 0: [desc: I#48=PWM3]
|
||||||
|
EVENT[93]: 0.000930950 - core[1].svSysDesc(14), plen 0: [desc: I#48=PWM3]
|
||||||
|
EVENT[94]: 0.000949375 - core[0].svSysDesc(14), plen 0: [desc: I#49=LEDC]
|
||||||
|
EVENT[95]: 0.000949375 - core[1].svSysDesc(14), plen 0: [desc: I#49=LEDC]
|
||||||
|
EVENT[96]: 0.000968075 - core[0].svSysDesc(14), plen 0: [desc: I#50=EFUSE]
|
||||||
|
EVENT[97]: 0.000968075 - core[1].svSysDesc(14), plen 0: [desc: I#50=EFUSE]
|
||||||
|
EVENT[98]: 0.000986275 - core[0].svSysDesc(14), plen 0: [desc: I#51=CAN]
|
||||||
|
EVENT[99]: 0.000986275 - core[1].svSysDesc(14), plen 0: [desc: I#51=CAN]
|
||||||
|
EVENT[100]: 0.001005625 - core[0].svSysDesc(14), plen 0: [desc: I#52=RTC_CORE]
|
||||||
|
EVENT[101]: 0.001005625 - core[1].svSysDesc(14), plen 0: [desc: I#52=RTC_CORE]
|
||||||
|
EVENT[102]: 0.001023700 - core[0].svSysDesc(14), plen 0: [desc: I#53=RMT]
|
||||||
|
EVENT[103]: 0.001023700 - core[1].svSysDesc(14), plen 0: [desc: I#53=RMT]
|
||||||
|
EVENT[104]: 0.001042050 - core[0].svSysDesc(14), plen 0: [desc: I#54=PCNT]
|
||||||
|
EVENT[105]: 0.001042050 - core[1].svSysDesc(14), plen 0: [desc: I#54=PCNT]
|
||||||
|
EVENT[106]: 0.001061500 - core[0].svSysDesc(14), plen 0: [desc: I#55=I2C_EXT0]
|
||||||
|
EVENT[107]: 0.001061500 - core[1].svSysDesc(14), plen 0: [desc: I#55=I2C_EXT0]
|
||||||
|
EVENT[108]: 0.001081100 - core[0].svSysDesc(14), plen 0: [desc: I#56=I2C_EXT1]
|
||||||
|
EVENT[109]: 0.001081100 - core[1].svSysDesc(14), plen 0: [desc: I#56=I2C_EXT1]
|
||||||
|
EVENT[110]: 0.001099425 - core[0].svSysDesc(14), plen 0: [desc: I#57=RSA]
|
||||||
|
EVENT[111]: 0.001099425 - core[1].svSysDesc(14), plen 0: [desc: I#57=RSA]
|
||||||
|
EVENT[112]: 0.001118625 - core[0].svSysDesc(14), plen 0: [desc: I#58=SPI1_DMA]
|
||||||
|
EVENT[113]: 0.001118625 - core[1].svSysDesc(14), plen 0: [desc: I#58=SPI1_DMA]
|
||||||
|
EVENT[114]: 0.001137775 - core[0].svSysDesc(14), plen 0: [desc: I#59=SPI2_DMA]
|
||||||
|
EVENT[115]: 0.001137775 - core[1].svSysDesc(14), plen 0: [desc: I#59=SPI2_DMA]
|
||||||
|
EVENT[116]: 0.001156950 - core[0].svSysDesc(14), plen 0: [desc: I#60=SPI3_DMA]
|
||||||
|
EVENT[117]: 0.001156950 - core[1].svSysDesc(14), plen 0: [desc: I#60=SPI3_DMA]
|
||||||
|
EVENT[118]: 0.001175175 - core[0].svSysDesc(14), plen 0: [desc: I#61=WDT]
|
||||||
|
EVENT[119]: 0.001175175 - core[1].svSysDesc(14), plen 0: [desc: I#61=WDT]
|
||||||
|
EVENT[120]: 0.001197300 - core[0].svSysDesc(14), plen 0: [desc: I#62=TIMER1]
|
||||||
|
EVENT[121]: 0.001197300 - core[1].svSysDesc(14), plen 0: [desc: I#62=TIMER1]
|
||||||
|
EVENT[122]: 0.001216250 - core[0].svSysDesc(14), plen 0: [desc: I#63=TIMER2]
|
||||||
|
EVENT[123]: 0.001216250 - core[1].svSysDesc(14), plen 0: [desc: I#63=TIMER2]
|
||||||
|
EVENT[124]: 0.001236175 - core[0].svSysDesc(14), plen 0: [desc: I#64=TG0_T0_EDGE]
|
||||||
|
EVENT[125]: 0.001236175 - core[1].svSysDesc(14), plen 0: [desc: I#64=TG0_T0_EDGE]
|
||||||
|
EVENT[126]: 0.001256275 - core[0].svSysDesc(14), plen 0: [desc: I#65=TG0_T1_EDGE]
|
||||||
|
EVENT[127]: 0.001256275 - core[1].svSysDesc(14), plen 0: [desc: I#65=TG0_T1_EDGE]
|
||||||
|
EVENT[128]: 0.001276675 - core[0].svSysDesc(14), plen 0: [desc: I#66=TG0_WDT_EDGE]
|
||||||
|
EVENT[129]: 0.001276675 - core[1].svSysDesc(14), plen 0: [desc: I#66=TG0_WDT_EDGE]
|
||||||
|
EVENT[130]: 0.001297375 - core[0].svSysDesc(14), plen 0: [desc: I#67=TG0_LACT_EDGE]
|
||||||
|
EVENT[131]: 0.001297375 - core[1].svSysDesc(14), plen 0: [desc: I#67=TG0_LACT_EDGE]
|
||||||
|
EVENT[132]: 0.001317425 - core[0].svSysDesc(14), plen 0: [desc: I#68=TG1_T0_EDGE]
|
||||||
|
EVENT[133]: 0.001317425 - core[1].svSysDesc(14), plen 0: [desc: I#68=TG1_T0_EDGE]
|
||||||
|
EVENT[134]: 0.001337650 - core[0].svSysDesc(14), plen 0: [desc: I#69=TG1_T1_EDGE]
|
||||||
|
EVENT[135]: 0.001337650 - core[1].svSysDesc(14), plen 0: [desc: I#69=TG1_T1_EDGE]
|
||||||
|
EVENT[136]: 0.001357950 - core[0].svSysDesc(14), plen 0: [desc: I#70=TG1_WDT_EDGE]
|
||||||
|
EVENT[137]: 0.001357950 - core[1].svSysDesc(14), plen 0: [desc: I#70=TG1_WDT_EDGE]
|
||||||
|
EVENT[138]: 0.001378625 - core[0].svSysDesc(14), plen 0: [desc: I#71=TG1_LACT_EDGE]
|
||||||
|
EVENT[139]: 0.001378625 - core[1].svSysDesc(14), plen 0: [desc: I#71=TG1_LACT_EDGE]
|
||||||
|
EVENT[140]: 0.001397500 - core[0].svSysDesc(14), plen 0: [desc: I#72=MMU_IA]
|
||||||
|
EVENT[141]: 0.001397500 - core[1].svSysDesc(14), plen 0: [desc: I#72=MMU_IA]
|
||||||
|
EVENT[142]: 0.001416425 - core[0].svSysDesc(14), plen 0: [desc: I#73=MPU_IA]
|
||||||
|
EVENT[143]: 0.001416425 - core[1].svSysDesc(14), plen 0: [desc: I#73=MPU_IA]
|
||||||
|
EVENT[144]: 0.001435550 - core[0].svSysDesc(14), plen 0: [desc: I#74=CACHE_IA]
|
||||||
|
EVENT[145]: 0.001435550 - core[1].svSysDesc(14), plen 0: [desc: I#74=CACHE_IA]
|
||||||
|
EVENT[146]: 0.001441950 - core[0].svSysTimeUs(13), plen 0: [time: 10000]
|
||||||
|
EVENT[147]: 0.001441950 - core[1].svSysTimeUs(13), plen 0: [time: 10000]
|
||||||
|
EVENT[148]: 0.001647400 - core[0].svTaskInfo(9), plen 0: [tid: 12253880, prio: 22, name: esp_timer]
|
||||||
|
EVENT[149]: 0.001647400 - core[1].svTaskInfo(9), plen 0: [tid: 12253880, prio: 22, name: esp_timer]
|
||||||
|
EVENT[150]: 0.001652000 - core[0].svStackInfo(21), plen 0: [tid: 12253880, base: 1073408692, sz: 3436, unused: 0]
|
||||||
|
EVENT[151]: 0.001652000 - core[1].svStackInfo(21), plen 0: [tid: 12253880, base: 1073408692, sz: 3436, unused: 0]
|
||||||
|
EVENT[152]: 0.001738550 - core[0].svTaskInfo(9), plen 0: [tid: 12254636, prio: 24, name: ipc0]
|
||||||
|
EVENT[153]: 0.001738550 - core[1].svTaskInfo(9), plen 0: [tid: 12254636, prio: 24, name: ipc0]
|
||||||
|
EVENT[154]: 0.001742750 - core[0].svStackInfo(21), plen 0: [tid: 12254636, base: 1073430180, sz: 1388, unused: 0]
|
||||||
|
EVENT[155]: 0.001742750 - core[1].svStackInfo(21), plen 0: [tid: 12254636, base: 1073430180, sz: 1388, unused: 0]
|
||||||
|
EVENT[156]: 0.001828975 - core[0].svTaskInfo(9), plen 0: [tid: 12275372, prio: 24, name: ipc1]
|
||||||
|
EVENT[157]: 0.001828975 - core[1].svTaskInfo(9), plen 0: [tid: 12275372, prio: 24, name: ipc1]
|
||||||
|
EVENT[158]: 0.001833225 - core[0].svStackInfo(21), plen 0: [tid: 12275372, base: 1073432232, sz: 1384, unused: 0]
|
||||||
|
EVENT[159]: 0.001833225 - core[1].svStackInfo(21), plen 0: [tid: 12275372, base: 1073432232, sz: 1384, unused: 0]
|
||||||
|
EVENT[160]: 0.001871225 - core[0].svTaskInfo(9), plen 0: [tid: 12291908, prio: 5, name: blink_task]
|
||||||
|
EVENT[161]: 0.001871225 - core[1].svTaskInfo(9), plen 0: [tid: 12291908, prio: 5, name: blink_task]
|
||||||
|
EVENT[162]: 0.001875650 - core[0].svStackInfo(21), plen 0: [tid: 12291908, base: 1073448452, sz: 524, unused: 0]
|
||||||
|
EVENT[163]: 0.001875650 - core[1].svStackInfo(21), plen 0: [tid: 12291908, base: 1073448452, sz: 524, unused: 0]
|
||||||
|
EVENT[164]: 0.002070800 - core[0].svTaskInfo(9), plen 0: [tid: 12282660, prio: 1, name: main]
|
||||||
|
EVENT[165]: 0.002070800 - core[1].svTaskInfo(9), plen 0: [tid: 12282660, prio: 1, name: main]
|
||||||
|
EVENT[166]: 0.002075200 - core[0].svStackInfo(21), plen 0: [tid: 12282660, base: 1073437472, sz: 3296, unused: 0]
|
||||||
|
EVENT[167]: 0.002075200 - core[1].svStackInfo(21), plen 0: [tid: 12282660, base: 1073437472, sz: 3296, unused: 0]
|
||||||
|
EVENT[168]: 0.002153375 - core[0].svTaskInfo(9), plen 0: [tid: 12284560, prio: 0, name: IDLE0]
|
||||||
|
EVENT[169]: 0.002153375 - core[1].svTaskInfo(9), plen 0: [tid: 12284560, prio: 0, name: IDLE0]
|
||||||
|
EVENT[170]: 0.002157850 - core[0].svStackInfo(21), plen 0: [tid: 12284560, base: 1073441932, sz: 1236, unused: 0]
|
||||||
|
EVENT[171]: 0.002157850 - core[1].svStackInfo(21), plen 0: [tid: 12284560, base: 1073441932, sz: 1236, unused: 0]
|
||||||
|
EVENT[172]: 0.002228950 - core[0].svTaskInfo(9), plen 0: [tid: 12286460, prio: 0, name: IDLE1]
|
||||||
|
EVENT[173]: 0.002228950 - core[1].svTaskInfo(9), plen 0: [tid: 12286460, prio: 0, name: IDLE1]
|
||||||
|
EVENT[174]: 0.002233250 - core[0].svStackInfo(21), plen 0: [tid: 12286460, base: 1073443832, sz: 1112, unused: 0]
|
||||||
|
EVENT[175]: 0.002233250 - core[1].svStackInfo(21), plen 0: [tid: 12286460, base: 1073443832, sz: 1112, unused: 0]
|
||||||
|
EVENT[176]: 0.002319675 - core[0].svTaskInfo(9), plen 0: [tid: 12289116, prio: 1, name: Tmr Svc]
|
||||||
|
EVENT[177]: 0.002319675 - core[1].svTaskInfo(9), plen 0: [tid: 12289116, prio: 1, name: Tmr Svc]
|
||||||
|
EVENT[178]: 0.002324100 - core[0].svStackInfo(21), plen 0: [tid: 12289116, base: 1073445976, sz: 1384, unused: 0]
|
||||||
|
EVENT[179]: 0.002324100 - core[1].svStackInfo(21), plen 0: [tid: 12289116, base: 1073445976, sz: 1384, unused: 0]
|
||||||
|
EVENT[180]: 0.002431200 - core[0].svTaskInfo(9), plen 0: [tid: 12294320, prio: 5, name: blink_task2]
|
||||||
|
EVENT[181]: 0.002431200 - core[1].svTaskInfo(9), plen 0: [tid: 12294320, prio: 5, name: blink_task2]
|
||||||
|
EVENT[182]: 0.002438750 - core[0].svStackInfo(21), plen 0: [tid: 12294320, base: 1073451180, sz: 1748, unused: 0]
|
||||||
|
EVENT[183]: 0.002438750 - core[1].svStackInfo(21), plen 0: [tid: 12294320, base: 1073451180, sz: 1748, unused: 0]
|
||||||
|
EVENT[184]: 0.002446150 - core[0].svNumModules(27), plen 1: [mod_cnt: 0]
|
||||||
|
EVENT[185]: 0.002446150 - core[1].svNumModules(27), plen 1: [mod_cnt: 0]
|
||||||
|
EVENT[186]: 0.002484225 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[187]: 0.002496125 - core[0].svTaskStopReady(7), plen 0: [tid: 12291908, cause: 4]
|
||||||
|
EVENT[188]: 0.002508025 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320]
|
||||||
|
EVENT[189]: 0.002516350 - core[0].svIsrEnter(2), plen 0: [irq_num: 30]
|
||||||
|
EVENT[190]: 0.002524325 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27]
|
||||||
|
EVENT[191]: 0.002532350 - core[0].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[192]: 0.002541200 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[193]: 0.002548475 - core[0].svTaskStartExec(4), plen 0: [tid: 12282660]
|
||||||
|
EVENT[194]: 0.002556375 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[195]: 0.002564450 - core[0].vTaskDelete(33), plen 4: [xTaskToDelete: 12282660]
|
||||||
|
EVENT[196]: 0.002577700 - core[1].svIdle(17), plen 0: []
|
||||||
|
EVENT[197]: 0.002585225 - core[0].svIsrEnter(2), plen 0: [irq_num: 30]
|
||||||
|
EVENT[198]: 0.002592950 - core[0].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[199]: 0.002605950 - core[0].svIdle(17), plen 0: []
|
||||||
|
EVENT[200]: 0.008819550 - core[0].svIsrEnter(2), plen 0: [irq_num: 5]
|
||||||
|
EVENT[201]: 0.008828075 - core[0].svTaskStartReady(6), plen 0: [tid: 12291908]
|
||||||
|
EVENT[202]: 0.008828075 - core[1].svTaskStartReady(6), plen 0: [tid: 12291908]
|
||||||
|
EVENT[203]: 0.008837475 - core[0].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[204]: 0.008850450 - core[0].svTaskStartExec(4), plen 0: [tid: 12291908]
|
||||||
|
EVENT[205]: 0.008872650 - core[0].svModuleDesc(22), plen 0: [mod_id: 0, evt_off: 512, desc: ESP32 SystemView Heap Tracing Module]
|
||||||
|
EVENT[206]: 0.008872650 - core[1].svModuleDesc(22), plen 0: [mod_id: 0, evt_off: 512, desc: ESP32 SystemView Heap Tracing Module]
|
||||||
|
EVENT[207]: 0.008886175 - core[0].svTaskStartReady(6), plen 0: [tid: 12294320]
|
||||||
|
EVENT[208]: 0.008886175 - core[1].svTaskStartReady(6), plen 0: [tid: 12294320]
|
||||||
|
EVENT[209]: 0.008897425 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[210]: 0.008906150 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[211]: 0.008919900 - core[0].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073450504, size: 64, callers: [1074601571, 1074296884]]
|
||||||
|
[0.008919900] HEAP: Allocated 64 bytes @ 0x3ffb8e08 from task "blink_task" on core 0 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:65
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
EVENT[212]: 0.008928250 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320]
|
||||||
|
EVENT[213]: 0.008957950 - core[0].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073450572, size: 80, callers: [1074298654, 1074299267]]
|
||||||
|
[0.008957950] HEAP: Allocated 80 bytes @ 0x3ffb8e4c from task "blink_task" on core 0 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037
|
||||||
|
|
||||||
|
EVENT[214]: 0.008967250 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 1, uxItemSize: 0, ucQueueType: 4]
|
||||||
|
EVENT[215]: 0.008977300 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[216]: 0.008984625 - core[1].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073450656, size: 65, callers: [1074601382, 1074296884]]
|
||||||
|
[0.008984625] HEAP: Allocated 65 bytes @ 0x3ffb8ea0 from task "blink_task2" on core 1 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:30
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
EVENT[217]: 0.008995725 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[218]: 0.009010075 - core[1].svIsrEnter(2), plen 0: [irq_num: 5]
|
||||||
|
EVENT[219]: 0.009018025 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[220]: 0.009031900 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320]
|
||||||
|
EVENT[221]: 0.009089600 - core[0].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073434644, size: 80, callers: [1074298654, 1074299267]]
|
||||||
|
[0.009089600] HEAP: Allocated 80 bytes @ 0x3ffb5014 from task "blink_task" on core 0 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037
|
||||||
|
|
||||||
|
EVENT[222]: 0.009098175 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27]
|
||||||
|
EVENT[223]: 0.009106300 - core[0].xQueueGenericCreate(47), plen 3: [uxQueueLength: 1, uxItemSize: 0, ucQueueType: 4]
|
||||||
|
EVENT[224]: 0.009113825 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[225]: 0.009121600 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[226]: 0.009129000 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[227]: 0.009137900 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[228]: 0.009145425 - core[1].svIdle(17), plen 0: []
|
||||||
|
EVENT[229]: 0.009169600 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[230]: 0.009185225 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[231]: 0.009195125 - core[0].svTaskStartReady(6), plen 0: [tid: 12294320]
|
||||||
|
EVENT[232]: 0.009195125 - core[1].svTaskStartReady(6), plen 0: [tid: 12294320]
|
||||||
|
EVENT[233]: 0.009207000 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[234]: 0.009215575 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[235]: 0.009223275 - core[0].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073434728, size: 96, callers: [1074601587, 1074296884]]
|
||||||
|
[0.009223275] HEAP: Allocated 96 bytes @ 0x3ffb5068 from task "blink_task" on core 0 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:68
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
EVENT[236]: 0.009231050 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320]
|
||||||
|
EVENT[237]: 0.009241875 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[238]: 0.009257225 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27]
|
||||||
|
EVENT[239]: 0.009269200 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[240]: 0.009278275 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[241]: 0.009286275 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[242]: 0.009303450 - core[1].svIdle(17), plen 0: []
|
||||||
|
EVENT[243]: 0.009310950 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[244]: 0.009329625 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[245]: 0.009339525 - core[0].svTaskStartReady(6), plen 0: [tid: 12294320]
|
||||||
|
EVENT[246]: 0.009339525 - core[1].svTaskStartReady(6), plen 0: [tid: 12294320]
|
||||||
|
EVENT[247]: 0.009351425 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[248]: 0.009359450 - core[0].esp_sysview_heap_trace_free(513), plen 15: [addr: 1073450504, callers: [1074601600, 1074296884]]
|
||||||
|
[0.009359450] HEAP: Freed bytes @ 0x3ffb8e08 from task "blink_task" on core 0 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:70
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
EVENT[249]: 0.009367800 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[250]: 0.009378950 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[251]: 0.009387450 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320]
|
||||||
|
EVENT[252]: 0.009402575 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27]
|
||||||
|
EVENT[253]: 0.009414900 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[254]: 0.009423125 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[255]: 0.009430250 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[256]: 0.009445425 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[257]: 0.009453075 - core[1].svIdle(17), plen 0: []
|
||||||
|
EVENT[258]: 0.009469225 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[259]: 0.009479025 - core[0].svTaskStartReady(6), plen 0: [tid: 12294320]
|
||||||
|
EVENT[260]: 0.009479025 - core[1].svTaskStartReady(6), plen 0: [tid: 12294320]
|
||||||
|
EVENT[261]: 0.009490950 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[262]: 0.009499475 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[263]: 0.009507600 - core[0].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073450504, size: 10, callers: [1074601615, 1074296884]]
|
||||||
|
[0.009507600] HEAP: Allocated 10 bytes @ 0x3ffb8e08 from task "blink_task" on core 0 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:72
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
EVENT[264]: 0.009515300 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320]
|
||||||
|
EVENT[265]: 0.009526100 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[266]: 0.009541550 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27]
|
||||||
|
EVENT[267]: 0.009553850 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[268]: 0.009561100 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[269]: 0.009568400 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[270]: 0.009585075 - core[1].svIdle(17), plen 0: []
|
||||||
|
EVENT[271]: 0.009593375 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[272]: 0.009609150 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[273]: 0.009621875 - core[0].svTaskStartReady(6), plen 0: [tid: 12294320]
|
||||||
|
EVENT[274]: 0.009621875 - core[1].svTaskStartReady(6), plen 0: [tid: 12294320]
|
||||||
|
EVENT[275]: 0.009633775 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[276]: 0.009642300 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[277]: 0.009649475 - core[0].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073450520, size: 23, callers: [1074601628, 1074296884]]
|
||||||
|
[0.009649475] HEAP: Allocated 23 bytes @ 0x3ffb8e18 from task "blink_task" on core 0 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:73
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
EVENT[278]: 0.009657875 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320]
|
||||||
|
EVENT[279]: 0.009666025 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[280]: 0.009681500 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27]
|
||||||
|
EVENT[281]: 0.009693375 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[282]: 0.009702800 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[283]: 0.009710550 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[284]: 0.009726725 - core[1].svIdle(17), plen 0: []
|
||||||
|
EVENT[285]: 0.010504825 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[286]: 0.010520650 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[287]: 0.010530550 - core[0].svTaskStartReady(6), plen 0: [tid: 12294320]
|
||||||
|
EVENT[288]: 0.010530550 - core[1].svTaskStartReady(6), plen 0: [tid: 12294320]
|
||||||
|
EVENT[289]: 0.010542400 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[290]: 0.010550025 - core[0].esp_sysview_heap_trace_free(513), plen 15: [addr: 1073450520, callers: [1074601643, 1074296884]]
|
||||||
|
[0.010550025] HEAP: Freed bytes @ 0x3ffb8e18 from task "blink_task" on core 0 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:76
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
EVENT[291]: 0.010557450 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[292]: 0.010569700 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[293]: 0.010577700 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320]
|
||||||
|
EVENT[294]: 0.010592825 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27]
|
||||||
|
EVENT[295]: 0.010605950 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[296]: 0.010613575 - core[0].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[297]: 0.010620900 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[298]: 0.010637050 - core[1].svIdle(17), plen 0: []
|
||||||
|
EVENT[299]: 0.012240950 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[300]: 0.012256775 - core[0].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[301]: 0.012266650 - core[0].svTaskStartReady(6), plen 0: [tid: 12294320]
|
||||||
|
EVENT[302]: 0.012266650 - core[1].svTaskStartReady(6), plen 0: [tid: 12294320]
|
||||||
|
EVENT[303]: 0.012281350 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[304]: 0.012289475 - core[0].svTaskStopReady(7), plen 0: [tid: 12291908, cause: 27]
|
||||||
|
EVENT[305]: 0.012297450 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[306]: 0.012306350 - core[0].svIsrEnter(2), plen 0: [irq_num: 30]
|
||||||
|
EVENT[307]: 0.012312875 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320]
|
||||||
|
EVENT[308]: 0.012320700 - core[0].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[309]: 0.012328950 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[310]: 0.012338100 - core[0].svIdle(17), plen 0: []
|
||||||
|
EVENT[311]: 0.012640475 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[312]: 0.014931850 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[313]: 0.014963325 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[314]: 0.014984150 - core[1].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073434828, size: 97, callers: [1074601399, 1074296884]]
|
||||||
|
[0.014984150] HEAP: Allocated 97 bytes @ 0x3ffb50cc from task "blink_task2" on core 1 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:33
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
EVENT[315]: 0.014997400 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[316]: 0.015031050 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[317]: 0.017622800 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[318]: 0.017638675 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[319]: 0.017656375 - core[1].esp_sysview_heap_trace_free(513), plen 15: [addr: 1073450656, callers: [1074601412, 1074296884]]
|
||||||
|
[0.017656375] HEAP: Freed bytes @ 0x3ffb8ea0 from task "blink_task2" on core 1 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:35
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
EVENT[320]: 0.017674025 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[321]: 0.017701700 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[322]: 0.018819550 - core[0].svIsrEnter(2), plen 0: [irq_num: 5]
|
||||||
|
EVENT[323]: 0.018829625 - core[0].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[324]: 0.018844750 - core[0].svIdle(17), plen 0: []
|
||||||
|
EVENT[325]: 0.019010075 - core[1].svIsrEnter(2), plen 0: [irq_num: 5]
|
||||||
|
EVENT[326]: 0.019017950 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[327]: 0.019033200 - core[1].svTaskStartExec(4), plen 0: [tid: 12294320]
|
||||||
|
EVENT[328]: 0.019358925 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[329]: 0.019374600 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[330]: 0.019395425 - core[1].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073450520, size: 11, callers: [1074601427, 1074296884]]
|
||||||
|
[0.019395425] HEAP: Allocated 11 bytes @ 0x3ffb8e18 from task "blink_task2" on core 1 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:37
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
EVENT[331]: 0.019412600 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[332]: 0.019446250 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[333]: 0.022049900 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[334]: 0.022065775 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[335]: 0.022086625 - core[1].esp_sysview_heap_trace_alloc(512), plen 16: [addr: 1073450536, size: 24, callers: [1074601440, 1074296884]]
|
||||||
|
[0.022086625] HEAP: Allocated 24 bytes @ 0x3ffb8e28 from task "blink_task2" on core 1 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:38
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
EVENT[336]: 0.022103925 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[337]: 0.022137550 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[338]: 0.024740850 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[339]: 0.024756725 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[340]: 0.024770475 - core[1].esp_sysview_heap_trace_free(513), plen 15: [addr: 1073450536, callers: [1074601455, 1074296884]]
|
||||||
|
[0.024770475] HEAP: Freed bytes @ 0x3ffb8e28 from task "blink_task2" on core 1 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:41
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
EVENT[341]: 0.024791750 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12291660, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[342]: 0.024819500 - core[1].xQueueGenericReceive(49), plen 15: [xQueue: 12275732, pvBuffer: 3233808384, xTicksToWait: 4294967295, xJustPeek: 0]
|
||||||
|
EVENT[343]: 0.026476950 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12275732, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[344]: 0.026495700 - core[1].xQueueGenericSend(53), plen 7: [xQueue: 12291660, pvItemToQueue: 0, xTicksToWait: 0, xCopyPosition: 0]
|
||||||
|
EVENT[345]: 0.026506975 - core[0].svTaskStartReady(6), plen 0: [tid: 12291908]
|
||||||
|
EVENT[346]: 0.026506975 - core[1].svTaskStartReady(6), plen 0: [tid: 12291908]
|
||||||
|
EVENT[347]: 0.026518525 - core[1].svTaskStopReady(7), plen 0: [tid: 12294320, cause: 27]
|
||||||
|
EVENT[348]: 0.026526625 - core[0].svIsrEnter(2), plen 0: [irq_num: 30]
|
||||||
|
EVENT[349]: 0.026535575 - core[0].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[350]: 0.026544075 - core[1].svIsrEnter(2), plen 0: [irq_num: 31]
|
||||||
|
EVENT[351]: 0.026551650 - core[0].svTaskStartExec(4), plen 0: [tid: 12291908]
|
||||||
|
EVENT[352]: 0.026559500 - core[1].svExitIsrToScheduler(18), plen 0: []
|
||||||
|
EVENT[353]: 0.148816725 - core[1].svIdle(17), plen 0: []
|
||||||
|
EVENT[354]: 0.148825750 - core[0].vTaskDelay(34), plen 1: [xTicksToDelay: 1]
|
||||||
|
EVENT[355]: 0.148833200 - core[0].svTaskStopReady(7), plen 0: [tid: 12291908, cause: 4]
|
||||||
|
EVENT[356]: 0.148839250 - core[0].svTraceStop(11), plen 0: []
|
||||||
|
EVENT[357]: 0.148839250 - core[1].svTraceStop(11), plen 0: []
|
||||||
|
Processing completed.
|
||||||
|
Processed 358 events
|
||||||
|
=============== LOG TRACE REPORT ===============
|
||||||
|
Processed 0 log messages.
|
||||||
|
=============== HEAP TRACE REPORT ===============
|
||||||
|
Processed 14 heap events.
|
||||||
|
[0.008957950] HEAP: Allocated 80 bytes @ 0x3ffb8e4c from task "blink_task" on core 0 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037
|
||||||
|
|
||||||
|
[0.009089600] HEAP: Allocated 80 bytes @ 0x3ffb5014 from task "blink_task" on core 0 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/queue.c:2037
|
||||||
|
|
||||||
|
[0.009223275] HEAP: Allocated 96 bytes @ 0x3ffb5068 from task "blink_task" on core 0 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:68
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
[0.009507600] HEAP: Allocated 10 bytes @ 0x3ffb8e08 from task "blink_task" on core 0 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:72
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
[0.014984150] HEAP: Allocated 97 bytes @ 0x3ffb50cc from task "blink_task2" on core 1 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:33
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
[0.019395425] HEAP: Allocated 11 bytes @ 0x3ffb8e18 from task "blink_task2" on core 1 by:
|
||||||
|
/home/alexey/projects/esp/esp-idf/examples/get-started/blink/main/blink.c:37
|
||||||
|
/home/alexey/projects/esp/esp-idf/components/freertos/port.c:355 (discriminator 1)
|
||||||
|
|
||||||
|
Found 374 leaked bytes in 6 blocks.
|
19
tools/esp_app_trace/test/sysview/gdbinit
Normal file
19
tools/esp_app_trace/test/sysview/gdbinit
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
target remote :3333
|
||||||
|
|
||||||
|
mon reset halt
|
||||||
|
flushregs
|
||||||
|
|
||||||
|
b heap_trace_start
|
||||||
|
commands
|
||||||
|
clear heap_trace_start
|
||||||
|
mon esp32 sysview start file://cpu0.svdat file://cpu1.svdat
|
||||||
|
c
|
||||||
|
end
|
||||||
|
|
||||||
|
b heap_trace_stop
|
||||||
|
commands
|
||||||
|
clear heap_trace_stop
|
||||||
|
mon esp32 sysview stop
|
||||||
|
end
|
||||||
|
|
||||||
|
c
|
BIN
tools/esp_app_trace/test/sysview/test.elf
Normal file
BIN
tools/esp_app_trace/test/sysview/test.elf
Normal file
Binary file not shown.
8
tools/esp_app_trace/test/sysview/test.sh
Executable file
8
tools/esp_app_trace/test/sysview/test.sh
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
{ coverage debug sys \
|
||||||
|
&& coverage erase &> output \
|
||||||
|
&& coverage run -a $IDF_PATH/tools/esp_app_trace/sysviewtrace_proc.py -d -p cpu0.svdat cpu1.svdat test.elf &>> output \
|
||||||
|
&& diff output expected_output \
|
||||||
|
&& coverage report \
|
||||||
|
; } || { echo 'The test for sysviewtrace_proc has failed. Please examine the artifacts.' ; exit 1; }
|
Loading…
x
Reference in New Issue
Block a user