<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://docs.bouffalolab.com/index.php?action=history&amp;feed=atom&amp;title=Debug%3Acoredump</id>
	<title>Debug:coredump - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://docs.bouffalolab.com/index.php?action=history&amp;feed=atom&amp;title=Debug%3Acoredump"/>
	<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Debug:coredump&amp;action=history"/>
	<updated>2026-07-14T03:15:04Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=Debug:coredump&amp;diff=308&amp;oldid=prev</id>
		<title>王扬搏：​创建页面，内容为“  1. 在CPU触发异常时，会把当前的内存中的数据dump到串口中，用户可以保存到日志为coredump.log，coredump格式如下。   -+-+-+- BFLB COREDUMP v0.0.1 +-+-+-+   &lt;nowiki&gt;------&lt;/nowiki&gt; DATA BEGIN 62xxxxxx@00000400@predefined ------  ...  ...  &lt;nowiki&gt;------&lt;/nowiki&gt; END R6yo3A== ------   2. 将这些数据导入到gdb server中，可以使用gdb来对这些数据进行解析，获得异常发生时的一些状态。比如哪个进…”</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=Debug:coredump&amp;diff=308&amp;oldid=prev"/>
		<updated>2026-06-12T06:10:15Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“  1. 在CPU触发异常时，会把当前的内存中的数据dump到串口中，用户可以保存到日志为coredump.log，coredump格式如下。   -+-+-+- BFLB COREDUMP v0.0.1 +-+-+-+   &amp;lt;nowiki&amp;gt;------&amp;lt;/nowiki&amp;gt; DATA BEGIN 62xxxxxx@00000400@predefined ------  ...  ...  &amp;lt;nowiki&amp;gt;------&amp;lt;/nowiki&amp;gt; END R6yo3A== ------   2. 将这些数据导入到gdb server中，可以使用gdb来对这些数据进行解析，获得异常发生时的一些状态。比如哪个进…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
1. 在CPU触发异常时，会把当前的内存中的数据dump到串口中，用户可以保存到日志为coredump.log，coredump格式如下。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-+-+-+- BFLB COREDUMP v0.0.1 +-+-+-+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;------&amp;lt;/nowiki&amp;gt; DATA BEGIN 62xxxxxx@00000400@predefined ------&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;------&amp;lt;/nowiki&amp;gt; END R6yo3A== ------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. 将这些数据导入到gdb server中，可以使用gdb来对这些数据进行解析，获得异常发生时的一些状态。比如哪个进程发生了异常，别的进程的状态是什么样子的。&lt;br /&gt;
&lt;br /&gt;
./tools/byai/coredump.py命令会创建一个gdb server，创建虚拟的32bit内存空间，把elf文件与coredump文件加载到内存空间中，并自动打开gdb client连接。&lt;br /&gt;
&lt;br /&gt;
usage: coredump.py [-h] [-x GDB_INIT] log_file elf_file&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. 如下的例子，可见coredump.py传入coredump.log与elf后，这可打印当前运行的任务，可以使用bouffalo_sdk.gdb内置的一些函数来对某个TCB进行backtrace。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;~/bouffalo_sdk$ ./tools/byai/coredump.py coredump_20260604b/coredump.log coredump_20260604b/image_transmission_bl616cl.elf&lt;br /&gt;
&lt;br /&gt;
Auto-selected free port: 50659&lt;br /&gt;
&lt;br /&gt;
Starting local GDB server on port 50659...&lt;br /&gt;
&lt;br /&gt;
GDB server ready. Connect from GDB using:&lt;br /&gt;
&lt;br /&gt;
  (gdb) file coredump_20260604b/image_transmission_bl616cl.elf&lt;br /&gt;
&lt;br /&gt;
  (gdb) target remote localhost:50659&lt;br /&gt;
&lt;br /&gt;
  (gdb) source /home/wyb/repo/new4/bouffalo_sdk/tools/bouffalo_sdk.gdb&lt;br /&gt;
