Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
10年もののバグを退治した話
Search
n-seki
December 23, 2024
Technology
0
200
10年もののバグを退治した話
n-seki
December 23, 2024
Tweet
Share
More Decks by n-seki
See All by n-seki
永続化、なに使おう?
n_seki
0
290
OS間でBluetooth処理を(一部)共通化している話
n_seki
0
100
やってみようMaven!
n_seki
0
340
Try Android Health Connect
n_seki
0
90
Other Decks in Technology
See All in Technology
CursorによるPMO業務の代替 / Automating PMO Tasks with Cursor
motoyoshi_kakaku
2
790
生成AI時代 文字コードを学ぶ意義を見出せるか?
hrsued
1
730
Tech-Verse 2025 Global CTO Session
lycorptech_jp
PRO
0
1.2k
「良さそう」と「とても良い」の間には 「良さそうだがホンマか」がたくさんある / 2025.07.01 LLM品質Night
smiyawaki0820
1
430
AI導入の理想と現実~コストと浸透〜
oprstchn
0
150
なぜ私はいま、ここにいるのか? #もがく中堅デザイナー #プロダクトデザイナー
bengo4com
0
1.3k
asken AI勉強会(Android)
tadashi_sato
0
140
Claude Code Actionを使ったコード品質改善の取り組み
potix2
PRO
6
2.6k
LangSmith×Webhook連携で実現するプロンプトドリブンCI/CD
sergicalsix
1
150
MySQL5.6から8.4へ 戦いの記録
kyoshidaxx
1
300
CI/CD/IaC 久々に0から環境を作ったらこうなりました
kaz29
1
200
20250625 Snowflake Summit 2025活用事例 レポート / Nowcast Snowflake Summit 2025 Case Study Report
kkuv
1
370
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
Raft: Consensus for Rubyists
vanstee
140
7k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.7k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
The Invisible Side of Design
smashingmag
300
51k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
The Language of Interfaces
destraynor
158
25k
Unsuck your backbone
ammeep
671
58k
Code Review Best Practice
trishagee
69
18k
Making Projects Easy
brettharned
116
6.3k
Transcript
STORES 株式会社 Ebisu.mobile #8 大忘年会 2024年 12月 20日 ・ Naoto
Uwaseki 10年もののバグを退治した話
• 上関直人/うわせき なおと • STORES 決済/Androidエンジニア • アイコンはモルモット • 趣味
◦ エレキギター ᷚ🎸 自己紹介 2
STORES 決済 の紹介 3
STORES 決済 の技術の紹介 4 決済アプリ 決済端末 レシート プリンター サーバー •
Bluetooth接続 • コマンド生成をC言語でライブラリ化
10年もののバグ退治......その経緯 5 • 最初に問題を検知したのは2020年 ◦ Android10の端末でクラッシュが発生している ◦ ネイティブクラッシュということだけが分かった • Android側のバグだろうか?と思って様子を見ていた......
ネイティブクラッシュ C言語などのネイティブコードでのクラッシュこと。
10年もののバグ退治......その経緯 6 ところが、、、
10年もののバグ退治......その経緯 7 • 一向に解消しない 😨 • 断続的に調査を行うものの有益な情報は得られず • なにかしら発生条件があるらしい ◦
クラッシュ率自体は高くなかった
10年もののバグ退治......その経緯 8 2024年 真剣に向き合おうと決意 🔥
10年もののバグ退治......クラッシュレポートから分かること 9 • ネイティブクラッシュをFirebase Crashlyticsに送る
10年もののバグ退治......クラッシュレポートから分かること 10 • ネイティブクラッシュをFirebase Crashlyticsに送る
10年もののバグ退治......クラッシュレポートから分かること 11 • ネイティブクラッシュをFirebase Crashlyticsに送る
10年もののバグ退治......クラッシュレポートから分かること 12 • ネイティブクラッシュをFirebase Crashlyticsに送る
10年もののバグ退治......傾向・条件をつかむ! 13 • スタックトレースからは何も情報が得られなかった • FirebaseにはユーザーIDを送っている 💡 ◦ 他のログと突き合わせることで情報が増える ◦
クラッシュの傾向・条件がつかめないだろうか......?
10年もののバグ退治......傾向・条件をつかむ! 14 • クラッシュしたユーザーはプリンターを利用している! ◦ プリンターのモデルはバラバラ • 印刷処理に何かしら問題がある......?
STORES 決済 の技術の紹介 15 決済アプリ 決済端末 レシート プリンター サーバー •
Bluetooth接続 • コマンド生成をC言語でライブラリ化
10年もののバグ退治......泥臭いデバッグ 16 • プリンターへ送るコマンドの生成処理を C言語 で実装、 ライブラリ化して利用している ◦ とても怪しい •
二分探索的にコードをコメントアウト -> 実行......という 泥臭い作業のすえクラッシュを引き起こす関数を特定 💪
10年もののバグ退治......原因特定! 17 • 社内ライブラリの印刷データの作成処理にバグがあった • 具体的にはmemset関数の使い方が誤っていた ◦ バッファーオーバーフローが発生 😱 バッファーオーバーフロー
プログラムがバッファに割り当てられた空間よりも大きなデータを書き込むことで、 データがバッファ境界からあふれ、バッファの範囲外のメモリを上書きし、元々その メモリにあったデータを破壊してしまうことを指す。 (Wikipedia・バッファオーバーフロー)
10年もののバグ退治......原因特定! 18 • 非常に単純化すると、以下のような実装があった memset(アドレス, 1バイトの値, 3) • アドレスが指す領域に、1バイトの値を、3バイト分書く •
なぜか「3」がハードコーディングさていた 🤔🤔🤔
10年もののバグ退治......原因特定! 19 • なぜか「3」がハードコーディングさていた 🤔🤔🤔 memset(アドレス, 1バイトの値, 3) • 1バイトの値を1バイト書き込むことを前提に領域確保
• 2バイト余分に書き込むのでバッファーオーバーフロー
10年もののバグ退治......対応をリリース 20 • 想定外の領域の値が書き換わってしまったことが原因 ◦ 書き換わった領域が参照されるとクラッシュ ▪ 発生率の低さ & 謎のスタックトレースの要因
• ライブラリ実装当初からこうなっていた ◦ 10年以上前! • 1行修正してリリースすると......
10年もののバグ退治......対応をリリース 21
10年もののバグ退治......対応をリリース 22 倒せた 🎉
10年もののバグ退治からの教訓 23 • スタックトレースが理解不能でも慌てない 👌 • 特殊なクラッシュでもツールを駆使して情報を増やす 💡 • 他の情報と組み合わせることで発生条件を絞り込める
💡 • 諦めない気持ち ✊
10年もののバグを退治した話 24 完