massif-visualizer Syndicate content

warning: Creating default object from empty value in /www/htdocs/w0065fc9/milianw/modules/taxonomy/ on line 33.

» Heaptrack - A Heap Memory Profiler for Linux

Tue, 12/02/2014 - 19:25

Hello everyone,

with a tingly feeling in my belly, I’m happy to announce heaptrack, a heap memory profiler for Linux. Over the last couple of months I’ve worked on this new tool in my free time. What started as a “what if” experiment quickly became such a promising tool that I couldn’t stop working on it, at the cost of neglecting my physics masters thesis (who needs that anyways, eh?). In the following, I’ll show you how to use this tool, and why you should start using it.

» Massif-Visualizer 0.4 and KGraphViewer 2.2 Released!

Mon, 11/17/2014 - 17:53

Hello all!

I’m happy to (finally!) announce the release of the latest stable versions of Massif-Visualizer and KGraphViewer:

Both versions come filled with bug fixes, cleanups and performance improvements. Everyone is urged to update!

Cheers and many thanks to all contributors.

» Massif-Visualizer 0.4 Beta 1 and KGraphViewer 2.2 Beta 1 Released!

Wed, 06/25/2014 - 13:44

Hey all,

I’m happy to announce the availability of two new betas: Massif-Visualizer 0.4 Beta 1 and KGraphViewer 2.2 Beta 1!


If you want to test this release, you can download the tarballs from the KDE mirrors:

Download Massif-Visualizer 0.4 Beta 1

  1. md5 sum: 2953089078bd2170ad9d2d583c7c8b95 massif-visualizer-0.3.90.tar.xz
  2. sha1 sum: 6d76134b1b41b887ba595a0585f941d22e066b76 massif-visualizer-0.3.90.tar.xz
  3. sha256 sum: 9940fa90137ca5eef08b9ec220825fadbf03db423a670a2c7fe3edab271d9922 massif-visualizer-0.3.90.tar.xz

Download KGraphViewer 2.2 Beta 1

  1. md5 sum: b3a18cbaf661d1cf186b3a3674c31186 kgraphviewer-2.1.90.tar.xz
  2. sha1 sum: 4f0cb86f01eb9725191a79291cbd75061682ca69 kgraphviewer-2.1.90.tar.xz
  3. sha256 sum: 1ae74c1a51e252e88afb7a3d7864fc1bc6326c191ad36c89cc7fab7e8a96f08f kgraphviewer-2.1.90.tar.xz
Notably Changes

These beta releases come packed with a lot of important changes. KGraphViewer finally supports newer GraphViz packages and includes many performance optimizations and other bug fixes. Massif-Visualizer saw a lot of code cleanup and a few visual changes, which make it possible to open multiple files at once in the same window.

Thanks go out to all contributors, who made this release possible!

