From 22b4b0ee2582b47eebbb6296ab26017c5ac3edb8 Mon Sep 17 00:00:00 2001 From: "p.privalov" Date: Thu, 4 Aug 2016 19:27:57 +0300 Subject: [PATCH] SRADA-886 Memory Callstack logic implemented. Memory callstack Table now able to fill itself with callstack appended with allocation function. Callstack is not complete yet due to lack of information. Change-Id: I62a7695eb7a644ca72db78852f709d0da2acdeb2 --- .../ui/info/callstack/CallstackTable.java | 6 +- .../ui/memory/MemoryCallStackView.java | 6 +- .../ui/memory/table/MemoryCallStackTable.java | 191 ++++++++++++++++++++- 3 files changed, 193 insertions(+), 10 deletions(-) diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackTable.java index 8cd58f7..6cbc519 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/info/callstack/CallstackTable.java @@ -126,11 +126,7 @@ public class CallstackTable extends DATableComposite { seqNum = (Long) calltraceData.get(FunctionEntryDBTable.COLUMN.SEQUENCE_NUMBER.index); pid = (Integer) calltraceData.get(FunctionEntryDBTable.COLUMN.PID.index); time = (Long) calltraceData.get(FunctionEntryDBTable.COLUMN.START_TIME.index); - } else if (tableData.getType() == AnalyzerConstants.TYPE_TABLE_MEM_ALLOCATEDTRACE) { - GridItem gridItem = new GridItem(table, SWT.NONE); - gridItem.setText(0, "Stub for callstack"); - return; - }else if (tableData.getType() == AnalyzerConstants.TYPE_TABLE_INTERACTIVE) { + } else if (tableData.getType() == AnalyzerConstants.TYPE_TABLE_INTERACTIVE) { return; // TODO } else { // in case table has LogData LogData logData = tableData.getLogData(); diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/memory/MemoryCallStackView.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/memory/MemoryCallStackView.java index 26b20d7..3b5759a 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/memory/MemoryCallStackView.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/memory/MemoryCallStackView.java @@ -34,7 +34,7 @@ import org.tizen.dynamicanalyzer.nl.InformationViewLabels; import org.tizen.dynamicanalyzer.nl.MemoryPageLabels; import org.tizen.dynamicanalyzer.resources.ColorResources; import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackInserter; -import org.tizen.dynamicanalyzer.ui.info.callstack.CallstackTable; +import org.tizen.dynamicanalyzer.ui.memory.table.MemoryCallStackTable; import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite; import org.tizen.dynamicanalyzer.ui.widgets.table.TableColumnSizePackListener; import org.tizen.dynamicanalyzer.widgets.da.view.DAViewComposite; @@ -65,7 +65,7 @@ public class MemoryCallStackView extends DAViewComposite { contents.setBackground(ColorResources.WINDOW_BG_COLOR); contents.setLayout(new FillLayout()); - callstackTableComp = new CallstackTable(contents, SWT.NONE, SWT.SINGLE | SWT.BORDER + callstackTableComp = new MemoryCallStackTable(contents, SWT.NONE, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); callstackTableComp.setTableName("Callstack"); //$NON-NLS-1$ callstackTableComp.setColumns(columnNames); @@ -87,7 +87,7 @@ public class MemoryCallStackView extends DAViewComposite { DASelectionData seldata = (DASelectionData) data; if (seldata.getData() instanceof GridItem[]) { - ((CallstackTable) callstackTableComp).updateCallstackTable(seldata); + ((MemoryCallStackTable) callstackTableComp).updateCallstackTable(seldata); } else { updateView(); } diff --git a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/memory/table/MemoryCallStackTable.java b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/memory/table/MemoryCallStackTable.java index 15b3163..7f5dd90 100644 --- a/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/memory/table/MemoryCallStackTable.java +++ b/org.tizen.dynamicanalyzer/src/org/tizen/dynamicanalyzer/ui/memory/table/MemoryCallStackTable.java @@ -24,11 +24,30 @@ package org.tizen.dynamicanalyzer.ui.memory.table; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import org.eclipse.nebula.widgets.grid.GridItem; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.Composite; +import org.tizen.dynamicanalyzer.common.AnalyzerConstants; +import org.tizen.dynamicanalyzer.common.AnalyzerManager; +import org.tizen.dynamicanalyzer.common.DASelectionData; +import org.tizen.dynamicanalyzer.common.Global; import org.tizen.dynamicanalyzer.model.TableInput; +import org.tizen.dynamicanalyzer.project.callstack.RuntimeCallstackManager; +import org.tizen.dynamicanalyzer.ui.info.callstack.CallStackUnit; +import org.tizen.dynamicanalyzer.ui.memory.MemoryAllocationTraceTableView; +import org.tizen.dynamicanalyzer.ui.timeline.common.TimelineTableView; +import org.tizen.dynamicanalyzer.ui.toolbar.Toolbar; import org.tizen.dynamicanalyzer.ui.widgets.table.DATableComposite; +import org.tizen.dynamicanalyzer.ui.widgets.table.DATableDataFormat; +import org.tizen.dynamicanalyzer.util.Logger; +import org.tizen.dynamicanalyzer.utils.Formatter; +import org.tizen.dynamicanalyzer.widgets.da.view.DAViewData; public class MemoryCallStackTable extends DATableComposite { @@ -39,12 +58,180 @@ public class MemoryCallStackTable extends DATableComposite { public MemoryCallStackTable(Composite parent, int compStyle, int tableStyle) { super(parent, compStyle, tableStyle); - // TODO Auto-generated constructor stub + + table.addSelectionListener(new SelectionListener() { + + @Override + public void widgetSelected(SelectionEvent e) { + AnalyzerManager.getCurrentPage().updateView( + new DAViewData(TimelineTableView.tabID, null)); + GridItem[] sels = table.getSelection(); + if (sels.length <= 0) { + return; + } + table.setFocusItem(sels[0]); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + }); + + applyFilterImage(); + } + + public void updateCallstackTable(DASelectionData selData) { + table.removeAll(); + if (null == selData) { + return; + } + String viewId = selData.getViewID(); + if (!viewId.equals(MemoryAllocationTraceTableView.class.getName())) + return; + + Object obj = selData.getData(); + if (obj instanceof GridItem[]) { + GridItem[] items = (GridItem[]) obj; + if (items.length <= 0) { + return; + } + DATableDataFormat tableData = (DATableDataFormat) items[0].getData(); + + long seqNum = -1; + List pids = new ArrayList(); + long time = -1; + long allocAddr; + String allocPath; + String allocName; + if (tableData.getType() == AnalyzerConstants.TYPE_TABLE_MEM_ALLOCATEDTRACE) { + List memAllocationData = tableData.getData(); + seqNum = (Long) memAllocationData.get(0); + allocAddr = (Long) memAllocationData.get(3); + allocPath = (String) memAllocationData.get(5); + allocName = (String) memAllocationData.get(6); + for (int i : Global.getProject().getProcessIDs()) + pids.add(i); + if (Toolbar.INSTANCE.getSelectedPid() > 0) + pids.add(Toolbar.INSTANCE.getSelectedPid()); + time = (Long) memAllocationData.get(1); + } else { // in case table has LogData + return; + } + + for (int pid : pids) { + Map addrMap = Global.getRuntimeCallstackManager().getCallStackApiAddrByPidMap(pid); + if ((null == addrMap) || (addrMap.isEmpty())) { + continue; + } + + List addrs = getAddrs(seqNum); + + if (null == addrs) { + addrs = getAddrs(Long.MAX_VALUE); // This case may occured if seq Num is above Long.MAX_VALUE + if (null == addrs) { + Logger.error("Function entry or exit not found"); + continue; + } + } + + { + DATableDataFormat callstackTableData = new DATableDataFormat(allocAddr); + callstackTableData.setType(AnalyzerConstants.TYPE_TABLE_MEM_CALLSTACK); + callstackTableData.setObject(allocAddr); + GridItem gridItem = new GridItem(table, SWT.NONE); + gridItem.setData(callstackTableData); + gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_ADDR, + allocAddr); + gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_PID, pid); + gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_TIME, time); + gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_LIBNAME, allocPath); + + String addrInput = (allocAddr == 0) ? "" :Formatter.toHexString(Long.toString(allocAddr)); //$NON-NLS-1$ + gridItem.setText(1, "Unknown"); + gridItem.setText(0, allocName); + gridItem.setText(2, "Unknown"); + + gridItem = new GridItem(table, SWT.NONE); + gridItem.setData(callstackTableData); + gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_ADDR, + allocAddr); + gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_PID, pid); + gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_TIME, time); + gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_LIBNAME, + allocPath); + + gridItem.setText(0, Global.getFunctionName((int) allocAddr)); + gridItem.setText(1, addrInput); + gridItem.setText(2, allocPath); + + } + + int size = addrs.size(); + for (int i = 0; i < size; i++) { + String hexAddr = Formatter.toHexString(addrs.get(i) + .toString()); + CallStackUnit api = addrMap.get(addrs.get(i)); + + if (null == api) { + Logger.debug("callstackunit for addr : " + hexAddr + + " not found"); + break; + } + + String path = api.getPath(); + if (null == path) { + Logger.debug("callstackunit for addr : " + hexAddr + + " not found"); + break; + } + + GridItem gridItem = new GridItem(table, SWT.NONE); + + // setData block + { + long address = addrs.get(i); + DATableDataFormat callstackTableData = new DATableDataFormat( + address); + callstackTableData + .setType(AnalyzerConstants.TYPE_TABLE_MEM_CALLSTACK); + callstackTableData.setObject(address); + gridItem.setData(callstackTableData); + gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_ADDR, + address); + gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_PID, + pid); + gridItem.setData(AnalyzerConstants.CALLSTACK_KEY_TIME, + time); + gridItem.setData( + AnalyzerConstants.CALLSTACK_KEY_LIBNAME, path); + } + + String addrInput = (addrs.get(i) == 0) ? "" : hexAddr; //$NON-NLS-1$ + gridItem.setText(1, addrInput); + + String fName = api.getFunctionName(); + + gridItem.setText(0, fName); + gridItem.setText(2, path); + } + } + } + } + + private List getAddrs(long seqNum) { + RuntimeCallstackManager callstackManager = Global.getRuntimeCallstackManager(); + for (long i = seqNum; i >= 0; i--) { + Logger.setLogOn(false); + if (null != callstackManager.getCallstackAddrListFromSeq(i)) { + Logger.setLogOn(true); + return callstackManager.getCallstackAddrListFromSeq(i); + } + } + return null; } @Override protected List makeTableInput() { - // TODO Auto-generated method stub return null; } -- 2.7.4