Можно ли подключиться к протоколу удаленного отладчика Mobile Safari с помощью python? - PullRequest
6 голосов
/ 22 декабря 2011

У меня есть приложение на базе HTML5, работающее на iOS, и я хочу подключиться к нему с помощью протокола удаленного отладчика webkit 1 , который теперь поддерживается в iOS 5 2 .

Я пытаюсь отследить проблему, из-за которой мое javascript-приложение вызывает сбой браузера (SEG_FAULT).Я хотел бы получить след приложения во время его выполнения, чтобы я мог видеть, какие строки или сетевые операции могут приводить к проблеме.Моя текущая идея состоит в том, чтобы написать приложение на python, которое будет подключаться к удаленному отладчику и продолжать проходить через код и собирать информацию в файл журнала, пока я взаимодействую с приложением.

Я столкнулся с первоначальным препятствием, хотя этоЯ не могу найти никаких примеров или документации о том, как подключиться к отладчику и общаться, или даже если это возможно.

Кто-нибудь знает, возможно ли это, и если да, то можете ли вы указать мне на некоторую документацию и /или пример кода?


На основе приведенного ниже кода я создал проект на github, чтобы проверить некоторые идеи.Вы можете найти его здесь: abierbaum: / python_webkit-remote_debugger

1 Ответ

6 голосов
/ 28 декабря 2011

Да, если вы включили инспектор в вашем UIWebView, следуя инструкциям, у вас должна быть возможность подключиться к нему из Python. Я поиграл с этим и выяснил, как отправлять и получать команды с помощью веб-сокета. Вот скрипт для Python 2.7, использующий websocket-client

import json
import socket

from websocket import WebSocket


ws = WebSocket()

# if ipv6
ws.io_sock = ws.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
ws.connect("ws://localhost:9999/devtools/page/1")

counter = 0

def send(method, params):
  global counter
  counter += 1
  # separators is important, you'll get "Message should be in JSON format." otherwise
  message = json.dumps({"id": counter, "method": method, "params": params}, separators=(',', ':'))
  print "> %s" % (message,)
  ws.send(message)

def recv():
  result = ws.recv()
  print "< %s" % (result,)

send('Runtime.evaluate', {'expression': 'alert("hello from python")'})
recv()

Используется функция Runtime.evaluate для отображения предупреждения.

Я попытался запустить его на MobileSafari, запущенном в симуляторе, и он работал нормально. Я заметил две важные вещи:

  • удаленный сервер связан с портом IPv6, а websocket-клиент не подключился без линии для переопределения сокета и установки семейства. Не уверен, что он будет работать на устройстве или в UIWebView.
  • ему не нравятся пробелы вокруг разделителей в JSON.

Вот как выглядит включение инспектора в MobileSafari с использованием gdb и запуск скрипта:

$ ps x | grep MobileSafari
 4968   ??  Z      0:00.00 (MobileSafari)
 6234   ??  S      0:00.69 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk//Applications/MobileSafari.app/MobileSafari
 6238 s007  R+     0:00.00 grep MobileSafari
$ gdb
GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Thu Nov  3 21:59:02 UTC 2011)
...
(gdb) attach 6234
Attaching to process 6234.
Reading symbols for shared libraries . done
Reading symbols for shared libraries ........................................................................................................................................................ done
0x99798c22 in mach_msg_trap ()
(gdb) p (void *)[WebView _enableRemoteInspector]
$1 = (void *) 0x2ac93ce
(gdb) detach
Detaching from process 6234.
(gdb) quit
$ python debug.py 
> {"params":{"expression":"alert(\"hello from python\")"},"id":1,"method":"Runtime.evaluate"}
< {"result":{"result":{"type":"undefined","description":"undefined"}},"id":1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...