Debugging tools

There are several ways to debug Jami from a developer perspective, depending on what is required to be debugged.

林业

The first way is to use runtime loggers. Starting jami with -d will enable logging by the daemon (or the Troubleshoot section in the General settings). All logs are not enabled by default, as Jami uses several libraries. However, passing environment variables enables logs:

  • SIPLOGLEVEL=5 enables logs from PJSIP.

  • DHTLOGLEVEL=5 enables logs from OpenDHT.

  • AVLOGLEVEL=50 enables logs from ffmpeg.

调试器

Generally, the IDE has an embedded debugger. Otherwise, gdb can be used, for example, to be able to add breakpoints, backtraces from crashes, print internal structures, etc. To get debug symbols, it is required to compile the project in DEBUG mode.

几个有用的命令:

  • b file.cpp:line - add a breakpoint (file.cpp:line can be replaced by a symbol)

  • t a bt - (线索应用所有后轨) 获得所有后轨

  • Ctrl + X / A - 在图形视图中通过

  • p - 打印一个内部值.

備註

Visual Studio Code is fully supported by Jami and can be used to debug the project.

个人资料

Debuggers are useful, but they do not show real-time memory consumption/network activity/CPU usage. For this, an embedded profiler in the (Android Studio, Qt Creator/Visual Studio, etc.) IDE can be used.

AddressSanitizer

AddressSanitizer can be useful to detect leaks, crashes, and potential deadlocks at runtime. To enable this, compile the daemon with CXXFLAGS+="-fsanitize=address". Other flags like tsan may be useful.

瓦尔格林德/卡尔格林德

Valgrind is a tool to watch allocations, CPU usage, and more and can be used via: valgrind --tool=callgrind ./jami -d. This will make the application very slow but can provide useful reports about memory allocation/performance usage (KCacheGrind can be used to read reports).

代理

测试只使用一个黑龙机来模拟两个同行.因此在各种环境中测试可能很难.另一个可能性是写一个场景并运行一个代理 (文件可在黑龙机的库中使用).

Finally, tracepoints can be created and analyzed. daemon/tools/trace provide the documentation and some examples. The advantage of LTTng is that it is quicker than logs, can be triggered by system events and can be used with tracepoints already present in the kernel (so that it can be used with tracepoints from network interfaces).

测试

Both clients and daemon have tests. Coverage is enabled. Daemon’s tests are written in C++ and use the cppunit framework. They are located in the daemon/tests directory. If the daemon is statically built (else the private symbols will be unavailable), adding new tests can help to reproduce bugs, solve bugs, and avoid any regression.