Massif-Visualizer Changelog
  • Milian Wolff: Centralize version handling and set version to 0.3.90 for beta release
  • Milian Wolff: Replace empty string literals with explicit empty string/byte array.
  • Milian Wolff: Cleanup the cmake code around our internal helper libs a bit.
  • Milian Wolff: Cleanup, use .at(0) instead of first() as that is guaranteed to never detach.
  • Milian Wolff: Optimize: force the use of the const overload of QVector::first.
  • Milian Wolff: Constify the data pointers where possible.
  • Yuri Chornoivan: Fix typo
  • Arnold Dumas: Don’t enable ‘reload’ action when no document has been loaded.
  • Burlen Loring: Implement logic to save current document as an image.
  • Burlen Loring: Add logic to control legend position and font size.
  • Milian Wolff: Don’t assert when kgraphviewer part is not available at runtime.
  • Milian Wolff: Update detailed graph view when changing selection in the tree view.
  • Arnold Dumas: Keep the displayed toolbar up to date with the current tab. REVIEW: 117752
  • Milian Wolff: Add myself as an author as well and fixup bugs address to direct to our mailing list.
  • Arnold Dumas: Add myself in the about dialog. While at it, update my e-mail.
  • Arnold Dumas: Remove broken useless connection.
  • Arnold Dumas: Support loading kgraphviewer via KPluginFactory. REVIEW: 117375 BUG: 332833
  • Arnold Dumas: Update my e-mail address.
  • Milian Wolff: Require cmake 2.8.9 as minimum version.
  • Milian Wolff: Require KDE 4.7.0 as minimum for KMessageWidget
  • Milian Wolff: improve backwards compatibility by using non-forward include for KMessageWidget.
  • Arnold Dumas: Fix spelling mistakes reported by Krazy2.
  • Arnold Dumas: More coherence when navigating through different documents. REVIEW: 114404
  • Arnold Dumas: Fix crash when changing the stack number value with an invalid document loaded.
  • Arnold Dumas: Disable printing when the document hasn’t be properly loaded.
  • Milian Wolff: Hide callgraph toolbar if we don’t show the callgraph currently.
  • Milian Wolff: Cleanup includes, use forward declarations in header.
  • Milian Wolff: Don’t use modal dialog to show parse errors.
  • Milian Wolff: Properly restore current index after file reload.
  • Milian Wolff: Disable stop parser only when no parsers are running.
  • Milian Wolff: Make helper functions static for file-local linkage.
  • Milian Wolff: Don’t access parseWorker API after deleteLater call.
  • Milian Wolff: Cleanup UI if we do not have KGraphViewer available.
  • Milian Wolff: Fixup issues after recent move to MDI.
  • Milian Wolff: Make compile when one has an outdated kgraphviewer available.
  • Arnold Dumas: Implementation of multiple document interface. REVIEW: 113523
  • Arnold Dumas: Remove unused or unnecessary includes. REVIEW: 113489
  • Arnold Dumas: Delete the print preview dialog just after it has been closed. REVIEW: 113288
  • Arnold Dumas: Add myself in the AUTHORS file.
  • Arnold Dumas: Add a preview dialog before printing. REVIEW: 113130
  • Arnold Dumas: Fix one more warning.
  • Arnold Dumas: Fix crash when toggling “Shorten templates” action without any proper massif document loaded. REVIEW: 113122
  • Arnold Dumas: Fix five warnings. REVIEW: 113106
  • David Faure: Fix compilation with -DQT_STRICT_ITERATORS
  • Milian Wolff: ups, add missing hunk, fixes compilation
  • Milian Wolff: Make it possible to print the massif data.
  • Milian Wolff: Use full horizontal space in chart
  • Milian Wolff: Minor cleanups
  • Milian Wolff: Kill QList usage with fire.
  • Milian Wolff: Refactor threaded parsing, use long lived worker pattern.
  • Milian Wolff: Fix double deletion in hideFunction.
  • Milian Wolff: Properly parse labels for functions, locations, addresses
  • Milian Wolff: add missing test data
  • Milian Wolff: add stack-profile test data
  • Milian Wolff: Support massif memory stack profiles.
  • Milian Wolff: Increase compatibility with older Qt versions.
  • Milian Wolff: show memory in kilobytes instead of bytes
  • Milian Wolff: remove top and left axes, instead increase font size of right and bottom axes
  • Milian Wolff: just show peak cost, without ‘Peak of …’ prefix
  • Milian Wolff: set monospace font on legend, left-align text
  • Yuri Chornoivan: Fix typo: remove->remote
  • Milian Wolff: fix crash when loading multiple files in parallel
  • Milian Wolff: optimize: .value() instead of .contains & operator[]
  • Milian Wolff: cleanup
  • Milian Wolff: optimize: leverage implitic QByteArray sharing to further reduce memory consumption
  • Milian Wolff: use something better for the fast-route tree filtering label
  • Milian Wolff: use contains check for custom allocators
  • Milian Wolff: optimize: filter for data tree model
  • Milian Wolff: properly show some progress values in the progress bar
  • Milian Wolff: actually make it possible to stop a parser run
  • Milian Wolff: load & parse massif files in a background thread
  • Milian Wolff: properly initialize to prevent crash in new dtor code
  • Milian Wolff: fix/workaround some memleaks in kdchart
  • Milian Wolff: fix memleak in tester
  • Milian Wolff: optimize: drastically reduce memory footprint by using QByteArray instead of QString
  • Milian Wolff: optimize: when we don’t have custom allocators, no need to find the function in the label
  • Milian Wolff: add simple debug utility to run massif parser on random files
  • Milian Wolff: move util.{h,cpp} to massifdata
  • Milian Wolff: optimize: use QHash instead of QMap if sort-order is not required
  • Milian Wolff: use quint64 for bytesizes to support memory > 4GB
  • Milian Wolff: properly calculate color based on accumulated max cost
  • Milian Wolff: kgraphviewer is optional
  • Milian Wolff: Relicense to GPL/LGPL v2.1 or 3 or anything later approved by KDE e.V.
  • Milian Wolff: add README/man page
  • Aurélien Gâteau: Link statically the kdchart lib
  • Aurélien Gâteau: Do not install internal static libs
  • Aurélien Gâteau: Remove need for an X server to run datamodeltest
  • Milian Wolff: merge below-threshold nodes
  • Milian Wolff: remove obsolete call
  • Milian Wolff: close file on shutdown to fix memleaks
  • Milian Wolff: make root item white, color is useless there
  • Milian Wolff: fix memleaks in unit test
  • Milian Wolff: properly find highest-cost node in callgraph node based on accumulated cost
  • Milian Wolff: merge tails of callgraph tree before generating the dot file
  • Michael Jansen: Qt 4.8: Resolve ambiguous overload (QVariant, QBrush)
  • Milian Wolff: set version to 0.4
