Slide 1

Slide 1 text

po͔Β࢝ΊΔlldb ະདྷେ×اۀΤϯδχΞ ՆͷLTେձ

Slide 2

Slide 2 text

• ࠤ౻ ರ໵ (@natmark) • ະདྷେ ஌ೳγεςϜίʔε 4೥ • γεςϜιϑτ΢ΣΞݚ (127Lab)

Slide 3

Slide 3 text

ProcessingίʔυΛiOS্Ͱ ར༻Մೳʹ͢ΔϥΠϒϥϦ Xcode File TemplateΛ؅ཧ ͢ΔCLIπʔϧ natmark/ProcessingKit natmark/Donut

Slide 4

Slide 4 text

ʲએ఻ʳiOSDC Japan 2018ʹొஃ͠·͢ʂ

Slide 5

Slide 5 text

Έͳ͞ΜLLDB࢖ͬͯ·͔͢

Slide 6

Slide 6 text

ࠓ೔͸LLDBʹ͍ͭͯ࿩͠·͢ɻ ͱݴͬͯ΋ɺ5෼͔͠ͳ͍ͷͰ

Slide 7

Slide 7 text

• LLDBʹ͍ͭͯ • ͳͥະདྷେੜʹLLDBͳͷ͔ • LLDBͷ؆୯ͳ࢖͍ํ • (͕࣌ؒ༨Ε͹) LLDBΛ࢖ͬͨগ࣮͠ફతͳσ όοά๏ʹ͍ͭͯ ΛૣޱͰ঺հ͠·͢ʂ

Slide 8

Slide 8 text

LLDBͱ͸ʁ

Slide 9

Slide 9 text

Low Level Debugger

Slide 10

Slide 10 text

࣍ੈ୅ߴੑೳσόοΨ

Slide 11

Slide 11 text

LLDB • ιϑτ΢ΣΞσόοΨ • LLVMϓϩδΣΫτͷҰ෦ͱͯ͠։ൃ • Clang[Ϋϥϯ] දࣜղੳػ΍LLVMٯΞηϯϒϥͳͲ Λ׆༻ͨ͠࠶ར༻Մೳͳίϯϙʔωϯτͷू·Γ • XcodeͷσϑΥϧτσόοΨ • Swift/C/C++ /Objective-C,/Objective-C++ͳͲͷ ίʔυΛ࣮ߦՄೳ

Slide 12

Slide 12 text

ͳͥະདྷେੜʹLLDBͳͷ͔

Slide 13

Slide 13 text

• ະདྷେͷCݴޠͷߨٛ͸MacࣨͰߦ͏ • Macʹ͸ඪ४ͰLLDBೖͬͯΔʂ(※1) • ະདྷେͷߨٛͰσόοΨʔͷ࢖͍ํΛڭΘΒͳ͍… ※1 ΋͔ͨ͠͠ΒXcodeೖΕͨλΠϛϯά͔΋

Slide 14

Slide 14 text

σόοάʹprintfΛͨ͘͞Μॻ͍ͯ ͍·ͤΜ͔…?

Slide 15

Slide 15 text

σόοά༻ʹॻ͍ͨprintfͰɺ ppchkall(※1)͕௨Βͳ͔ͬͨܦݧ͋ Γ·ͤΜ͔…ʁ ※1 ppchkall: ະདྷେͷϓϩάϥϛϯάجૅͷ՝୊νΣοΫίϚϯυ ςετέʔεͷग़ྗͱඪ४ग़ྗΛൺ΂ͯdiffग़͢΍ͭ

Slide 16

Slide 16 text

๻͸͋Γ·͢ʂʂʂʂʂʂʂ

Slide 17

Slide 17 text

σόοΨΛ࢖͑ΔΑ͏ʹͳΖ͏ʂ ͱ͍͏࿩

Slide 18

Slide 18 text

LLDBΛ࢖ͬͯΈΔ

Slide 19

Slide 19 text

address.c #include 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; }

Slide 20

Slide 20 text

address.cͷίϯύΠϧ $ gcc -o address -g address.c -g Generate source-level debug information

Slide 21

Slide 21 text

$ ls address address.c address.dSYM address.dSYM : Ϗϧυ࣌ʹग़ྗ͞ΕΔσόοάγϯϘϧϑΝΠϧ

Slide 22

Slide 22 text

$ 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 1015006@fun.ac.jp Process 21476 exited with status = 0 (0x00000000)

