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
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
glassfiber
November 07, 2025
Programming
0
44
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
850
pixiv App Night 20240523 NumberFormatterのハマり事例
glassfiber
0
180
Other Decks in Programming
See All in Programming
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
400
Fragmented Architectures
denyspoltorak
0
140
プロダクトオーナーから見たSOC2 _SOC2ゆるミートアップ#2
kekekenta
0
190
AI時代のキャリアプラン「技術の引力」からの脱出と「問い」へのいざない / tech-gravity
minodriven
17
5.7k
Vibe codingでおすすめの言語と開発手法
uyuki234
0
210
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
2k
.NET Conf 2025 の興味のあるセッ ションを復習した / dotnet conf 2025 quick recap for backend engineer
tomohisa
0
130
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
200
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
580
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
970
Grafana:建立系統全知視角的捷徑
blueswen
0
320
カスタマーサクセス業務を変革したヘルススコアの実現と学び
_hummer0724
0
500
Featured
See All Featured
What does AI have to do with Human Rights?
axbom
PRO
0
2k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
430
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
AI: The stuff that nobody shows you
jnunemaker
PRO
2
230
How to Talk to Developers About Accessibility
jct
2
120
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
61
49k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
350
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
170
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
The SEO Collaboration Effect
kristinabergwall1
0
350
Documentation Writing (for coders)
carmenintech
77
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 •
·ͣ͜ΕΛಋೖ͠ɺΓͳ͍ͷ͚ͩࣗͰ࡞Δ