KGraphViewer Changelog
  • Milian Wolff: Restructure and centralize the version handling.
  • Gael de Chalendar: Avoid a crash when using recent files list
  • Gael de Chalendar: Removed unused slotLoadLibrary
  • Gael de Chalendar: Remove unused member
  • Reimar Döffinger: Add horrible hack to work around reload issue.
  • Reimar Döffinger: Merge declaration and initialization.
  • Reimar Döffinger: Ensure m_g is initialized even if fopen fails.
  • Reimar Döffinger: Revert “Do not crash anymore on reload”
  • Gael de Chalendar: Make recent files list to be filled again
  • Gael de Chalendar: Do not crash anymore on reload
  • Gael de Chalendar: Handle a graphviz error
  • Milian Wolff: Optimize: Cache string keys used for attribute lookup.
  • Milian Wolff: Optimize: Do manual painter restoration.
  • Milian Wolff: Optimize: Disable semi-expensive debug output generation.
  • Milian Wolff: Remove useless debug output which gets emitted a lot.
  • Yuri Chornoivan: Expand: algo -> algorithm
  • Matthias Klumpp: Add AppStream metadata
  • Gael de Chalendar: Add xdot 1.2, graphviz 2.13 Support image operator I
  • Gael de Chalendar: Add support for xdot 1.5, graphviz 2.34 new ‘t’ operator
  • David Faure: Port from queryExit to closeEvent, so queryExit can be deprecated
  • Reimar Döffinger: Remove dependency on Qt3Support.
  • Reimar Döffinger: Bump version number for the many recent changes.
  • Reimar Döffinger: Make code find the chain.png and chain-broken.png.
  • Reimar Döffinger: printing: Add hack to fix some strange random behaviour.
  • Reimar Döffinger: Remove unused variable.
  • Reimar Döffinger: Prefer using QPainter::boundingRect to get text size.
  • Reimar Döffinger: Printing: fix size calculations without date/time.
  • Reimar Döffinger: printing: get rid of pointless intermediate QImages.
  • Reimar Döffinger: printing: remove pointless duplicated setFont calls.
  • Reimar Döffinger: Printing: replace smoothScale() by scaled()
  • Reimar Döffinger: Print preview window: remove pointless customization.
  • Reimar Döffinger: simpleprintingengine.cpp: Simplify, do not rely on dynamic_cast.
  • Reimar Döffinger: Move QPaintDevice pointer out of class.
  • Reimar Döffinger: Remove unused function.
  • Reimar Döffinger: Change include order to match KDE recommendations.
  • Reimar Döffinger: Handle failure to load a file without crashing.
  • Reimar Döffinger: Support old graphviz via patch for the moment.
  • Reimar Döffinger: Update kcfg files to reference schema instead of DTD.
  • Reimar Döffinger: Fix placement of TRANS:ROLES_OF_TRANSLATORS
  • Reimar Döffinger: Spelling fixes in comments.
  • Reimar Döffinger: Change my email address to one I can still access.
  • Reimar Döffinger: Replace some Qt classes with KDE alternatives.
  • Reimar Döffinger: Avoid QString::null and use QString().
  • Reimar Döffinger: Fix some issues with threading.
  • Reimar Döffinger: Fix memory leak and make data structure const.
  • Reimar Döffinger: Fix file descriptor leak.
  • Reimar Döffinger: Simplify code to delete maps and also free all subgraphs.
  • Reimar Döffinger: kgrapheditor: Use only public API of our KPart.
  • Reimar Döffinger: Fix gvContext leaks.
  • Reimar Döffinger: Do not clear canvas on update.
  • Reimar Döffinger: Switch kgrapheditor to use the KPart.
  • Reimar Döffinger: Slightly simplify plugin load error handling.
  • Reimar Döffinger: kgrapheditor: Make it possible to have an active graph.
  • Reimar Döffinger: Add some debug prints.
  • Reimar Döffinger: kgrapheditor: Fix signal and slot signatures.
  • Reimar Döffinger: kgrapheditor: Make quit menu entry work.
  • Reimar Döffinger: Fix loading files in kgrapheditor.
  • Yuri Chornoivan: Fix typo
  • Reimar Döffinger: Normalize most signal/slot signatures.
  • Reimar Döffinger: Make 1-argument constructors explicit.
  • Reimar Döffinger: Follow recommendation to use QPointer for modal dialogs.
  • Reimar Döffinger: Show correct layout algorithm also for undirected graphs.
  • Reimar Döffinger: Update Changelog, short summary of major recent changes.
  • Reimar Döffinger: Fix code to enfore minimum size of zoom rectangle.
  • Reimar Döffinger: Fix incorrect clamps.
  • Reimar Döffinger: Minor code simplification for zoom rectangle adjustment.
  • Reimar Döffinger: Fixes for layout selection.
  • Reimar Döffinger: Set checkable to true.
  • Reimar Döffinger: Prefer KAction over QAction where appropriate.
  • Reimar Döffinger: Try to fix print setup page by removing fixed pixel positions.
  • Reimar Döffinger: Use empty string instead of single space for custom layout placeholder.
  • Reimar Döffinger: Reformat remaining three .ui files for consistency.
  • Reimar Döffinger: Make settings dialogs auto-layout themselves properly.
  • Reimar Döffinger: Convert .ui files to proper XML/newer format.
  • Reimar Döffinger: Allow proper auto-scaling of appearence preferences.
  • Reimar Döffinger: Remove spacer on top.
  • Reimar Döffinger: Use a simple QLabel instead of QTextEdit.
  • Reimar Döffinger: Remove broken code that messed up position when zooming.
  • Reimar Döffinger: Simplify scrollwheel scrolling code.
  • Reimar Döffinger: Fix keyboard navigation.
  • Reimar Döffinger: Simplify code handling detail level, avoid duplicating code.
  • Reimar Döffinger: Also allow zooming with Control + mouse wheel.
  • Reimar Döffinger: Use correct flag type for argument.
  • Reimar Döffinger: Add extra parenthesis to avoid compiler warning.
  • Reimar Döffinger: Remove unused variable.
  • Reimar Döffinger: Add explicit protected destructor.
  • Reimar Döffinger: Avoid some deprecated functions in page setup code.
  • Reimar Döffinger: Port to KPluginFactory.
  • Reimar Döffinger: Print error if opening the file failed.
  • Reimar Döffinger: Support newer graphviz cgraph library.
  • Reimar Döffinger: Fix parser to accept both int and floating-point in more places.
  • Burkhard Lück: fix typo BUG:331041
  • David Faure: Port away from deprecated QList::remove().
  • Pino Toscano: Remove erroneous double-quotes around %c in Exec line
  • Pino Toscano: cmake: remove obsolete stuff
  • Pino Toscano: cmake: simplify the various target_link_libraries
  • Luigi Toscano: docs: fix id attribute ( element)
  • Gaël de Chalendar: Corrects bug report #278010 : soversion for kgraphviewerlib was wrong.
  • Gaël de Chalendar: Add the necessary cmake_minimum_required version.
  • T.C. Hollingsworth: docs: restore <(book|article)info>
  • T.C. Hollingsworth: docs: add id attribute to and
  • Michael Palimaka: Fix build with boost-1.50
  • Jekyll Wu: Fix warnings about wrong base class when opened with Qt Designer
  • Jekyll Wu: Fix missing icons in kgrapheditor
  • Jekyll Wu: Remove the deprecated “Encoding” key
  • Friedrich W. H. Kossebau: Fix kde3 icon name “filequickprint” to “document-print-preview”, seen via lxr
  • Jekyll Wu: Update the name entries in .desktop files
  • Milian Wolff: remove some (but not all) legacy QT3 calls
  • Milian Wolff: properly init m_renderOperationsRevision in default-ctor
  • David Faure: Remove nonsensical call to KGlobal::dirs()->addPrefix(), found via lxr.
  • Milian Wolff: An attribute ID is not allowed for subgraph. But graph in subgraph can have it’s own ID.
  • Milian Wolff: remove obsolete call to setBackgroundMode
  • Milian Wolff: optimize: reuse QPainterPath code from paint method in CanvasEdge
  • Milian Wolff: optimize: cache slow QFontMetrics calculations over paint events
  • Gaël de Chalendar: Add the possibility to export to svg and other pixmap formats
  • Milian Wolff: optimize: interpolate fontwidth and save calls to slow QFontMetrics::width
  • Montel Laurent: Fix forward declaration
  • Montel Laurent: cmakelint
  • Kevin Funk: Fix CMake for non-default graphviz location
  • Gael.deChalendar: - default background color set to white; - default background changed is immediatly taken into account
  • Gael.deChalendar: Correct default background color (change from black to light gray)
  • Pino Toscano: i18n fixes

