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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Hideaki Tai
September 29, 2022
Technology
1.5k
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
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
2
230
AWS DevOps Agent スキルをつかいこなそう / Master AWS DevOps Agent Skills
kinunori
2
670
Amazon Bedrock Agents ClassicからAmazon Bedrock AgentCoreへ移行した際、ガードレール設定が2箇所に割れた話
matsunobu
0
170
Argo CDとAtlantisで実現するインフラ管理のセルフサービス化──小規模SREチームで支えるプラットフォーム
cassius7
0
280
個別開発で終わらせない。 現場の課題をプロダクトの強さに変える StockmarkのFDE
ktkrhr
0
550
MCPゲートウェイを作って運用してわかったこと — Agent時代の権限管理の現在地
mtpooh
10
2.9k
ログラスのマルチプロダクトを 支える認証基盤 〜テナントごとに異なる統制とどう向き合うか〜
dada4386
3
330
大阪オフィスに Unitree Go2 がやってきたので Physical AI やってみた
dafujii
0
250
3人で1000GPU超を統合運用する?マルチクラウド&オンプレを跨ぐ、構築と運用のリアル!
kazukun0716
2
820
React Nativeでの OTA Updateって、 どう説明する?
ichiki1023
0
140
spanner-autoscalerに学ぶ CRD設計パターン 〜自動化と緊急時対応を両立する Kubernetesコントローラーの作り方〜
tkuchiki
0
230
行動するAIのためのオントロジー | DevRev — Encraft #26.pdf
dvrv_tknrszk
2
670
Featured
See All Featured
A Tale of Four Properties
chriscoyier
163
24k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
250
New Earth Scene 8
popppiees
4
2.6k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
Making Projects Easy
brettharned
120
6.8k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
620
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
530
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
What's in a price? How to price your products and services
michaelherold
247
13k
Context Engineering - Making Every Token Count
addyosmani
9
1.2k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
66k
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
: ミッション・サービス・組織・文化・福利厚生をご覧下さい
ご清聴ありがとうございました 🙌