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
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
55
Pull-Requestの内容を1クリックで動作確認可能にするワークフロー
natmark
2
670
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
800
施策基盤としてのディープリンク〜なめらかにアプリが開く体験のために〜
natmark
9
9k
チームでSwiftUIを書くために / After Party iOSDC Japan 2021 SwiftUI
natmark
3
1.2k
Other Decks in Technology
See All in Technology
現場の暗黙知を継承するAIエージェント — 対話から生まれる長期記憶と Skills
atsukish
0
130
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
4
24k
AIエージェントのためのデータ設計
daiz21
0
520
PdMをやめて、 "プロダクトビルダー"という 働き方に変えました / PdM to Product Builder
shikichee
0
120
500名弱規模の組織のPythonプロジェクト(dbt) をどう管理するか?
hiracky16
0
360
マイナンバーカード本人確認の実装比較(OAuth/OIDC Numa (Immersion) Workshop 2026) / 20260825 numa-12
oidfj
PRO
0
340
AIレビュー時代に必要なのは、SLOで引く撤退ライン
nobuoooo
0
150
Kiro Crew で始める マルチエージェント開発
miu_crescent
PRO
0
200
AWSとAzureのマルチクラウド活用における強い味方___AWS_Kiroを使った二刀流スキル作成.pdf
duelist2020jp
1
140
MCPを待つな、パスキーを拡げよう(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
350
「ミスを許さない手順書」を作ってみた 〜 個人的にはこれ以上できることはあまりなさそう/20260827-ssmjp-operation-procedure-update
opelab
13
9k
ハッカソンで入賞した話 @ Findy LT
asari194617
0
1.5k
Featured
See All Featured
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
350
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
Crafting Experiences
bethany
1
270
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
65
57k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
670
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
580
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
580
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Fireside Chat
paigeccino
42
4k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
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ϥΠϑΛʂʂ