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
71
Pull-Requestの内容を1クリックで動作確認可能にするワークフロー
natmark
2
690
iOS 17で追加されたSubscriptionStoreView を利用して5分でサブスク実装チャレンジ
natmark
0
1.6k
Pastelaのアプリ内課金開発の裏側 / pixiv-app-night-202502-pastela-iap
natmark
2
220
詳解UIWindow
natmark
3
5.7k
画面最前面に表示されるデバッグツールを作る
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
Futexes the good, the bad, the ugly
ennael
PRO
0
120
The seven pitfalls of AI (revised version)
ufried
0
260
検証フェーズはAIの回答を判断するための学習機会
toru_kubota
2
500
20260930_Gemma4_Hands-on
tsho
0
220
IoTデバイスを繋げるプロトコルMatterをAndroidで使用する方法
harutiro
0
120
並行性の問題を防げ!実践トランザクション入門
occhi
0
260
Kernel testing frameworks
ennael
PRO
0
110
React Nativeでの OTA Updateって、 どう説明する?
ichiki1023
0
150
全社共通データ基盤をつくる。ソニーのDatabricks活用とデータガバナンス設計の裏側
sony
0
420
大阪オフィスに Unitree Go2 がやってきたので Physical AI やってみた
dafujii
0
310
AIに攻撃される前に、AIに攻撃させる
tsuchikazu
0
150
Snapshot Testing in Practice: Predictable and Reliable SwiftUI Views
fespinoza
0
120
Featured
See All Featured
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
310
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
570
Rails Girls Zürich Keynote
gr2m
96
14k
Agile that works and the tools we love
rasmusluckow
331
22k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
710
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
[SF Ruby Conf 2025] Rails X
palkan
3
1.4k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
260
How STYLIGHT went responsive
nonsquared
100
6.3k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
970
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
540
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
260
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ϥΠϑΛʂʂ