Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ファームウェアの Panic を 自動で収集・解析・分類・集計して 市場品質の改善サイクルを回す
Search
Hideaki Tai
September 29, 2022
Technology
1.6k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ファームウェアの Panic を 自動で収集・解析・分類・集計して 市場品質の改善サイクルを回す
Bitkey x Nature / IoTぶっちゃけNight での発表資料です。
https://nature.connpass.com/event/257336/
Hideaki Tai
September 29, 2022
More Decks by Hideaki Tai
See All by Hideaki Tai
Matter を Remo nano ではじめよう
hideakitai
0
3.6k
ofserial-option
hideakitai
0
130
Other Decks in Technology
See All in Technology
仕様駆動開発の、その先へ。決める力と確かめる仕組み
inariku
0
110
AI秘書と毎日働くのはもう当たり前。開発以外の業務に足りない機能をどう埋める?
minorun365
PRO
4
1.9k
これだけは抑えておきたい!後悔しない re:Invent の過ごし方 / AWS re:Invent 2026 prestudy
kinunori
2
500
AIエージェントに 権限と鍵をどこまで渡すか
nrinetcom
PRO
2
120
LLMの知識とAIエージェント
happysamurai294
0
110
2026-10-24 JAWS JAWS-UG 茨城 #18 IAM Policy Autopilotってなにさ。terraform planからIAM Policyつくれるの? / What's IAM Policy Autopilot
masasuzu
0
180
AI時代のエンジニアの情報発信〜個人の発信を組織の力に変える〜
ryo_kawamata
0
220
AIに任せられるFlutterコードベースを作る 〜仕様をコードで表し、ハーネスで守る〜
myohei
1
340
AWSDirectConnectの構築の進め方を整理してみた
masa_my
1
200
200人の配信コメント、 全部Jevが仕分けます 〜 マサカリガードを作ってみた 〜
katayamatg
1
360
AIで選択肢が広がった組織設計の理想と現実
konifar
15
6.6k
Don't write the architecture only in the prompt.
neohsu
0
180
Featured
See All Featured
Navigating Weather and Climate Data
rabernat
0
560
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
What does AI have to do with Human Rights?
axbom
PRO
1
2.5k
Color Theory Basics | Prateek | Gurzu
gurzu
1
500
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
430
The Curious Case for Waylosing
cassininazir
1
580
Writing Fast Ruby
sferik
630
63k
Evolving SEO for Evolving Search Engines
ryanjones
0
330
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Transcript
2022/09/28 ファームウェアの Panic を 自動で収集・解析・分類・集計して 市場品質の改善サイクルを回す
自己紹介 - 田井 秀昭 - ハードウェア + メディアテクノロジーを楽しんでいる人 - Arduino
/ 回路 -> 光・音・ロボティクス・ウェアラブル - Nature SWE (FW) <- Rhizomatiks HW <- 電機メーカー HW - HP / GitHub / Twitter
Nature Remo では普段から 様々なエラーログを収集しています 🗒
市場には未知のバグが潜んでいるはず…! ☠
(天の声) Backtrace を収集したいですよね? 💡
ESP-IDF は Panic したら Backtrace を出してくれる Guru Meditation Error: Core
0 panic'ed (Cache disabled but cached memory region accessed). Exception was unhandled. Core 0 register dump: PC : 0x400e14ed PS : 0x00060030 A0 : 0x800d0805 A1 : 0x3ffb5030 A2 : 0x00000000 A3 : 0x00000001 A4 : 0x00000001 A5 : 0x3ffb50dc A6 : 0x00000000 A7 : 0x00000001 A8 : 0x00000000 A9 : 0x3ffb5000 A10 : 0x00000000 A11 : 0x3ffb2bac A12 : 0x40082d1c A13 : 0x06ff1ff8 A14 : 0x3ffb7078 A15 : 0x00000000 SAR : 0x00000014 EXCCAUSE: 0x0000001d EXCVADDR: 0x00000000 LBEG : 0x4000c46c LEND : 0x4000c477 LCOUNT : 0xffffffff Backtrace: 0x400e14ed:0x3ffb5030 0x400d0802:0x3ffb5050 参考: Fatal Errors # ESP-IDF を Activate した状態で下記のようなツールで Backtrace を手動でデコードできる xtensa-esp32-elf-addr2line -pfiaC -e firmware.elf {Backtrace の文字列}
IDF Monitor で見ていれば自動でデコードしてくれる Core 0 register dump: PC : 0x400e14ed
PS : 0x00060030 A0 : 0x800d0805 A1 : 0x3ffb5030 0x400e14ed: app_main at /Users/user/esp/example/main/main.cpp:36 A2 : 0x00000000 A3 : 0x00000001 A4 : 0x00000001 A5 : 0x3ffb50dc A6 : 0x00000000 A7 : 0x00000001 A8 : 0x00000000 A9 : 0x3ffb5000 A10 : 0x00000000 A11 : 0x3ffb2bac A12 : 0x40082d1c A13 : 0x06ff1ff8 0x40082d1c: _calloc_r at /Users/user/esp/esp-idf/components/newlib/syscalls.c:51 A14 : 0x3ffb7078 A15 : 0x00000000 SAR : 0x00000014 EXCCAUSE: 0x0000001d EXCVADDR: 0x00000000 LBEG : 0x4000c46c LEND : 0x4000c477 LCOUNT : 0xffffffff Backtrace: 0x400e14ed:0x3ffb5030 0x400d0802:0x3ffb5050 0x400e14ed: app_main at /Users/user/esp/example/main/main.cpp:36 0x400d0802: main_task at /Users/user/esp/esp-idf/components/esp32/cpu_start.c:470
ESP-IDF の Backtrace 出力をハックして 収集できたら最高では? 🤔
ただし条件がある! ⚠
Firmware OTA Update でのトラブルを起こさない! - 独自に ESP-IDF を Fork して変更したくない
- 稼働中の数十万台の Remo の Flash の Partition は変えたくない - なるべく DRAM の容量を節約したい - Panic 中に Panic だけはしないように細心の注意を!!
どうしたら良いか? 🤔
Backtrace を安全に収集するために解決すべきこと - 独自に ESP-IDF を Fork して変更したくない - 稼働中の数十万台の
Remo の Flash の Partition は変えたくない - なるべく DRAM の容量を節約したい - Panic 中に Panic だけはしないように細心の注意を!!
ESP-IDF で Backtrace を出力する流れはこんな感じらしい // ESP-IDF で実装されている Backtrace を表示する Public
な関数 void panic_print_backtrace(const void *f, int core) { /* … */ } 参考: esp-idf/components/esp_system/port/arch/xtensa/panic_arch.c
(天の声) リンカの wrap 機能はいかが? 💡
リンカの wrap 機能で既存の Public な関数を wrap する LDFLAGS=-Wl,--wrap=panic_print_backtrace // 元の
panic_print_backtrace() は __real prefix を付ければ呼び出せる extern void __real_panic_print_backtrace(const void* f, int core); // 元の panic_print_backtrace() の呼び出しは __wrap prefix のものに置き換えられる void __wrap_panic_print_backtrace(const void* f, int core) { // ここで Backtrace を保存する // 必要であれば、元の実装を呼び出す __real_panic_print_backtrace(f, core); } // ESP-IDF で実装されている Backtrace を表示する Public な関数 void panic_print_backtrace(const void *f, int core) { /* … */ } 下記のように wrap 関数を定義し、LDFLAGS をつけてコンパイルすれば、 ESP-IDF を Fork したりせずとも Public な関数をハックできる!
- 独自に ESP-IDF を Fork して変更したくない - 稼働中の数十万台の Remo の
Flash の Partition は変えたくない - なるべく DRAM の容量を節約したい - Panic 中に Panic だけはしないように細心の注意を!! Backtrace を安全に収集するために解決すべきこと
どうやって再起動後まで Backtrace を保存するか? - 再起動後まで Backtrace のデータを保持するには、いくつかやり方がある - ESP-IDF の
Core Dump 機能を使う (🆖 Flash に専用の Partition を作る必要がある) - リセットしても消えない DRAM領域を使う (🆖 DRAM 容量を節約したい) - リセットしても消えない RTC Slow Memory を使う (🆗 Flash を使用せずに 8KB 使える!) - 👉 リセットしても消えない RTC Slow Memory に Backtrace を保存する - Partition を変更する必要がない - DRAM 容量を節約できる // RTC Slow Memory 上に配置するデータ static RTC_NOINIT_ATTR int s_cached_panicked_core; static RTC_NOINIT_ATTR uint32_t s_pcs[BACKTRACE_CACHE_MAX_DEPTH]; static RTC_NOINIT_ATTR uint32_t s_sps[BACKTRACE_CACHE_MAX_DEPTH]; static RTC_NOINIT_ATTR size_t s_cached_backtrace_depth; static RTC_NOINIT_ATTR backtrace_status_t s_cached_backtrace_status;
- 独自に ESP-IDF を Fork して変更したくない - 稼働中の数十万台の Remo の
Flash の Partition は変えたくない - なるべく DRAM の容量を節約したい - Panic 中に Panic だけはしないように細心の注意を!! Backtrace を安全に収集するために解決すべきこと
実機テストで Panic 中に Panic したりしないか入念に確認 // Backtrace が想定どおり取れるかテスト (restart, abort,
assert, wdt, stack/buffer overflow) // 最後に余計な Panic なく想定どおりの回数だけ Panic していることを確認する typedef enum { TEST_STATE_INITIALIZE, TEST_STATE_RESTART, …, TEST_STATE_ABORT_CORE0, TEST_STATE_ABORT_CORE1, …, TEST_STATE_ASSERT_CORE0, TEST_STATE_ASSERT_CORE1, …, TEST_STATE_WATCHDOG_CORE0, TEST_STATE_WATCHDOG_CORE1, …, TEST_STATE_STACK_OVERFLOW_CORE0, TEST_STATE_STACK_OVERFLOW_CORE1, …, TEST_STATE_BUFFER_OVERFLOW_CORE0, TEST_STATE_BUFFER_OVERFLOW_CORE1, …, TEST_STATE_FINALIZE, } test_state_t; static RTC_NOINIT_ATTR test_state_t s_test_state; // RTC Memory に保存してテスト状況を追跡 static RTC_NOINIT_ATTR size_t s_panic_count; // 想定外に Panic していないか監視 const size_t MAX_PANIC_COUNT = 10; // このテストで Panic する回数
[まとめ] Backtrace を保存してサーバへ送信する 1. リンカの wrap 機能を使って Panic 時の Backtrace
表示関数を wrap ◦ ESP-IDF を Fork したりせずにハックできる! 2. RTC Slow Memory (.noinit 領域) を使って Backtrace 情報を保存 ◦ Partition を変更しない + DRAM 容量を節約して保存できる! 3. RTC Slow Memory に Backtrace 情報が保存されていたらサーバへ送信 ※ 実機テストで Panic 中に Panic するなどの致命的な不具合がないことを確認
[まとめ] Backtrace を保存してサーバへ送信する
ファームウェア側は完成! 🙌
サーバに送信した後は… - Backtrace を自動でデコードしてくれたらもっと良いのでは? - 自動でエラー解析をして原因箇所と経路を特定してもらえる - すぐに改善の検討を始められる - さらに自動でエラーを分類・集計・報告してくれたら最高では?
- 市場の影響度 (改善の優先度) も見えるようになる
Remo の Backtrace を自動で収集してくれる君の概要
不慣れな開発をする私に試練が襲いかかる… しかし
神 (1) が現れ 20 分で Go のバグを解決してくれる…
神 (2) が現れ sentry を紹介してくれる…
最高 🙌
sentry で Backtrace を自動で収集・分類・集計 (参考)
本日のまとめ - リンカの wrap 機能を使って IDF を変更せずに挙動をハックした - ESP の
RTC Slow Memory を使って再起動後まで Backtrace を保存した - 市場の製品に影響を与えないよう入念に実機テストを行った - Nature の仲間の力を借りれば良い感じのシステムが構築できる!
Nature では積極採用中です - Nature では一緒に開発をしてくれる仲間を募集しています - カジュアル面談も大歓迎です - Culture Deck
: ミッション・サービス・組織・文化・福利厚生をご覧下さい
ご清聴ありがとうございました 🙌