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
AWSとGitHub Actionsの責任境界と 組織で安全に使用する取り組み
nealle
1
220
『自分で判断できるか』を基準に、プロダクトのハンズオン研修でAI利用の線を引いてみた / Where We Drew the Line on AI in Hands-on Training
honyanya
1
440
Eight Engineering Unit 紹介資料
sansan33
PRO
3
8.3k
500名弱規模の組織のPythonプロジェクト(dbt) をどう管理するか?
hiracky16
0
360
わたしが知り合いゼロの勉強会に 行けるようになるまで
r5ni4
2
830
atproto spaces概要
yamarten
0
110
LLMアプリ、 雰囲気で運用してませんか? 〜LLMOpsの現在地〜
taka_aki
1
550
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
3.2k
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
20k
AIエージェントのためのデータ設計
daiz21
0
520
エージェント化するAI:現在地とその先に起きる変化 / AI as Agents: The Current State and the Changes Ahead
ks91
PRO
0
160
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
5k
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
96
14k
Automating Front-end Workflow
addyosmani
1369
210k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
710
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
410
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Ruling the World: When Life Gets Gamed
codingconduct
0
310
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
510
The Pragmatic Product Professional
lauravandoore
37
7.4k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
500
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
530
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
Ethics towards AI in product and experience design
skipperchong
2
350
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ϥΠϑΛʂʂ