» Improving Massif-Visualizer For Large Data Files

Fri, 03/16/2012 - 15:42

As I just wrote in another article, Massif is an invaluable tool. The [Visualizer](] I wrote is well appreciated and widely used as far as I can see.

A few days ago though, I did a very long (~16h) Massif run on an application, which resulted in a 204MB massif.out data file. This proved to be a very good stress test for my visualizer, which triggered me to spent some time on optimizing it. The results are pretty nice I thing, so look forward to Massif-Visualizer 0.4:

Reduced Memory Consumption

Yeah, meta eh? Just how I like it! I’ve used Massif to improve the memory consumption of Massif-Visualizer, and analyzed the data in the Visualizer of course… :)

Initial Version
initial memory consumption of the visualizer
fig. 1: initial memory consumption of the visualizer

The initial version of my visualizer took about ~470MB of memory to load the 204MB data file above. 80% of that was required for QString allocations in the callgraph of each detailed snapshot, i.e. the function signatures and location. See fig. 1 for the details.

QString to QByteArray
memory consumption of the visualizer using QByteArray instead of QString
fig. 2: `QByteArray` instead of `QString`: 50% less memory

Thomas McGuire gave me the tip of using QByteArray instead, since the Massif callgraph data is just ASCII data. We can convert the data to QString where required, essentially saving us 50% of the memory consumption. You can see that applied in fig. 2. It was simple to code and already reduced the memory consumption considerably.

