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
poから始めるlldb
Search
Atsuya Sato
July 14, 2018
Technology
910
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
poから始めるlldb
Atsuya Sato
July 14, 2018
More Decks by Atsuya Sato
See All by Atsuya Sato
アプリ内にテーマ機能を実装する / pixiv-app-talk-202604-theme-feature
natmark
0
57
Pull-Requestの内容を1クリックで動作確認可能にするワークフロー
natmark
2
680
iOS 17で追加されたSubscriptionStoreView を利用して5分でサブスク実装チャレンジ
natmark
0
1.5k
Pastelaのアプリ内課金開発の裏側 / pixiv-app-night-202502-pastela-iap
natmark
2
210
詳解UIWindow
natmark
3
5.6k
画面最前面に表示されるデバッグツールを作る
natmark
2
350
最低サポートOSバージョンをあげた時のストア表示について / potatotips81-store-page-apperance-with-deployment-target-updated
natmark
2
810
施策基盤としてのディープリンク〜なめらかにアプリが開く体験のために〜
natmark
9
9.1k
チームでSwiftUIを書くために / After Party iOSDC Japan 2021 SwiftUI
natmark
3
1.2k
Other Decks in Technology
See All in Technology
[2026-09-11]SREは誰のもの?運用エンジニアが始める 「SRE領域への越境」とチームの進化の軌跡 〜Road to NEXT CRE
tosite
0
120
GoCon2026 - Open Source, Open World
sanposhiho
3
3.1k
AI時代に顧客へ最速で価値を 届けるための試行錯誤 〜「AI × マネジメント」領域におけるmentoのケース〜
posterkeisuke
0
110
KPIだけでは評価できないプロダクトが考えるべき Evalsという第二の評価系 / Beyond KPIs: Evals as a Second Evaluation Framework for Products #PdEConf
aki_iinuma
4
3.9k
【視聴者参加型!】AWSセキュリティアンチパターンクイズ
syoshie
1
490
TinyGo 開発サイクルを高速化する:Go で作るエミュレータ入門
zozotech
PRO
1
600
スクラムで身についていた動き方を、XPで捉え直してみた
codmoninc
PRO
1
340
From Vanilla Kubernetes to a Batteries-Included Platform: Developer Experience at 1,300+ Clusters
yosshi_
0
680
Webとヘルスデータ
yukukotani
1
370
「図書館」という名前のままでいいのか -Code4Lib JAPANカンファレンス2026 アンカンファレンス報告- / Code4Lib JAPAN Conference 2026: Unconference Report
ykiyota
0
160
The Agent Builder Loop from Daily Work to OSS
minorun365
PRO
3
120
Driving AI Adoption Using In-House GPUs to Serve Qwen
po3rin
2
480
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
55
10k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
Leo the Paperboy
mayatellez
9
2.3k
30 Presentation Tips
portentint
PRO
1
390
Everyday Curiosity
cassininazir
0
310
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
290
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Designing for humans not robots
tammielis
254
26k
Transcript
po͔Β࢝ΊΔlldb ະདྷେ×اۀΤϯδχΞ ՆͷLTେձ
• ࠤ౻ ರ (@natmark) • ະདྷେ ೳγεςϜίʔε 4 • γεςϜιϑτΣΞݚ
(127Lab)
ProcessingίʔυΛiOS্Ͱ ར༻Մೳʹ͢ΔϥΠϒϥϦ Xcode File TemplateΛཧ ͢ΔCLIπʔϧ natmark/ProcessingKit natmark/Donut
ʲએʳiOSDC Japan 2018ʹొஃ͠·͢ʂ
Έͳ͞ΜLLDBͬͯ·͔͢
ࠓLLDBʹ͍ͭͯ͠·͢ɻ ͱݴͬͯɺ5͔͠ͳ͍ͷͰ
• LLDBʹ͍ͭͯ • ͳͥະདྷେੜʹLLDBͳͷ͔ • LLDBͷ؆୯ͳ͍ํ • (͕࣌ؒ༨Ε) LLDBΛͬͨগ࣮͠ફతͳσ όοά๏ʹ͍ͭͯ
ΛૣޱͰհ͠·͢ʂ
LLDBͱʁ
Low Level Debugger
࣍ੈߴੑೳσόοΨ
LLDB • ιϑτΣΞσόοΨ • LLVMϓϩδΣΫτͷҰ෦ͱͯ͠։ൃ • Clang[Ϋϥϯ] දࣜղੳػLLVMٯΞηϯϒϥͳͲ Λ׆༻ͨ͠࠶ར༻Մೳͳίϯϙʔωϯτͷू·Γ •
XcodeͷσϑΥϧτσόοΨ • Swift/C/C++ /Objective-C,/Objective-C++ͳͲͷ ίʔυΛ࣮ߦՄೳ
ͳͥະདྷେੜʹLLDBͳͷ͔
• ະདྷେͷCݴޠͷߨٛMacࣨͰߦ͏ • Macʹඪ४ͰLLDBೖͬͯΔʂ(※1) • ະདྷେͷߨٛͰσόοΨʔͷ͍ํΛڭΘΒͳ͍… ※1 ͔ͨ͠͠ΒXcodeೖΕͨλΠϛϯά͔
σόοάʹprintfΛͨ͘͞Μॻ͍ͯ ͍·ͤΜ͔…?
σόοά༻ʹॻ͍ͨprintfͰɺ ppchkall(※1)͕௨Βͳ͔ͬͨܦݧ͋ Γ·ͤΜ͔…ʁ ※1 ppchkall: ະདྷେͷϓϩάϥϛϯάجૅͷ՝νΣοΫίϚϯυ ςετέʔεͷग़ྗͱඪ४ग़ྗΛൺͯdiffग़ͭ͢
͋Γ·͢ʂʂʂʂʂʂʂ
σόοΨΛ͑ΔΑ͏ʹͳΖ͏ʂ ͱ͍͏
LLDBΛͬͯΈΔ
address.c #include <stdio.h> void addrcat(char *a, char *d) { while(*a)
{ // ඌ·ͰϙΠϯλΛਐΊΔ a++; } *a++ = '@'; // @ΛՃ͢Δ while(*d) { // dͷࢦ͢ΞυϨεʹจࣈ͕֨ೲ͞Ε͍ͯΔؒ *a++ = *d++; // aʹίϐʔ } } int main(void) { char account[100]; char domain[100]; scanf("%s", account); scanf("%s", domain); addrcat(account, domain); printf("%s\n", account); return 0; }
address.cͷίϯύΠϧ $ gcc -o address -g address.c -g Generate source-level
debug information
$ ls address address.c address.dSYM address.dSYM : Ϗϧυ࣌ʹग़ྗ͞ΕΔσόοάγϯϘϧϑΝΠϧ
$ lldb address (lldb) target create “address” Current executable set
to ‘address’ (x86_64). (lldb) run //ϓϩάϥϜΛ࣮ߦ͢Δ Process 21476 launched: '/Users/AtsuyaSato/Desktop/test-lldb/ address' (x86_64) 1015006 fun.ac.jp
[email protected]
Process 21476 exited with status = 0 (0x00000000)
LLDBΛىಈ͢Δ͜ͱ͕Ͱ͖ͨ
ϒϨʔΫϙΠϯτΛஔ͍ͯɺ్தͰ ॲཧΛࢭΊͯΈΔ
addrcat(account, domain); (lldb) breakpoint set --file address.c --line 20
//address.cͷ20ߦ ʹϒϨʔΫϙΠϯτΛுΔ Breakpoint 1: where = address`main + 91 at address.c:20, address = x0000000100000f1bb1015006
(lldb) run Process 22308 launched: '/Users/AtsuyaSato/Desktop/test-lldb/address' (x86_64) 1015006 fun.ac.jp Process
22308 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 frame #0: 0x0000000100000f1b address`main at address.c:20 17 scanf("%s", account); 18 scanf("%s", domain); 19 -> 20 addrcat(account, domain); 21 printf("%s\n", account); 22 return 0; 23 } Target 0: (address) stopped. addrcat(account, domain);
มͷΛͷ͍ͧͯΈΔ
(lldb) po account //po(expression -O --) ࣜΛධՁɺΓ ͷܕʹ͋ΘͤͨϑΥʔϚοτͰදࣔ “1015006”
࣮ߦதͷϓϩάϥϜͷมΛ͘͜ ͱ͕Ͱ͖ͨ
ͰɺϝʔϧΞυϨεؒҧ͑ͯೖྗ ͯ͠͠·ͬͨ… (ະདྷେͷϝʔϧΞυϨεֶ੶൪߸ͷલʹb͕ඞཁ)
࣮ߦதͷมͷதΛมߋͯ͠ΈΔ
(lldb) po strcpy(account, "b1015006"); 0x00007ffeefbfeca0 (lldb) po account “b1015006
࣮ߦதͷมΛߋ৽Ͱ͖ͨ
ؔΛεςοϓɾΦʔόʔͯ͠ɺ 1ߦॲཧΛਐΊͯΈΔ
(lldb) next //1ߦॲཧΛਐΊΔɻؔεςοϓΦʔόʔ Process 22308 stopped * thread #1, queue
= 'com.apple.main-thread', stop reason = step over frame #0: 0x0000000100000f31 address`main at address.c:21 18 scanf("%s", domain); 19 20 addrcat(account, domain); -> 21 printf("%s\n", account); 22 return 0; 23 } Target 0: (address) stopped.
(lldb) po account “
[email protected]
"
addrcat͕ؔͪΌΜͱಈ͍ͯΔ͜ ͱ֬ೝͰ͖ͨ
͜ΕͰCݴޠͷߨٛͰɺ LLDBΛͬͨ؆୯ͳσόοά͕Ͱ ͖ΔΑ͏ʹͳͬͨ
ΊͰͨ͠ΊͰͨ͠
͕࣌ؒ༨ͬͨͷͰɺͪΐͬͱ ࣮ફతͳσόοά๏Λհ͠·͢
Symbolic Breakpoint
• Symbolic Breakpoint • ϒϨʔΫ͍ͤͨ͞Ϋϥεͱϝιου໊Λॻ ͘ͱɺͦͷϝιου͕࣮ߦ͞ΕͨλΠϛϯ άͰϒϨʔΫͰ͖Δ • ϓϥΠϕʔτϥΠϒϥϦͳͲɺϝιου໊ ͔͍ͬͯΔͷͷBreakpointΛுΕͳ
͍߹ʹศར
(lldb) breakpoint set --name “addrcat" //addrcatͱ͍͏ؔʹϒϨʔΫϙΠϯτΛுΔ Breakpoint 5: where =
address`addrcat + 12 at address.c:4, address = 0x0000000100000e4c (lldb) run Process 23416 launched: '/Users/AtsuyaSato/Desktop/test-lldb/address' (x86_64) b1015006 fun.ac.jp Process 23416 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 5.1 frame #0: 0x0000000100000e4c address`addrcat(a="b1015006", d="fun.ac.jp") at address.c:4 1 #include <stdio.h> 2 3 void addrcat(char *a, char *d) { -> 4 while(*a) { // ඌ·ͰϙΠϯλΛਐΊΔ 5 a++; 6 } 7 *a++ = '@'; // @ΛՃ͢Δ Target 0: (address) stopped.
Breakpoint Commands & Thread jump
• commands • ϒϨʔΫϙΠϯτʹΑͬͯϓϩάϥϜ͕ఀ ࢭͨ࣌͠ɺϒϨʔΫϙΠϯτʹରͯ͠Ұ࿈ ͷίϚϯυͷىಈΛࢦఆ͢Δ͜ͱ͕Ͱ͖Δ • jump • ϓϩάϥϜΧϯλͷΛ৽͍͠ΞυϨε
ʹมߋͰ͖Δ
(lldb) breakpoint set --line 20 Breakpoint 1: where = address`main
+ 91 at address.c:20, address = 0x0000000100000f1b (lldb) breakpoint command add 1 //1൪ͷBreakpointʹίϚ ϯυΛઃఆ Enter your debugger command(s). Type 'DONE' to end. > thread jump --by 1 // ݱࡏͷεϨουͰ1ߦεΩοϓ͢Δ (lldb) breakpoint modify --auto-continue 1 // 1൪ͷBreakpoint ͕ϒϨʔΫͨ͠ࡍʹࣗಈͰcontinue͢ΔΑ͏ʹมߋ addrcat(account, domain);
(lldb) run Process 23852 launched: '/Users/AtsuyaSato/Desktop/ test-lldb/address' (x86_64) b1015006 fun.ac.jp
(lldb) thread jump --by 1 //commandʹΑͬͯίʔυΠϯ δΣΫγϣϯ͞Εͨ b1015006 //addrcat(account, domain); ͕εΩοϓ͞Εͨ ͨΊɺग़ྗ͞Εͨaccountdomain͕݁߹͞Ε͍ͯͳ͍ Process 23852 exited with status = 0 (0x00000000)
ָ͍͠LLDBϥΠϑΛʂʂ