2011-12-22 43 views
6

我有一个在iOS上运行的基于HTML5的应用程序,我想使用iOS 5 2现在支持的webkit远程调试器协议1连接到它。是否可以使用python连接到Mobile Safari远程调试器协议?

我想追查一下我的JavaScript应用程序很难崩溃浏览器(SEG_FAULT)的问题。我希望在应用程序执行时追踪它,以便我可以看到哪些行或网络操作可能导致此问题。我目前的想法是编写一个python应用程序,该应用程序将连接到远程调试器,并在与应用程序交互时继续浏览代码并将信息收集到日志文件中。

我遇到了一个初始障碍,虽然我找不到任何有关如何连接调试器和进行通信的示例或文档,甚至是可能的。

有谁知道这是否可能,如果有的话,你可以指点我一些文档和/或示例代码?


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

+0

我已经研究过这多一点,这听起来像它应该有可能我做不到找到任何提供良好起点的文档。一旦我找到“连接到这个端口并说出这个协议”,那么我想我可以从那里拿走它。 – Allen 2011-12-23 13:53:07

回答

6

是的,如果你已经按照说明在UIWebView中启用了检查器,那么应​​该可以从Python连接到它。我玩弄了它,并想出了如何使用Web Socket发送和接收命令。下面是使用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函数来显示警报为Python 2.7的脚本。

我试着运行它在模拟器中运行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} 
+0

太棒了。你有没有做任何来自远程端的通知。 (例如查看Network.requestWillBeSent通知的实时列表,以便查看浏览器即将请求的内容) – Allen 2011-12-28 00:45:48

相关问题