$30 off During Our Annual Pro Sale. View Details »

Pythonで広がるXcodeデバッグの世界(pixiv App Night 2025/11/...

Avatar for glassfiber glassfiber
November 07, 2025

Pythonで広がるXcodeデバッグの世界(pixiv App Night 2025/11/06) / pixiv App Night Xcode debugger with Python

XcodeのデフォルトデバッガであるLLDBは、Pythonを使って拡張することができます。 手軽で便利なものから、外部との連携を行うものまで、いくつかの応用例を紹介します。

Avatar for glassfiber

glassfiber

November 07, 2025
Tweet

More Decks by glassfiber

Other Decks in Programming

Transcript

  1. glass fi ber 𝕏 : glass fi ber (@glass fi

    ber2023) w $SFBUPS%JWJTJPO%4FDUJPOJ04ΤϯδχΞ w 1BTUFMBͷJ1BE޲͚ΞϓϦ։ൃΛ୲౰ w ೥݄த్ೖࣾ w લ৬͸ήʔϜ։ൃऀ 14 9CPY J04 8JOEPXT
  2. ม਺΁ͷΞΫηε 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Ͱѻ͑Δ஋ʹ͢Δ σόοΨͷ৘ใ
  3. ը૾Λม׵͢Δ 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Λىಈ ྫ֎ॲཧ(লུ)
  4. ίϚϯυͱͯ͠ొ࿥͢Δ • __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 ίϚϯυ໊ εΫϦϓτϑΝΠϧ໊
  5. Ԡ༻ɾωοτϫʔΫͰૹ৴͢Δ • Python͸ωοτϫʔΫΞΫηε΋ࣗ༝ࣗࡏ • ϩʔΧϧͰhttpαʔόʔΛಈ͔͠ɺૹ৴͢Δ • ϒϥ΢βͰࣗಈߋ৽͠ͳ͕Βදࣔ • ϒϨʔΫϙΠϯτͷઃఆ •

    ActionΛDebugger Commandʹͯ͠ ࡞੒ͨ͠ίϚϯυΛݺͿ • Automatically continue after evaluating actionsΛ༗ޮʹͯ͠ࢭ·Βͳ͍Α͏ʹ͢Δ