blob: 6c32e7a116417c6519cdbbb1d81716ea63195548 [file] [log] [blame]
Neels Hofmeyrc0827c42017-04-23 15:04:19 +02001[[debugging]]
2== Debugging
3
Pau Espin Pedrol8ccd99a2020-03-16 19:48:02 +01004{app-name} is a complex program which at the same time orchestrates sets of
5other complex programs to form a network of nodes. As such, it can be sometimes
6challenging to find out what is going on during a trial run. This section aims
7at providing some tips on how to debug possible issues.
8
9=== Logging level
10
11{app-name} runs by default under 'info' log level. As a first debugging step, it
12is always a good idea to increase log verbosity. By switching to debug level
13(command line argument '-l dbg'), a lot more information and events are displayed which
14can give a much better idea to understand possible misconfigurations or wrong
15steps.
16
17In any case, {app-name} usually provides several log files of interest. In
18general, both a 'log' and a 'log_brief' are stored directly under the trial's
19run directory, the first containing output up to debug level included, while the
20second contains output up to info level included. Furthermore, {app-name} writes
21a debug level log file per test case under each test's run directory.
22
23It is also in general useful to enable the '-T' command line argument. By using
24it, it will instruct {app-name} to write the full backtrace to the log output
25when something wrong happens, such an unexpected exception.
26
27[[pdb]]
28=== python debugger
29
30{app-name} can be further debugged using python's debugger 'pdb'. Easiest way to
31use it is to modify the python code were you want to break and add this code:
32----
33import pdb; pdb.set_trace()
34----
35
36When {app-name} runs over that code, it will pause and provide a debugging
37interactive shell, where one can inspect variables, execute code, etc.
38
39TIP: Remember {app-name} is managed by its internal main loop, meaning if you
40jump into a debugger console you will still need to give back control to the
41main loop for events to be processed and checks done. That can be done for
42instance by calling the 'MainLoop.sleep(log_obj, secs)' internal API in general
43or `sleep(secs)' under test context.
44
45=== debug suite
46
47Sometimes, however, one may be interested in debugging the behavior of the
48software under test by {app-name} rather than {app-name} itself. For instance,
49one may simply want to set up a full running network of nodes and keep it up
50until some manual tests are done, or one may want {app-name} to do so at a given
51point of time.
52
53To fulfill this kind of scenarios, {app-name} provides some code available for
54tests to gain access to a high-level interactive console which is fully
55integrated with {app-name}'s own main loop. So the approach here is usually to
56write a regular test (with its corresponding <<suite_conf,suite.conf>>) to set
57up and run all required processes and then allow it to jump into the interactive
58console instance. Then the test pulls received commands from it and it is
59responsible for parsing and implementing them. One command can for instance ask
60a modem to send an sms to another. Another command can for instance jump into a
61<<pdb,debugger console>>.
62
63The interactive console is available to tests through the 'prompt' method, and
64its implementation can be found under 'method input_polling' in 'util.py'.
65
66An interactive console example as explained in this section can be found under
67the 'debug/interactive.py' test in osmo-gsm-tester.git.