Debugging and diagnosis strategies¶
This section brings together resources of interest to debug and diagnose problems be it tools, tricks, or strategies.
Some useful links¶
Edit CMake code from within Visual Studio: http://cmaketools.codeplex.com/
Python and Hybrid Python/C++ integration in Visual Studio: https://github.com/Microsoft/PTVS
Hybrid debugging of Cython code on Linux with cygdb: http://docs.cython.org/en/latest/src/userguide/debugging.html
Attach to Running Processes with the Visual Studio Debugger: http://msdn.microsoft.com/en-us/library/3s68z0b3.aspx?ppud=4
Legacy code¶
Code_TYMPAN can still be run with the legacy code (i.e. without Python subprocess and without the solver data model) with the following option: –legacy-computation
Note
This is a temporary feature provided in order to ease the debugging and it should soon be removed.
Diagnose a computation failure¶
Look at the logs¶
Three logs are available:
A log is produced by
TYMessageManager
/OMessageManager
: before the GUI starts it is displayed in the console (if it exists) and then it is displayed in theMessages
frame of the GUI (on the left).This logger checks _DEBUG preprocessor macro to write Debug messages only in Debug.
Warnings (from module warnings) and errors thrown by Python subprocess, also appear in
Messages
frame. Whenfilter_out
function parameterverbose
is set toFalse
, warnings are filtered out fromMessages
frame, and errors still appear.While solving the acoustic problem, the Python subprocess also generates a log. It is written in the file “tympan.log” and created in the current directory (which is the directory containing the XML project in the case of the computation of an existing project).
The elements logged in this file comes from logging python package. So the file contains elements logged by python Tympan code, but also by other python packages, like shapely or matplotlib. This log is configured in “solve_tympan_project.py” and in “process_site_altimetry.py”. Currently, the logging level is set to
DEBUG
. It would be interesting to configure the log level by a configuration file as “bin/logging.conf” for instance. That way, the log level could be changed at run time. The default logging level should beINFO
.Still while running the subprocess, the log emitted by the C++ libraries (produced by
OMessageManager
) is kept but redirected to the console. It would be interesting to redirect these logs to python logging system rather than directly to the console.
stdout filter_output
:
The python ContextManager
filter_output
, redirects outputs to stdout to os.devnull, thus filtering them out. This ContextManager takes a parameterverbose
. Whenverbose
is set toFalse
, outputs are filtered, when it is set toTrue
, outputs are displayed on stdout.As it is using a low-level redirection, it is very important to define the environment variable
PYTHONLEGACYWINDOWSSTDIO
.When launching a python tympan script like
solve_tympan_projet.py
,verbose
should be by default set to :False
in Release GUI mode,True
in Debug GUI mode and in Python API mode.This parameter
verbose
could also be deduced from the “bin/logging.conf” file rather than being hard-coded.Finally, if all the logs from C++, Cython and Python were correctly redirected to Python logging system and were correctly handled by it, we could go without
filter_output
.
Did you correctly generate your build files ?¶
A good practice is to make a directory per build configuration (Debug/Release), and not to compile in both configurations in the same directory. Under Windows, when you use cmake-gui to generate Code_TYMPAN.sln, choose whether your build will be a Debug or a Release one, and then stick to it (don’t change this option from Visual Studio).
It is important because this CMake parameter is used to configure environment variables, that will reference the debug or release version of the generated libraries.
Is the environment correctly configured ?¶
The following environment variables are needed by Code_TYMPAN, and some of them
are directly set in the code (see Tympan/gui/app/EnvironmentUtils.h
):
PYTHONPATH
: should contain the directory of cython librarypytam.so
/pytam.pyd
(i.e.cython
in release mode,cython_d
in debug mode). It is set by TYMPAN executable when running it from the install directory, and by CMake when running the tests with ctest from the build directoryPath to libraries:
Under Windows, as TYMPAN libraries are statically linked to the executable, there is nothing to do regarding this point. However, this is not the case of the 3rd party libraries. When running Code_TYMPAN legacy code, as these libraries are in the same directory as
Tympan.exe
, they are found. But when trying to access them through cython library which is located in another directory it is not the case. That is why thePATH
environment variable must contain this directory. It is set by TYMPAN executable when running it from the install directory, and by CMake when running the tests with ctest from the build directoryUnder Linux, TYMPAN libraries are dynamically linked to the executable and therefore the
LD_LIBRARY_PATH
environment variable must indicate where to find them. This is not done in Code_TYMPAN and must be set by the user.
Path to Python interpreter (Windows specific): to run the Python script, the complete path to the Python interpreter is needed (
python solve_tympan_project.py
is not interpreted). Yet, there is no standard under Windows regarding where to install python, so this path cannot be known from Code_TYMPAN. That is whyTYMPAN_PYTHON_INTERP
environment variable must be set by the user (for example: “C:\Python27\python.exe”). If it is not set, this error will appear in the TYMPAN log: “Can’t access python interpreter. TYMPAN_PYTHON_INTERP environment variable is not set.” If the environment variable exists but does not lead to the python interpreter, the following message will be logged: “Can’t access python interpreter. TYMPAN_PYTHON_INTERP environment variable is not correctly set.”Path to CGAL bindings python libraries (used in altimetry computations): it must be whether in the PYTHONPATH or in the CGAL_BINDINGS_PATH dedicated environment variable.
Tympan debugging options¶
The ‘TYMPAN_DEBUG’ environment variable is read from both python and C++ code,
and can be used to enable some debug options (format: TYMPAN_DEBUG=opt1;opt2;opt3
).
The following options are taken into account:
interactive : when solve_tympan_project.py is called from an interactive terminal, pdb (python debugger) is invoked in this script and the ID of the python process running the script is displayed in the terminal. The script execution is therefore paused, waiting for an user entry. It makes it possible to attach the python process to a debugger (MSVC debugger under Windows, for example), and then enter run in the terminal to start the script execution and thus C++ code debugging.
keep_tmp_files: when Tympan executable is run, the input and output temporary files used to communicate with the subprocesses running python scripts (in charge of running an acoustic simulation or of computing the site altimetry) are not removed when the subprocess returns, and their paths are displayed by Code_TYMPAN logging system.
monothread : disables the multithreading, computations will be run with just one thread.
Known bugs¶
If
Pythonx,y - mingw
is in the path under Windows, it corrupts the environment and Code_TYMPAN’s behaviour isn’t guaranteed (more particularly, the Python scripts may crash).