From: Andrey Kvochko Date: Mon, 25 Sep 2017 19:01:15 +0000 (+0300) Subject: Warn the user if data for a certain GC is incomplete X-Git-Tag: submit/tizen/20180620.112952^2~13 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=38d0d2b3a83a75123c8f4acae5b1914d53b45d19;p=sdk%2Ftools%2Fheaptrack.git Warn the user if data for a certain GC is incomplete --- diff --git a/src/analyze/gui/parser.cpp b/src/analyze/gui/parser.cpp index 107ec10..3e8e194 100644 --- a/src/analyze/gui/parser.cpp +++ b/src/analyze/gui/parser.cpp @@ -22,6 +22,8 @@ #include #include +#include +#include #include "analyze/accumulatedtracedata.h" @@ -730,8 +732,12 @@ ObjectRowData objectRowDataFromTypeTree(ParserData& data, TypeTree* tree) { return rowData; } -ObjectNode buildObjectGraph(ParserData& data, size_t &nodeIndex) { +ObjectNode buildObjectGraph(ParserData& data, size_t &nodeIndex, bool &success) { ObjectNode node; + if (nodeIndex >= data.objectTreeNodes.size()) { + success = false; + return node; + } ObjectTreeNode &dataNode = data.objectTreeNodes[nodeIndex]; node.m_classIndex = dataNode.classIndex; node.m_objectPtr = dataNode.objectPtr; @@ -742,9 +748,11 @@ ObjectNode buildObjectGraph(ParserData& data, size_t &nodeIndex) { node.m_objectSize = 0; nodeIndex++; for (size_t i = 0; i < dataNode.numChildren; ++i) { - if (node.gcNum != data.objectTreeNodes[nodeIndex].gcNum) + if (node.gcNum != data.objectTreeNodes[nodeIndex].gcNum) { + success = false; break; - node.m_children.push_back(buildObjectGraph(data, nodeIndex)); + } + node.m_children.push_back(buildObjectGraph(data, nodeIndex, success)); } return node; } @@ -756,7 +764,14 @@ ObjectTreeData buildObjectTree(ParserData& data) size_t nodeIndex = 0; std::vector nodes; while (nodeIndex < data.objectTreeNodes.size()) { - nodes.push_back(buildObjectGraph(data, nodeIndex)); + bool success = true; + ObjectNode node = buildObjectGraph(data, nodeIndex, success); + if (success) + nodes.push_back(node); + else { + QMessageBox::warning(nullptr, QString::fromStdString("Bad data"), + QString::fromStdString("Heap snapshot for GC #%1 is incomplete").arg(node.gcNum)); + } } for (auto& node: nodes) { diff --git a/src/track/objectgraph.h b/src/track/objectgraph.h index 4ddabd0..ba8e2a7 100644 --- a/src/track/objectgraph.h +++ b/src/track/objectgraph.h @@ -78,6 +78,12 @@ public: m_graph.clear(); } + /* m_graph is in fact a flat collection of ObjectNodes. The graph structure + is provided by ObjectNode::children which point to ObjectNode instances + living inside m_graph. All instances of ObjectNode are residing + in m_graph, regardless of their position in the actual graph. + NULL key is somewhat special - the ObjectNode corresponding to it is a fake + ObjectNode whose children are GC roots. */ static std::unordered_map m_graph; };