blob: 8af91d869371a6005c0c7287098b2fed69c3bfa3 [file] [log] [blame]
* weinre is available under *either* the terms of the modified BSD license *or* the
* MIT License (2008). See for full text.
* Copyright (c) 2010, 2011 IBM Corporation
<p>This page describes how to use <span class="weinre">weinre</span> to debug
your own web pages on a remote device.
<p>First, some background.
<!-- ======================================================== -->
<p>When using <span class="weinre">weinre</span>, there are three programs interacting with
each other.
<dl class="spaced">
<dt>Debug Server
<dd>This is the HTTP server that you run from the <tt>weinre.jar</tt> file
or the Mac application. It's the HTTP server that's used by the
<b>Debug Client</b> and <b>Debug Target</b>.
<dt>Debug Client
<dd>This is the Web Inspector user interface; the web page which
displays the Elements and Console panels, for instance.
<dt>Debug Target
<dd>This is your web page that you want to debug. This
name (Debug Target) is also used to refer to the machine
running the browser displaying the web page. Since a design
point of <span class="weinre">weinre</span> is to allow
debugging applications on mobile devices, the debug
target, when speaking of the machine, is your mobile
<p>Both the <b>Debug Client</b> and the <b>Debug Target</b> communicate to
the <b>Debug Server</b> via HTTP using <tt>XMLHttpRequest</tt> (XHR).
<p>Typically, you run both the <b>Debug Client</b> and the <b>Debug Server</b>
on your desktop/laptop, and the <b>Debug Target</b> on your mobile device.
<p>When using the Mac application, the
<b>Debug Client</b> and <b>Debug Server</b> are running
in the same process.
When you launch the application,
the server starts, and then the browser included in the
application is launched
on the appropriate URL automagically.
<p>When using the <tt>weinre.jar</tt> program instead
of the Mac application, only the <b>Debug Server</b>
is started. You will need to launch the <b>Debug Client</b>
in a web browser.
<p>The <b>Debug Target</b> is the squirrelliest bit. You
will need to arrange to inject some JavaScript code, provided
by the <b>Debug Server</b>, into your web page, in order for it
to function as a <b>Debug Target</b>.
<!-- ======================================================== -->
<h2>Starting the debug server</h2>
<p>There are two ways to run the <span class="weinre">weinre</span> debug server:
<li>Running the debug server using the weinre.jar file
<li>Running the debug server using the Mac application
<!-- ======================================================== -->
<h2>Running the debug server using the weinre.jar file</h2>
<p>To run <span class="weinre">weinre</span> from the jar file,
execute the following command:
java -jar path/to/weinre.jar [options]
<p>Options available are:
<ul class="spaced no-bullet">
<li><tt>--help</tt> (or <tt>-?</tt> or <tt>-h</tt>)
<div class="indent">
<p>Display this help.
<li><tt>--httpPort [portNumber]</tt>
<div class="indent">
<p>The port to run the HTTP server on.
<p>Default: <tt>8080</tt>
<li><tt>--boundHost [hostname | ip address | -all-]</tt>
<div class="indent">
<p>The ip address to bind the server to.
<p>Default: <tt>localhost</tt>
<p>With the default of <tt>localhost</tt>, you won't be able to access
the server from any machine other than the one the server is running on. You will
need to bind to another hostname / ip address to make the server accessible to other
machines. You can use the value <tt>-all-</tt> to indicate that you
want to bind to all interfaces available on the current machine.
<p>Use <tt>ifconfig</tt> on Linux or the Mac, and <tt>ipconfig</tt>
on Windows, to get the ip addresses available on your machine.
<li><tt>--verbose [true | false]</tt>
<div class="indent">
<p>Causes jibberish to be written to stdout
<p>Default: <tt>false</tt>
<li><tt>--reuseAddr [true | false]</tt>
<div class="indent">
<p>Sets the "reuseAddr" flag for Jetty.
<p>Default: <tt>false</tt>
<p>May be needed if you restart your server frequently.
<li><tt>--readTimeout [seconds]</tt>
<div class="indent">
<p>The number of seconds the server will wait for a message
to be available to send to the target or client.
<p>Default: <tt>5</tt>
<p>Can probably be set larger, but then your browser may
time out. Probably don't want to set it much lower than
this as it will cause additional network traffic when
no messages are being sent (it will cause more "empty"
messages to be sent).
<li><tt>--deathTimeout [seconds]</tt>
<div class="indent">
<p>The number of seconds to wait to hear back from a
debug client or target before declaring them dead.
<p>Default: <tt>3 * readTimeout</tt>
<p>Normally the default will be fine. However, if
you're debugging <span class="weinre">weinre</span> itself, you may wish to set
it much longer.
<p>You may also create a file named
<tt></tt> in the
directory <tt>.weinre</tt> in your
home directory (eg.
The keys should be
the same as the name of the options above,
with the same values.
<p>As an example, your <tt>~/.weinre/</tt>
file might look like this:
boundHost: -all-
httpPort: 8081
reuseAddr: true
readTimeout: 1
deathTimeout: 5
<p>Command-line options override the options specified in the
<tt>~/.weinre/</tt> file.
<p>The server will run until you kill it. Control-C will do the job.
<!-- ======================================================== -->
<h2>Running the debug server using the Mac application</h2>
<p>Go back and read the description above about the weinre.jar settings.
<p>Only the <tt>~/.weinre/</tt>
file is available to configure the server, as there is no
traditional command line used to launch Mac "applications".
<p>The server will run until you quit the application.
<p>Since there is no practical way to see the stdout and stdin
from the server when running a Mac application, these streams
are intercepted and displayed in the <b>Server Console</b>
tab in the Mac application.
<p>The Mac application also displays the server's home page
in a separate tab.
<!-- ======================================================== -->
<h2>Running the debug server bound to something other than <tt>localhost</tt></h3>
<p>Since the web page you want to debug (the debug target) is probably running on
a different machine (your mobile device) than the debug server (your desktop / laptop),
you <b>can't</b> use the
default <tt>localhost</tt> value for the <tt>--boundHost</tt>
option. Instead, you will need to specify a host name / ip address
with the <tt>--boundHost</tt> option. This host name / ip address
must be accessible to the machine you want to use as the
debug target.
<p>To get started, you can use the value <tt>-all-</tt> for the
<tt>--boundHost</tt> option.
<p>Now you'll need to figure out what host name / ip address the
debug target should use. If you've use the
<tt>--boundHost -all-</tt> option, then bring up the debug client
using the URL <tt>http://localhost:[portNumber]/client/</tt>
from the same machine the debug server is running on. On that
page, under <b>Server Properties</b>, is a list of bound hosts
that the server believes it's available on.
<p>From the debug target device (eg, your mobile device),
try accessing the server home page
from all of those host names, using the URL
<tt>http://[host name / ipaddress]:[portNumber]/</tt>.
Once you find one
that displays the server's home page correctly, remember
that host name / ip address, we'll be using it in a minute.
<div class="note">
<p>When you run the debug server with a bound host other than
<tt>localhost</tt>, by definition other machines can now access
your debug server. See the <a href="Security.html">Security page</a>
for information on how to protect yourself.
<!-- ======================================================== -->
<h2>Instrumenting your web page to act as a debug target</h3>
<p>At this point you now have a URL to the debug server which
will be accessible from the debug target. Let's say that URL
(to the debug server's home page) is:
<p>To make your web page debuggable with <span class="weinre">weinre</span>,
add the following line to your web page:
&lt;script src="http://a.b.c:8081/target/target-script-min.js"&gt;&lt;/script&gt;
<p>You can now open a debug client by browsing to
(or probably
as well) on your desktop/laptop,
then reload your newly instrumented web page on your mobile device,
and see the two connect in the Remote panel of the debug client.
<!-- ======================================================== -->
<h2>Hardcoding host names / IP addresses in your web page?</h3>
<p>Yeah, gross.
<p>Besides being gross, there are a few practical problems with hardcoding the
debug server address in your web page as well:
<ul class="spaced">
<li>Your html file is probably stored in an SCM, and you
don't really want to be storing that address in the SCM.
It won't work for other people using that html file,
for instance.
<p>But you don't want to be keeping the
<tt>&lt;script src=""></tt> line in your SCM either.
You should look for a way, as part of your personal
build process to add that line only for development
builds, and presumably with a user-customizable URL.
<li>The URL the debug server runs on may be
different depending on your location. At work, you may use
one IP address and host name; at home, you likely have a different
IP address and host name. You may not have a host name at all,
just an IP address (which is fine - a host name isn't required,
but usually makes things easier). You may be running on a
dynamically assigned IP address, in which case your IP
changes every time you log into your network.
<p>One way out of the dilemma is to use a dynamic
DNS solution for the the machine you run the debug server on.
Doing a web search on the following terms will provide you
some links to such services:
<a href="">dynamic dns static hostname</a>
<p>If you use one of these dynamic DNS services, you
can arrange to use the same host name for your debug server
no matter what network you are connected to.
<!-- ======================================================== -->
<h2>Using a bookmarklet</h2>
<p>Some platforms support 'bookmarkets', which allow you to inject
arbitrary JavaScript code into any web page running in your
browser. Mobile Safari is one of these browsers. It appears that
the browser shipped with Android 2.2 and later also supports bookmarklets.
<p>Unfortunately, installing bookmarkets on mobile devices isn't usually trivial. The easiest
course of action is to add a new random bookmark to your bookmarks,
and then edit it by hand to change the label and URL. The URL
you should use is available in both a 'pre' and 'textarea' section
of the server's home page (eg, http://localhost:8081/). You should
be able to select the text from one of these areas easily, to
paste into the previously added bookmark.
<p>Once the bookmarklet is installed, you can debug any web page
by visiting it, and selecting the bookmarklet from your bookmarks
<!-- ======================================================== -->
<h2>Using the <tt>target/target-script-min.js</tt> file statically</h2>
<p>If you'd like to use the debug target code statically, instead of
downloading it from the server all the time, then you will need to do
one more thing. The debug target code computes the address of the
debug server from the <tt>src</tt> attribute in the
<tt>&lt;script&gt;</tt> tag, and it won't
be correct in the static case. Instead you can set the
following variable to be the URL of the debug server:
<p>This URL overrides what's otherwise calculated from the debug target
code itself. You will need to set this value before the
<tt>target/target-script-min.js</tt> script is loaded.
<!-- ======================================================== -->
<h3>Future Enhancements</h3>
<p>The calculation of the debug server url by the debug target is a bit fragile and
ham-fisted. We should look at additional ways to handle this.
For instance, we could prompt the user for the debug server
address, and then always using the debug target in a more static
mode; eg, you'd include the <tt>target-script-min.js</tt> with all your
other files in your application.
<p>Running the debug server on the target device is another option.
This shouldn't be a huge problem for Android, but is more of a problem
on iOS. By running the debug server on the target device, the
debug target can always connect to the debug server by using a
<tt>localhost</tt> hostname. The debug client, running on your
desktop/laptop, would then need to connect to the target device
to debug. In practice this may be an easier scenario to work with,
as the potentially changing IP address of the mobile device just
means having to type a different URL in your web browser on your desktop / laptop
when running the debug client. That's easier than hard-coding
URLs in your web page, for instance.