**Look into Palanteer and get an omniscient view of your program** Improve software code quality - C++ and Python
- **Simple tracing of meaningful atomic events** - Time scopes, variable values, locks, logs, memory allocations, context switches... - Global structure from the event hierarchy - Typed (string, timestamp, float, integer...) - C++ - Compile-time selection of per-user [groups of events](base_concepts.md.html#c++specific/groups) - [Very low](#c++instrumentationperformance) overhead, typically few nanoseconds - [Automatic instrumentation](getting_started.md.html#quickc++automaticfunctionsinstrumentation) with `-finstrument-functions` flag (GCC only) possible - Python - [Automatic instrumentation](instrumentation_api_python.md.html#automaticinstrumentationwithoutcodemodification) of functions enter/leave - Automatic tracking of interpreter memory allocations - Automatic tracking of all raised exceptions - Automatic tracking of garbage collection runs - Automatic tracking of coroutines | ![Hierarchical scopes with graphable inner variables](images/scope_with_inner_variables.gif width=80%) ![High precision - nanosecond order](images/nanosecond_precision.gif width=80%) |
- **Lock usage tracking** - Explicit threads' battle for locks - Who is blocked by whom and for how long | ![Lock usage tracking](images/lock_contention.gif width=80%) |
- **Memory usage tracking** - Detect allocation hot spots, big allocators, temporary allocations... - Leak detection (based on traced events) | ![Memory usage tracking with hot spots - here, typical temporary allocations](images/memory_spike.gif width=80%) |
- **Visualization of the data from the best vantage point** - Smooth and interactive experience on a standard computer - Even with huge records - Many kinds of views to cover many kinds of needs - Timelines for CPU, timeline for memory, flame graphs, lock contention, context switch, curves, histograms... - Flexible layouts - Drag&drop support - No limit on view quantity - Can be saved and recalled later | ![Example of layout](images/views.gif width=80%) |
- **C++: Better assertions, [enhanced with provided context](#enhancedassertions)** - Just add variables or expressions as extra parameters - Compile-time selection of user defined groups of assertions | ![Command line: dump of a failed enhanced assertion](images/crash_shell.png width=80%) |
- **C++: [Stack trace](instrumentation_configuration_cpp.md.html#pl_impl_stacktrace) dumping** - Displayed in the terminal - Recorded with all events before crash - Available global context ease crash investigations | ![Logged stack trace in the viewer](images/crash_scope.png width=80%) |
- **C++: Full leveraging of [static strings](base_concepts.md.html#staticanddynamicstrings)** - Identified and hashed at compile time, no runtime cost - ["External strings"](getting_started.md.html#quickc++externalstringconfiguration): full stripping of instrumentation static strings from the binary - Benefit: code size reduction and instrumentation obfuscation - Strings are resolved with an external lookup generated from the code (tool provided) | ![Test program without external strings](images/no_external_string_effect.png width=80%) ![Test program with external strings - smaller text section, no more instrumentation strings](images/external_string_effect.png width=80%) |
**Easy [scripting](getting_started.md.html#quickremotescripting) of the stimulation and observation** - Elaborate deep and reliable system tests - Stimulate with CLIs (remote commands from instrumentation), monitor via events - Automate the extraction of performance indicators - Scripting language is Python - Scripts are independent of the program's implementation language | ![Small functional scripted test](images/scripting.png width=80%) |