是否可以使用python连接到Mobile Safari远程调试器协议?



我有一个基于html5的应用程序在iOS上运行,我想使用webkit远程调试器协议1连接到它,现在在iOS 5.2中支持。

我试图追踪一个问题,我的javascript应用程序是硬崩溃的浏览器(SEG_FAULT)。我想在应用程序执行时跟踪它,这样我就可以看到哪些行(s)或网络操作可能导致问题。我目前的想法是编写一个python应用程序,它将连接到远程调试器,并在我与应用程序交互时继续逐步执行代码并收集信息到日志文件。

我遇到了一个最初的障碍,虽然我找不到任何例子或文档关于如何连接到调试器和通信,甚至如果它是可能的。

有没有人知道这是可能的,如果是的话,你能给我指出一些文档和/或示例代码?


基于下面的代码,我在github上创建了一个项目来测试一些想法。你可以在这里找到它:abierbaum:/python_webkit-remote_debugger

是的,如果你按照说明在UIWebView中启用了检查器,应该可以从Python连接到它。我摆弄了一下,弄清楚了如何使用Web Socket发送和接收命令。下面是一个使用websocket-client

的Python 2.7脚本
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()

使用运行时。求值函数以显示警告。

我试着在模拟器中运行它对MobileSafari,它工作得很好。我注意到两件重要的事情:

  • 远程服务器绑定到IPv6端口,websocket-client没有连接到覆盖套接字和设置家族的线路。不确定在设备上运行或在UIWebView中运行是否相同。
  • 它不喜欢JSON中分隔符周围的空格
下面是使用gdb在MobileSafari中启用检查器并运行脚本的样子:
$ 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}

最新更新