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
Pythonで広がるXcodeデバッグの世界(pixiv App Night 2025/11/...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
glassfiber
November 07, 2025
Programming
61
0
Share
Pythonで広がるXcodeデバッグの世界(pixiv App Night 2025/11/06) / pixiv App Night Xcode debugger with Python
XcodeのデフォルトデバッガであるLLDBは、Pythonを使って拡張することができます。 手軽で便利なものから、外部との連携を行うものまで、いくつかの応用例を紹介します。
glassfiber
November 07, 2025
More Decks by glassfiber
See All by glassfiber
数値を文字列に整形する際の落とし穴とその解決策(iOSDC2024 ルーキーズLT) / iOSDC Japan 2024 Formatting Floating-Point Numbers
glassfiber
0
920
pixiv App Night 20240523 NumberFormatterのハマり事例
glassfiber
0
180
Other Decks in Programming
See All in Programming
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
1
310
Cloudflare で始める Data Platform
ta93abe
0
200
ReactとSvelteのその先、Ripple-TS / Beyond React and Svelte: Ripple-TS
ssssota
2
470
Firefoxにコントリビューションして得られた学び
ken7253
2
170
Agent Skills を社内で育てる仕組み作り
jackchuka
1
2.2k
AI時代になぜ書くのか
mutsumix
0
440
要はバランスからの卒業 #yumemi_grow
kajitack
0
180
1人1案件のプロダクトエンジニア時代に、"プロセス監督"としてチャレンジしたこと
non0113
0
130
UaaL×Androidアプリのメモリ計測 — Memory Profilerの先へ
rio432
0
160
ふにゃっとしない名前の付け方 〜哲学で茹で上げる、コシのあるソフトウェア設計〜
shimomura
0
130
Skillは並べた。動かなかった。契約で繋いだ。— 65個のSkillから、自走する開発サイクルへ
junholee
0
680
Are We Really Coding 10× Faster with AI?
kohzas
0
200
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
55
8.1k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.9k
Ethics towards AI in product and experience design
skipperchong
2
280
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
910
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
WENDY [Excerpt]
tessaabrams
10
37k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
300
Into the Great Unknown - MozCon
thekraken
41
2.5k
What's in a price? How to price your products and services
michaelherold
247
13k
Navigating Team Friction
lara
192
16k
Transcript
2025/11/06 pixiv App Night PythonͰ͕ΔXcodeσόοάͷੈք glass fi ber
glass fi ber 𝕏 : glass fi ber (@glass fi
ber2023) w $SFBUPS%JWJTJPO%4FDUJPOJ04ΤϯδχΞ w 1BTUFMBͷJ1BE͚ΞϓϦ։ൃΛ୲ w ݄த్ೖࣾ w લ৬ήʔϜ։ൃऀ 14 9CPY J04 8JOEPXT
• iPad༻͓ֆඳ͖πʔϧ • ΄ͱΜͲͷػೳແྉͰ༻Մೳ
֓ཁ • XcodeσόοΨ͔ΒݺͿίϚϯυΛPythonͰ࡞Δ • Python͔ΒΞϓϦͷมʹΞΫηε͢Δํ๏ • ίϚϯυͷొํ๏ • Ԡ༻ྫ •
ωοτϫʔΫܦ༝ͰϓϨϏϡʔΛϦΞϧλΠϜදࣔ
• UISwiftɺίΞͷը૾ॲཧC++Ͱهड़
σόοΨͰC++ͷը૾ΛϓϨϏϡʔͰ͖ͳ͍ • UIImageCGImageXcodeͰϓϨϏϡʔͰ͖Δ • C++Ͱ͍࣋ͬͯΔσʔλϓϨϏϡʔͰ͖ͳ͍ • ྻͱͯ͠ͷཏྻݟΕΔ͕… ۄΞΠίϯ ը૾͕දࣔ͞ΕΔ
ͦ͏ͩɺPythonΛ͓͏ • XcodeσόοΨ͔ΒPythonεΫϦϓτΛίϚϯυͱͯ͠ݺΔ • Python͔ΒΞϓϦͷมʹΞΫηεͰ͖Δ →PythonͰʮݟΕΔʯܗࣜʹมͯ͠දࣔ͢Ε →ը૾ΛϓϨϏϡʔ͢ΔίϚϯυ͕࡞ΕΔʂ
Pythonͷ๛ͳϥΠϒϥϦΛ࣮ͬͯݱ • Xcode͔Βݺͼग़͢PythonεΫϦϓτͰɺpipͰΠϯετʔϧͰ͖Δ ϥΠϒϥϦΛ༻Մೳ • ը૾มϥΠϒϥϦ Pillow ΛͬͯRGBAྻΛpngʹม • มͨ͠pngΛςϯϙϥϦϑΝΠϧʹग़ྗ
→ϓϨϏϡʔΞϓϦͰදࣔ
มͷΞΫηε def display_CImage(debugger, command, result, internal_dict): args = command.split() var_name
= args[0] target = debugger.GetSelectedTarget() process = target.GetProcess() thread = process.GetSelectedThread() frame = thread.GetSelectedFrame() val = frame.FindVariable(var_name) if not val or not val.IsValid(): result.SetError(f"Could not find valiable '{var_name}'") return width_val = val.GetChildMemberWithName('m_width') height_val = val.GetChildMemberWithName('m_height') data_ptr_val = val.GetChildMemberWithName(‘m_buffer') width = width_val.GetValueAsUnsigned(0) height = height_val.GetValueAsUnsigned(0) data_addr = data_ptr_val.GetValueAsUnsigned(0) data_size = width * height * 4 ίϚϯυҾ (ݟ͍ͨը૾ͷม໊) มΛݟ͚ͭΔ ϝϯόมΛऔಘ PythonͰѻ͑Δʹ͢Δ σόοΨͷใ
ը૾Λม͢Δ image_data = process.ReadMemory(data_addr, data_size, error) try: img = Image.frombytes('RGBA',
(width, height), image_data) with tempfile.NamedTemporaryFile(prefix=TEMP_FILE_PREFIX, suffix=“.png”, delete=False) as temp_f: temp_path = temp_f.name img.save(temp_path, 'PNG') try: subprocess.run(['/usr/bin/qlmanage', '-p', temp_path], check=True, stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL) except FileNotFoundError: … except Exception as e: … RGBAྻ͔Β ը૾ʹม PNGͱͯ͠อଘ Quick LookΛىಈ ྫ֎ॲཧ(লུ)
ίϚϯυͱͯ͠ొ͢Δ • __lldb_init_moduleͱ͍͏ؔΛఆ͓͖ٛͯ͠ɺ~/.lldbinitͰimport͢Δ (image_display.py) def __lldb_init_module(debugger, internal_dict): # -f Ϟδϡʔϧ໊.໊ؔ
ͷؔΛ disp ͱ͍͏ίϚϯυ໊Ͱొ debugger.HandleCommand('command script add -f image_display.display_CImage disp') (.lldbinit) command script import ~/lldb_scripts/image_display.py ίϚϯυ໊ εΫϦϓτϑΝΠϧ໊
ίϚϯυ༻ྫ
ίϚϯυ༻ྫ
Ԡ༻ɾωοτϫʔΫͰૹ৴͢Δ • PythonωοτϫʔΫΞΫηεࣗ༝ࣗࡏ • ϩʔΧϧͰhttpαʔόʔΛಈ͔͠ɺૹ৴͢Δ • ϒϥβͰࣗಈߋ৽͠ͳ͕Βදࣔ • ϒϨʔΫϙΠϯτͷઃఆ •
ActionΛDebugger Commandʹͯ͠ ࡞ͨ͠ίϚϯυΛݺͿ • Automatically continue after evaluating actionsΛ༗ޮʹͯ͠ࢭ·Βͳ͍Α͏ʹ͢Δ
Ԡ༻ɾωοτϫʔΫͰૹ৴͢Δ • PythonωοτϫʔΫΞΫηεࣗ༝ࣗࡏ • ϩʔΧϧͰwebαʔόʔΛಈ͔͠ɺૹ৴͢Δ • ϒϥβͰࣗಈߋ৽͠ͳ͕Βදࣔ
Ԡ༻ɾωοτϫʔΫͰૹ৴͢Δ • PythonωοτϫʔΫΞΫηεࣗ༝ࣗࡏ • ϩʔΧϧͰwebαʔόʔΛಈ͔͠ɺૹ৴͢Δ • ϒϥβͰࣗಈߋ৽͠ͳ͕Βදࣔ
Ԡ༻ɾωοτϫʔΫͰૹ৴͢Δ • PythonωοτϫʔΫΞΫηεࣗ༝ࣗࡏ • ϩʔΧϧͰwebαʔόʔΛಈ͔͠ɺૹ৴͢Δ • ϒϥβͰࣗಈߋ৽͠ͳ͕Βදࣔ
·ͱΊ • PythonͰࣗ༻ίϚϯυΛ࡞Δ͜ͱͰɺXcodeͰͷσόοά͕ḿΔ • ͱ͍͑ɺҰ͔Β࡞Δͷେม… • Facebook(Meta)͕Chiselͱ͍͏LLDBίϚϯυूΛެ։͍ͯ͠Δ • https://github.com/facebook/chisel •
·ͣ͜ΕΛಋೖ͠ɺΓͳ͍ͷ͚ͩࣗͰ࡞Δ