From 8b5c680052c7ec061298b82f5a4f35828ac076cd Mon Sep 17 00:00:00 2001 From: Mark Kogan Date: Tue, 2 Jun 2026 12:38:51 +0300 Subject: [PATCH] support Valgrind XML protocol versions newer than 4 Accept protocol versions >= 4 instead of requiring exactly version 4, and register XML elements added in newer protocols (heap_summary, leak_summary, error_summary and their children) so logs from recent Valgrind releases (e.g. 3.26, protocol 6) parse without errors. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/toolview/helgrind_logview.cpp | 2 +- src/toolview/memcheck_logview.cpp | 2 +- src/toolview/vglogview.cpp | 21 ++++++++++++++++++++- src/toolview/vglogview.h | 1 + 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/toolview/helgrind_logview.cpp b/src/toolview/helgrind_logview.cpp index d06492c..1699b4a 100644 --- a/src/toolview/helgrind_logview.cpp +++ b/src/toolview/helgrind_logview.cpp @@ -166,7 +166,7 @@ bool HelgrindLogView::appendNodeTool( QDomElement elem, QString& errMsg ) { switch ( VgOutputItem::elemType( elem.tagName() ) ) { case VG_ELEM::PROTOCOL_VERSION : { - if ( elem.text() != "4" ) { + if ( elem.text().toInt() < 4 ) { errMsg = "Helgrind tool doesn't support XML protocol version: (" + elem.text() + ")"; vkPrintErr( "%s", qPrintable( "HelgrindLogView::appendNodeTool(): " + errMsg ) ); return false; diff --git a/src/toolview/memcheck_logview.cpp b/src/toolview/memcheck_logview.cpp index ba07132..a3e3d0e 100644 --- a/src/toolview/memcheck_logview.cpp +++ b/src/toolview/memcheck_logview.cpp @@ -172,7 +172,7 @@ bool MemcheckLogView::appendNodeTool( QDomElement elem, QString& errMsg ) { switch ( VgOutputItem::elemType( elem.tagName() ) ) { case VG_ELEM::PROTOCOL_VERSION : { - if ( elem.text() != "4" ) { + if ( elem.text().toInt() < 4 ) { errMsg = "Memcheck tool doesn't support XML protocol version: (" + elem.text() + ")"; vkPrintErr( "%s", qPrintable( "MemcheckLogView::appendNodeTool(): " + errMsg ) ); return false; diff --git a/src/toolview/vglogview.cpp b/src/toolview/vglogview.cpp index ef6e676..db17526 100644 --- a/src/toolview/vglogview.cpp +++ b/src/toolview/vglogview.cpp @@ -86,6 +86,25 @@ static ElemTypeMap setupElemTypeMap() etmap["skaux"] = VG_ELEM::SKAUX; etmap["sframe"] = VG_ELEM::SFRAME; etmap["rawtext"] = VG_ELEM::RAWTEXT; + etmap["heap_summary"] = VG_ELEM::HEAP_SUMMARY; + etmap["leak_summary"] = VG_ELEM::LEAK_SUMMARY; + etmap["error_summary"] = VG_ELEM::ERROR_SUMMARY; + etmap["total_heap_usage"] = VG_ELEM::HEAP_SUMMARY; + etmap["memory_in_use_at_exit"] = VG_ELEM::HEAP_SUMMARY; + etmap["all_heap_blocks_freed"] = VG_ELEM::HEAP_SUMMARY; + etmap["definitely_lost"] = VG_ELEM::LEAK_SUMMARY; + etmap["indirectly_lost"] = VG_ELEM::LEAK_SUMMARY; + etmap["possibly_lost"] = VG_ELEM::LEAK_SUMMARY; + etmap["still_reachable"] = VG_ELEM::LEAK_SUMMARY; + etmap["suppressed"] = VG_ELEM::LEAK_SUMMARY; + etmap["errors"] = VG_ELEM::ERROR_SUMMARY; + etmap["error_contexts"] = VG_ELEM::ERROR_SUMMARY; + etmap["suppressed_contexts"] = VG_ELEM::ERROR_SUMMARY; + etmap["allocs"] = VG_ELEM::HEAP_SUMMARY; + etmap["frees"] = VG_ELEM::HEAP_SUMMARY; + etmap["bytes_allocated"] = VG_ELEM::HEAP_SUMMARY; + etmap["bytes"] = VG_ELEM::HEAP_SUMMARY; + etmap["blocks"] = VG_ELEM::HEAP_SUMMARY; return etmap; } @@ -1100,7 +1119,7 @@ bool VgLogView::appendNode( QDomNode node, QString& errMsg ) switch ( elemtype ) { case VG_ELEM::PROTOCOL_VERSION: { - if ( elem.text() != "4" ) { + if ( elem.text().toInt() < 4 ) { errMsg = "Unsupported XML protocol version: (" + elem.text() + ")"; vkPrintErr( "%s", qPrintable( "VgLogView::appendNode(): " + errMsg ) ); return false; diff --git a/src/toolview/vglogview.h b/src/toolview/vglogview.h index c72d83b..c58e57c 100644 --- a/src/toolview/vglogview.h +++ b/src/toolview/vglogview.h @@ -114,6 +114,7 @@ namespace VG_ELEM { ERRORCOUNTS, ANNOUNCETHREAD, HTHREADID, PAIR, COUNT, SUPPCOUNTS, NAME, LEAKEDBYTES, LEAKEDBLOCKS, SUPPRESSION, SNAME, SKIND, SKAUX, SFRAME, RAWTEXT, + HEAP_SUMMARY, LEAK_SUMMARY, ERROR_SUMMARY, NUM_ELEMS }; }