Slide 23

Slide 23 text

LLDBΛىಈ͢Δ͜ͱ͕Ͱ͖ͨ

Slide 24

Slide 24 text

ϒϨʔΫϙΠϯτΛஔ͍ͯɺ్தͰ ॲཧΛࢭΊͯΈΔ

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

(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);

Slide 27

Slide 27 text

ม਺ͷ஋Λͷ͍ͧͯΈΔ

Slide 28

Slide 28 text

(lldb) po account //po(expression -O --) ࣜΛධՁɺ໭Γ ஋ͷܕʹ͋ΘͤͨϑΥʔϚοτͰදࣔ “1015006”

Slide 29

Slide 29 text

࣮ߦதͷϓϩάϥϜͷม਺Λ೷͘͜ ͱ͕Ͱ͖ͨ

Slide 30

Slide 30 text

Ͱ΋ɺϝʔϧΞυϨεؒҧ͑ͯೖྗ ͯ͠͠·ͬͨ… (ະདྷେͷϝʔϧΞυϨε͸ֶ੶൪߸ͷલʹb͕ඞཁ)

Slide 31

Slide 31 text

࣮ߦதͷม਺ͷத਎Λมߋͯ͠ΈΔ

Slide 32

Slide 32 text

(lldb) po strcpy(account, "b1015006"); 0x00007ffeefbfeca0 (lldb) po account “b1015006

Slide 33

Slide 33 text

࣮ߦதͷม਺Λߋ৽Ͱ͖ͨ

Slide 34

Slide 34 text

ؔ਺ΛεςοϓɾΦʔόʔͯ͠ɺ 1ߦ෼ॲཧΛਐΊͯΈΔ

Slide 35

Slide 35 text

(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.

Slide 36

Slide 36 text

(lldb) po account “b1015006@fun.ac.jp"

Slide 37

Slide 37 text

addrcatؔ਺͕ͪΌΜͱಈ͍ͯΔ͜ ͱ΋֬ೝͰ͖ͨ

Slide 38

Slide 38 text

͜ΕͰCݴޠͷߨٛͰɺ LLDBΛ࢖ͬͨ؆୯ͳσόοά͕Ͱ ͖ΔΑ͏ʹͳͬͨ

Slide 39

Slide 39 text

ΊͰͨ͠ΊͰͨ͠

Slide 40

Slide 40 text

͕࣌ؒ༨ͬͨͷͰɺͪΐͬͱ ࣮ફతͳσόοά๏Λ঺հ͠·͢

Slide 41

Slide 41 text

Symbolic Breakpoint

Slide 42

Slide 42 text

• Symbolic Breakpoint • ϒϨʔΫ͍ͤͨ͞Ϋϥεͱϝιου໊Λॻ ͘ͱɺͦͷϝιου͕࣮ߦ͞ΕͨλΠϛϯ άͰϒϨʔΫͰ͖Δ • ϓϥΠϕʔτϥΠϒϥϦͳͲɺϝιου໊ ͸෼͔͍ͬͯΔ΋ͷͷBreakpointΛுΕͳ ͍৔߹ʹศར

Slide 43

Slide 43 text

(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 2 3 void addrcat(char *a, char *d) { -> 4 while(*a) { // ຤ඌ·ͰϙΠϯλΛਐΊΔ 5 a++; 6 } 7 *a++ = '@'; // @Λ௥Ճ͢Δ Target 0: (address) stopped.

Slide 44

Slide 44 text

Breakpoint Commands & Thread jump

Slide 45

Slide 45 text

• commands • ϒϨʔΫϙΠϯτʹΑͬͯϓϩάϥϜ͕ఀ ࢭͨ࣌͠ɺϒϨʔΫϙΠϯτʹରͯ͠Ұ࿈ ͷίϚϯυͷىಈΛࢦఆ͢Δ͜ͱ͕Ͱ͖Δ • jump • ϓϩάϥϜΧ΢ϯλͷ஋Λ৽͍͠ΞυϨε ʹมߋͰ͖Δ

Slide 46

Slide 46 text

(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);

Slide 47

Slide 47 text

(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); ͕εΩοϓ͞Εͨ ͨΊɺग़ྗ͞Εͨaccount͸domain͕݁߹͞Ε͍ͯͳ͍ Process 23852 exited with status = 0 (0x00000000)

Slide 48

Slide 48 text

ָ͍͠LLDBϥΠϑΛʂʂ