mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -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,
|
||||
examples/provisioning/custom_config/components/custom_provisioning/python/custom_config_pb2.py,
|
||||
# temporary list (should be empty)
|
||||
tools/esp_app_trace/pylibelf,
|
||||
tools/mass_mfg/mfg_gen.py,
|
||||
|
@ -643,6 +643,18 @@ test_espcoredump:
|
||||
- cd components/espcoredump/test/
|
||||
- ${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:
|
||||
stage: deploy
|
||||
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::
|
||||
|
||||
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::
|
||||
|
||||
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::
|
||||
|
||||
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::
|
||||
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::
|
||||
|
||||
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::
|
||||
|
||||
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::
|
||||
|
||||
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::
|
||||
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::
|
||||
|
||||
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::
|
||||
|
||||
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::
|
||||
|
||||
|
@ -14,11 +14,11 @@ To compile with ESP-IDF you need to get the following packages:
|
||||
|
||||
- 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::
|
||||
|
||||
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::
|
||||
|
||||
|
@ -15,15 +15,15 @@
|
||||
|
||||
- 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::
|
||||
|
||||
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::
|
||||
|
||||
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::
|
||||
使用 ESP-IDF 需要 CMake 3.5 或以上版本。较早版本的 Linux 可能需要升级才能向后移植仓库,或安装 "cmake3" 软件包,而不是安装 "cmake"。
|
||||
|
@ -13,15 +13,15 @@ Linux 平台工具链的标准设置 (CMake)
|
||||
|
||||
- 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::
|
||||
|
||||
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::
|
||||
|
||||
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::
|
||||
使用 ESP-IDF 需要 CMake 3.5 或以上版本。较早版本的 Linux 可能需要升级才能向后移植仓库,或安装 "cmake3" 软件包,而不是安装 "cmake"。
|
||||
|
@ -4,7 +4,7 @@
|
||||
:link_to_translation:`en:[English]`
|
||||
|
||||
.. note::
|
||||
|
||||
|
||||
安装工具链的标准流程可以通过阅读文档 :doc:`Linux 平台工具链的标准设置 <linux-setup>` 来获得,:ref:`工具链的自定义设置 <get-started-customized-setup>` 章节会介绍哪些情况下我们必须要重新定义工具链。
|
||||
|
||||
|
||||
@ -15,11 +15,11 @@
|
||||
|
||||
- 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::
|
||||
|
||||
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::
|
||||
|
||||
|
@ -12,15 +12,15 @@ Linux 平台工具链的标准设置
|
||||
|
||||
- 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::
|
||||
|
||||
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::
|
||||
|
||||
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::
|
||||
|
||||
@ -52,7 +52,7 @@ Linux 版的 ESP32 工具链可以从 Espressif 的网站下载:
|
||||
|
||||
.. include:: /_build/inc/unpack-code-linux32.inc
|
||||
|
||||
.. _setup-linux-toolchain-add-it-to-path:
|
||||
.. _setup-linux-toolchain-add-it-to-path:
|
||||
|
||||
2. 工具链将会被解压到 ``~/esp/xtensa-esp32-elf/`` 目录。
|
||||
|
||||
@ -67,9 +67,9 @@ Linux 版的 ESP32 工具链可以从 Espressif 的网站下载:
|
||||
然后,当你需要使用工具链时,在命令行输入 ``get_esp32``,然后工具链会自动添加到你的 ``PATH`` 中。
|
||||
|
||||
.. note::
|
||||
|
||||
|
||||
如果将 ``/bin/bash`` 设置为登录 shell,且同时存在 ``.bash_profile`` 和 ``.profile``,则更新 ``.bash_profile`` 。在 CentOS 环境下, ``alias`` 需要添加到 ``.bashrc`` 文件中。
|
||||
|
||||
|
||||
3. 退出并重新登录以使 ``.profile`` 更改生效。 运行以下命令来检查 ``PATH`` 设置是否正确: ::
|
||||
|
||||
printenv PATH
|
||||
|
@ -8,4 +8,5 @@ setuptools
|
||||
pyserial>=3.0
|
||||
future>=0.15.2
|
||||
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/cmake/convert_to_cmake.py
|
||||
tools/cmake/run_cmake_lint.sh
|
||||
tools/esp_app_trace/apptrace_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/gen_esp_err_to_name.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 struct
|
||||
import sys
|
||||
import pylibelf as elf
|
||||
import pylibelf.util as elfutil
|
||||
import pylibelf.iterators as elfiter
|
||||
import pylibelf.constants as elfconst
|
||||
import elftools.elf.elffile as elffile
|
||||
import ctypes
|
||||
import espytrace.apptrace as apptrace
|
||||
|
||||
|
||||
class ESPLogTraceParserError(RuntimeError):
|
||||
@ -77,34 +75,14 @@ def logtrace_parse(fname):
|
||||
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):
|
||||
try:
|
||||
felf = elfutil.open_elf(elfname)
|
||||
felf = elffile.ELFFile(open(elfname, 'rb'))
|
||||
except OSError as e:
|
||||
raise ESPLogTraceParserError("Failed to open ELF file (%s)!" % e)
|
||||
|
||||
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
|
||||
prcnt_idx = 0
|
||||
while i < len(lrec.args):
|
||||
@ -114,7 +92,7 @@ def logtrace_formated_print(recs, elfname, no_err):
|
||||
prcnt_idx += 1 # goto next char
|
||||
if fmt_str[prcnt_idx] == 's':
|
||||
# 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:
|
||||
lrec.args[i] = arg_str
|
||||
i += 1
|
||||
@ -129,8 +107,7 @@ def logtrace_formated_print(recs, elfname, no_err):
|
||||
if not no_err:
|
||||
print("Print error (%s)" % e)
|
||||
print("\nFmt = {%s}, args = %d/%s" % (fmt_str, len(lrec.args), lrec.args))
|
||||
|
||||
elf.elf_end(felf)
|
||||
felf.stream.close()
|
||||
|
||||
|
||||
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…
Reference in New Issue
Block a user