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
poから始めるlldb
Search
Atsuya Sato
July 14, 2018
Technology
900
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
38
Pull-Requestの内容を1クリックで動作確認可能にするワークフロー
natmark
2
640
iOS 17で追加されたSubscriptionStoreView を利用して5分でサブスク実装チャレンジ
natmark
0
1.4k
Pastelaのアプリ内課金開発の裏側 / pixiv-app-night-202502-pastela-iap
natmark
2
190
詳解UIWindow
natmark
3
5.4k
画面最前面に表示されるデバッグツールを作る
natmark
2
340
最低サポートOSバージョンをあげた時のストア表示について / potatotips81-store-page-apperance-with-deployment-target-updated
natmark
2
790
施策基盤としてのディープリンク〜なめらかにアプリが開く体験のために〜
natmark
9
8.9k
チームでSwiftUIを書くために / After Party iOSDC Japan 2021 SwiftUI
natmark
3
1.2k
Other Decks in Technology
See All in Technology
「ビジネスがわかるエンジニア」とは何か?
ryooob
0
310
From Prompt Engineering to Loop Engineering
shibuiwilliam
1
220
入門!AWS Blocks
ysuzuki
1
190
OTel × Datadog で 「AI活用」を計測し、改善に繋げる
shihochan
2
640
起点・思考・出力で分解する 〜PM業務の自動化設計〜
kazu_kichi_67
1
1.1k
感情と身体を置き去りにしない、エンジニアの生きのこり方 ──いまから、ここから「自分の状態」を扱うという選択
saorimurooka
0
340
時期が悪い!それでもRaspberry Piを買って遊んで活用するには / 20260627-osc26do-rpi-jikigawarui
akkiesoft
0
820
クレデンシャル流出 ― 攻撃 3 時間 vs 復旧 10 時間。この非対称性にどう備えるか
kazzpapa3
3
560
[AWS Summit Japan 2026]迷っているあなたへ_小さな一歩が、やがて自分を助けてくれる
sh_fk2
2
410
AI時代に求められる技術力 フロンティア・クリエイティビティ / Technical Excellence in the AI Era: Frontier Creativity
kaonavi
0
100
【FinOps】データドリブンな意思決定を目指して
z63d
0
350
自宅LLMの話
jacopen
1
720
Featured
See All Featured
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
370
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Designing Experiences People Love
moore
143
24k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Facilitating Awesome Meetings
lara
57
7k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Google's AI Overviews - The New Search
badams
0
1k
Git: the NoSQL Database
bkeepers
PRO
432
67k
The Cult of Friendly URLs
andyhume
79
6.9k
Deep Space Network (abreviated)
tonyrice
0
210
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
240
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
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ϥΠϑΛʂʂ