Implicit Sharing
memory consumption of the visualizer leveraging implicit sharing
fig. 3: leveraging implicit sharing

I committed the above, thinking this was it. But thanks to the awesome people in the KDE community, this time André Wöbbeking, I was thankfully shown wrong: He commented on my commit, arguing that I should try out to leverage the implicit sharing of Qt containers, such as QByteArray. After all, the strings we have here are function signatures and file locations, which are repeated quite often. Especially when you have recursion in your call tree, or the same functions are encountered again and again in Massif snapshots, you can potentially safe a lot of memory by leveraging implicit sharing.

Personally, I’m suprised to see just how much this gains in this case! See fig 3., where the string allocations are nearly gone completely from the Massif log! Now only the tree node allocations, and the containers saving them, are visible in the memory log - something I do not plan to reduce further.

If you are interested in how this was implemented, take a look at commit 4be5dad13fb.

Final Notes

I think this shows quite nicely how to improve the memory consumption of an application. If you want to verify my results, I’ve uploaded the massif log files. Remember that you can open compressed files seamlessly in Massif-Visualizer. The file contains the test-data of the 16h Massif run.

You should probably use the latest Massif-Visualizer code though, since I’ve also optimized the performance of it considerably compared to the last released version 0.3. Furthermore, data files are now loaded in the background, showing a nice progress bar while doing that. If you open the big data file in 0.3 you’ll notice why I decided to optimize the visualizer :)

An interesting thing to note btw. is that the callgrind data format compresses files and function signatures, yielding much smaller data files and reducing the KCacheGrind’s memory consumption, esp. since it will automagically leverage the implicit sharing of Qt’s string classes.

Now it is probably time to stop slacking and start work-work again :) I do have quite a few ideas more for the next Massif-Visualizer though, especially an export functionality for the graphs is high on my TODO list!

