$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Pythonで広がるXcodeデバッグの世界(pixiv App Night 2025/11/...
Search
glassfiber
November 07, 2025
Programming
0
40
Pythonで広がるXcodeデバッグの世界(pixiv App Night 2025/11/06) / pixiv App Night Xcode debugger with Python
XcodeのデフォルトデバッガであるLLDBは、Pythonを使って拡張することができます。 手軽で便利なものから、外部との連携を行うものまで、いくつかの応用例を紹介します。
glassfiber
November 07, 2025
Tweet
Share
More Decks by glassfiber
See All by glassfiber
数値を文字列に整形する際の落とし穴とその解決策(iOSDC2024 ルーキーズLT) / iOSDC Japan 2024 Formatting Floating-Point Numbers
glassfiber
0
810
pixiv App Night 20240523 NumberFormatterのハマり事例
glassfiber
0
180
Other Decks in Programming
See All in Programming
AIコーディングエージェント(Manus)
kondai24
0
130
スタートアップを支える技術戦略と組織づくり
pospome
8
15k
WebRTC、 綺麗に見るか滑らかに見るか
sublimer
1
150
tparseでgo testの出力を見やすくする
utgwkk
1
140
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
230
【Streamlit x Snowflake】データ基盤からアプリ開発・AI活用まで、すべてをSnowflake内で実現
ayumu_yamaguchi
1
110
Building AI Agents with TypeScript #TSKaigiHokuriku
izumin5210
6
1.2k
【CA.ai #3】ワークフローから見直すAIエージェント — 必要な場面と“選ばない”判断
satoaoaka
0
220
sbt 2
xuwei_k
0
200
Integrating WordPress and Symfony
alexandresalome
0
120
Microservices Platforms: When Team Topologies Meets Microservices Patterns
cer
PRO
1
930
目的で駆動する、AI時代のアーキテクチャ設計 / purpose-driven-architecture
minodriven
11
3.9k
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
100
5.9k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Building Adaptive Systems
keathley
44
2.9k
Side Projects
sachag
455
43k
Typedesign – Prime Four
hannesfritz
42
2.9k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Bash Introduction
62gerente
615
210k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
1k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
Documentation Writing (for coders)
carmenintech
76
5.2k
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 •
·ͣ͜ΕΛಋೖ͠ɺΓͳ͍ͷ͚ͩࣗͰ࡞Δ