&lt;br /&gt;
Auto-starting GDB client: riscv64-unknown-elf-gdb -ex file coredump_20260604b/image_transmission_bl616cl.elf -ex target remote localhost:50659 -x /home/wyb/repo/new4/bouffalo_sdk/tools/bouffalo_sdk.gdb&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Reading symbols from coredump_20260604b/image_transmission_bl616cl.elf...&lt;br /&gt;
&lt;br /&gt;
Remote debugging using localhost:50659&lt;br /&gt;
&lt;br /&gt;
Loading ELF PT_LOAD data from: coredump_20260604b/image_transmission_bl616cl.elf&lt;br /&gt;
&lt;br /&gt;
Loaded 6 ELF PT_LOAD segments, 623074 bytes at LMA&lt;br /&gt;
&lt;br /&gt;
Initialized 6 ELF PT_LOAD segments at LMA from coredump_20260604b/image_transmission_bl616cl.elf&lt;br /&gt;
&lt;br /&gt;
Parsing coredump from: coredump_20260604b/coredump.log&lt;br /&gt;
&lt;br /&gt;
Found 1 COREDUMP sections, processing the last one&lt;br /&gt;
&lt;br /&gt;
Parsed 4460 memory blocks&lt;br /&gt;
&lt;br /&gt;
Loaded 4460 coredump memory blocks at VMA from coredump_20260604b/ReceivedTofile-COM5-2026_6_4_11-43-48.log&lt;br /&gt;
&lt;br /&gt;
Target local: Client connected from 127.0.0.1:38348&lt;br /&gt;
&lt;br /&gt;
0x00000000 in ?? ()&lt;br /&gt;
&lt;br /&gt;
(gdb) p pxCurrentTCB&lt;br /&gt;
&lt;br /&gt;
$1 = (TCB_t * volatile) 0x880f49d4&lt;br /&gt;
&lt;br /&gt;
(gdb) task_dump 0x880f49d4&lt;br /&gt;
&lt;br /&gt;
$2 = {pxTopOfStack = 0x60fd83d4, xStateListItem = {xItemValue = 0, pxNext = 0x60fd0084 &amp;lt;pxReadyTasksLists+108&amp;gt;, pxPrevious = 0x60fd0084 &amp;lt;pxReadyTasksLists+108&amp;gt;, pvOwner = 0x880f49d4, pvContainer = 0x60fd007c &amp;lt;pxReadyTasksLists+100&amp;gt;}, xEventListItem = {xItemValue = 27, pxNext = 0x880f4974, pxPrevious = 0x880f4974, pvOwner = 0x880f49d4, pvContainer = 0x0}, uxPriority = 5, pxStack = 0x60fd7560, pcTaskName = &amp;quot;shell_task\000\000\000\000\000&amp;quot;, pxEndOfStack = 0x60fd8550, uxCriticalNesting = 0, uxTCBNumber = 4, uxTaskNumber = 0, uxBasePriority = 5, uxMutexesHeld = 0, pxTaskTag = 0x0, pvThreadLocalStoragePointers = {0x0}, pvThreadLocalStoragePointersDelCallback = {0x0}, ulRunTimeCounter = 65, ulNotifiedValue = {0, 0, 0, 0}, ucNotifyState = &amp;quot;\000\000\000&amp;quot;, ucStaticallyAllocated = 0 &amp;#039;\000&amp;#039;, ucDelayAborted = 0 &amp;#039;\000&amp;#039;, iTaskErrno = 0}&lt;br /&gt;
&lt;br /&gt;
FPU is CLEAN (FS=0x2) - using offset +31 words&lt;br /&gt;
&lt;br /&gt;
mstatus: 0x5880&lt;br /&gt;
&lt;br /&gt;
stack_top: 0x60fd83d4&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;0  0x800729b6 in shell_memtrace (argc=&amp;lt;optimized out&amp;gt;, argv=&amp;lt;optimized out&amp;gt;) at ./components/shell/shell.c:93&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;1  0x80072f62 in shell_exec_cmd (retp=&amp;lt;optimized out&amp;gt;, length=&amp;lt;optimized out&amp;gt;, cmd=&amp;lt;optimized out&amp;gt;) at ./components/shell/shell.c:533&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;2  shell_exec (cmd=0x60fd3916 &amp;lt;_shell+606&amp;gt; &amp;quot;memtrace&amp;quot;, length=21) at ./components/shell/shell.c:601&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;3  0x80073136 in shell_handler (data=&amp;lt;optimized out&amp;gt;) at ./components/shell/shell.c:794&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;4  0x80073944 in shell_task (pvParameters=&amp;lt;optimized out&amp;gt;) at ./components/shell/shell_freertos.c:135&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;5  0x00000000 in ?? ()&lt;br /&gt;
&lt;br /&gt;
Backtrace stopped: frame did not save the PC&lt;br /&gt;
&lt;br /&gt;
(gdb) task_list_wait&lt;br /&gt;
&lt;br /&gt;
tcb: 0x880f7298 mstatus: 0x5880 [FPU_CLEAN]     name: xxxx&lt;br /&gt;
&lt;br /&gt;
tcb: 0x880f4d20 mstatus: 0x5880 [FPU_CLEAN]     name: tcpip_thread&lt;br /&gt;
&lt;br /&gt;
tcb: 0x60fccc08 mstatus: 0x5880 [FPU_CLEAN]     name: display_thread&lt;br /&gt;
&lt;br /&gt;
tcb: 0x60fc8ae0 mstatus: 0x5880 [FPU_CLEAN]     name: MainTask&lt;br /&gt;
&lt;br /&gt;
tcb: 0x880f73c4 mstatus: 0x5880 [FPU_CLEAN]     name: xxxx&lt;br /&gt;
&lt;br /&gt;
tcb: 0x880f6850 mstatus: 0x5880 [FPU_CLEAN]     name: xxxx&lt;br /&gt;
&lt;br /&gt;
tcb: 0x880f6e28 mstatus: 0x80007880     [FPU_CLEAN]     name: xxxx&lt;br /&gt;
&lt;br /&gt;
tcb: 0x880f5124 mstatus: 0x80007880     [FPU_CLEAN]     name: xxxx&lt;br /&gt;
&lt;br /&gt;
tcb: 0x60fd18c8 mstatus: 0x5880 [FPU_CLEAN]     name: Tmr Svc&lt;br /&gt;
&lt;br /&gt;
tcb: 0x880f4aec mstatus: 0x5800 [FPU_CLEAN]     name: wifi fw&lt;br /&gt;
&lt;br /&gt;
(gdb) task_list_ready&lt;br /&gt;
&lt;br /&gt;
tcb: 0x60fd1840 mstatus: 0x5880 [FPU_CLEAN]     name: IDLE&lt;br /&gt;
&lt;br /&gt;
tcb: 0x880f49d4 mstatus: 0x5880 [FPU_CLEAN]     name: shell_task&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q：如何退出&lt;br /&gt;
&lt;br /&gt;
A：按CTRL+D或者CTRL+C可以退出coredump.py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q：日志的格式，多个COREDUMP在同一个日志会怎么样&lt;br /&gt;
&lt;br /&gt;
A：日志支持UTF8，UTF32LE、BE，CRLF/LF，基本上默认的格式不需要转换都支持，当日志中有多个保存的coredump时，会自动选择最后一个。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q：有时候会有如下打印，是什么意思&lt;br /&gt;
&lt;br /&gt;
crc check addr: 88021400, length: 00000400, end_crc: eebd05e9, crc: 8981de62&lt;br /&gt;
&lt;br /&gt;
crc check addr: 8806e000, length: 00000400, end_crc: 2f25c5c9, crc: a9c6462e&lt;br /&gt;
&lt;br /&gt;
crc check addr: 880ac800, length: 00000400, end_crc: 28c04c90, crc: 79f28ecb&lt;br /&gt;
&lt;br /&gt;
crc check addr: 880c5400, length: 00000400, end_crc: 70dadb0a, crc: 8bcde759&lt;br /&gt;
&lt;br /&gt;
A：在通过串口把内存中的数据dump出来时，尤其是带有PSRAM的情况，大量的数据通过串口通信可能会出错，这些是发现某段的CRC校验出错，很多时候一小段出错并不影响DEBUG。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q：如何简单判断ELF与COREDUMP的对应关系&lt;br /&gt;
&lt;br /&gt;
A：可以通过读取ELF文件与芯片上电时的时间来对比&lt;br /&gt;
&lt;br /&gt;
ELF文件中的Build时间：&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
riscv64-unknown-elf-objdump -s coredump_20260604b/image_transmission_bl616cl.elf |grep -A 3 Build&lt;br /&gt;
&lt;br /&gt;
80097030 0a000000 4275696c 643a3039 3a35383a  ....Build:09:58:&lt;br /&gt;
&lt;br /&gt;
80097040 35342c20 4a756e20 20342032 3032360d  54, Jun  4 2026.&lt;br /&gt;
&lt;br /&gt;
80097050 0a000000 436f7079 72696768 74202863  ....Copyright (c&lt;br /&gt;
&lt;br /&gt;
80097060 29203230 32322042 6f756666 616c6f6c  ) 2022 Bouffalol&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
启动日志中的Build时间：&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Build:09:58:54, Jun  4 2026&lt;br /&gt;
&lt;br /&gt;
```&lt;/div&gt;</summary>
		<author><name>王扬搏</name></author>
	</entry>
</feed>