» Massif Visualizer 0.3 released

Sun, 11/20/2011 - 19:17

Hey all!

I’m happy to announce the release of Massif-Visualizer 0.3. You can download the sources here:

Highlights of this release:

  • translations into 18 different languages
  • basic support for hiding of functions via context menu
  • basic support for custom allocators
  • configurable precision of memory consumption display
  • various optimizations, bug fixes and other improvements. take a look at the changelog for more information
Future Development

It took me much too long to get this release out and hope to do better in the future. Current git master already contains some new patches - try it out! I especially like the improved display of the callgraph which now aggregates the tails of the callgraph tree, i.e. the end of the backtrace which mostly starts main() etc.

If you have ideas for the future, or have any issues with Massif-Visualizer, report a bug on .


I don’t want to waste my time on packaging and instead concentrate on development. So here again a public plead to distributors: Please include Massif-Visualizer in future releases and let users download it seamlessly through your package manager. Starting with this release, Massif-Visualizer releases will follow the usual KDE procedure and the source tarballs will be hosted on the KDE mirrors. Hope this makes it simpler for packagers!

Ubuntu users can use Aurélien Gâteau’s PPA: . ArchLinux users you can get it via AUR, and Gentoo also has an overlay for it it seems. I also think that OpenSUSE has a package for it. Please add infos for $your-distro in the comments below.


» Massif Visualizer 0.2 released

Sun, 11/07/2010 - 00:16

Hey all!

I’m happy to release Massif Visualizer v0.2. This is mainly a “fix the build-system” release, no new features have been added.

You can download it here:

Mac Support

Thanks to the reports by Chris Jones it’s now possible to build and use Massif Visualizer on Max OS X, see e.g.:

He has also submitted the portsfile for inclusion in Macports:

KGraphViewer now optional

I’ve made the KGraphViewer dependency optional, if anyone does not want it (even though this removes like 50% of the tools features).

KDE Infrastructure

I’ve also prepared the steps for moving Massif-Visualizer into KDE Extragear and asked kde-devel for review. I already use the KDE infrastructure now:

git clone git://
Bug tracker:
Mailing List:

This also means that I’ll shortly get translations by the awesome KDE-i18n-Team, so stay tuned for a 0.3 including translations!

Open Suse Buildservice

I’ve also spent quite some time today battling with OBS and can provide at least packages for Fedora, Mandriva and Open Suse now. I’m still waiting for help on the remaining issues and once they are resolved I’ll add the remaining packages.

  1. ChangeLog for massif-visualizer v0.2
  2. ====================================
  4. * Milian Wolff: set version to 0.2
  5. * Milian Wolff: fix conditional
  6. * Milian Wolff: make kgraphviewer dependency optional
  7. * Milian Wolff: fix FindKGraphViewer.cmake
  8. * Milian Wolff: fix .po name
  9. * Milian Wolff: remove some esoteric cli option for XGETTEXT that does not make
  10. any sense according to Albert
  11. * Milian Wolff: fix: install libs to make sure they can get loaded on OSX e.g.
  12. * Milian Wolff: fix compile warning about init order, improve style by having
  13. just one init per line
  14. * Milian Wolff: add export macros everywhere, make visualizer helper use the
  15. Massif namespace as well
  16. * Milian Wolff: add

» Massif Visualizer 0.1 released

Tue, 11/02/2010 - 19:06

Good news everyone!

Since Gaël finally came around to release KGraphViewer 2.1, I can go ahead and do the same for Massif Visualizer!

Download Massif Visualizer 0.1

This is the first release and I would be very happy if more users gave me their feedback. I intend to move to soon in order to leverage the KDE infrastructure (mostly translations, bug tracker, releases)… This also means: There are no translations yet! I also intend to update my OBS repository to provide packages for the first release.

Stay tuned for updates.

» Massif Visualizer - now with user interaction

Sat, 03/13/2010 - 16:55

Just a quick status update: Massif Visualizer now reacts on user input. Meaning: You can click on the graph and the corresponding item in the treeview gets selected and vice versa. It’s a bit buggy since KDChart is not reliable on what it reports, but it works quite well already.

Furthermore the colors should be better now, peaks are labeled (better readable on bright color schemes, I’m afraid to say…), legend is shown, …

Now lets see how I can make the treeview more useful!