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
glassfiber
November 07, 2025
Programming
67
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
990
pixiv App Night 20240523 NumberFormatterのハマり事例
glassfiber
0
190
Other Decks in Programming
See All in Programming
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
180
プロポーザルを書いてもらう
pvcresin
0
540
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
320
VibeCodingからAgenticWorkflowへ
starfish719
0
500
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
590
Android CLI
fornewid
0
220
今さら聞けない .NET CLI
htkym
0
190
SlackアプリとLambdaの 連携を構築した話
pawn_4_s
1
120
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
970
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.5k
AIを紡ぐPMのお話
swdtkuy
0
110
Google Apps Script で Ruby を動かす
kawahara
0
240
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
304
22k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
650
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
490
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
210
AI: The stuff that nobody shows you
jnunemaker
PRO
9
910
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
170
A designer walks into a library…
pauljervisheath
211
24k
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 •
·ͣ͜ΕΛಋೖ͠ɺΓͳ͍ͷ͚ͩࣗͰ࡞Δ