Skip to content

Commit 5a4315f

Browse files
committed
Merge remote-tracking branch 'origin/GP-4353_Dan_fixColumns--SQUASHED'
2 parents 0f08517 + 13da531 commit 5a4315f

File tree

9 files changed

+145
-96
lines changed

9 files changed

+145
-96
lines changed

Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/action/PCByStackLocationTrackingSpec.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,14 @@ public Address computeTraceAddress(ServiceProvider provider, DebuggerCoordinates
7373
return null;
7474
}
7575
long snap = coordinates.getSnap();
76-
TraceStack stack = trace.getStackManager().getLatestStack(thread, snap);
76+
TraceStack stack;
77+
try {
78+
stack = trace.getStackManager().getLatestStack(thread, snap);
79+
}
80+
catch (IllegalStateException e) {
81+
// Schema does not specify a stack
82+
return null;
83+
}
7784
if (stack == null) {
7885
return null;
7986
}

Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/model/AbstractQueryTablePanel.java

+2-21
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,17 @@
1818
import java.awt.BorderLayout;
1919
import java.awt.Color;
2020
import java.awt.event.*;
21-
import java.util.*;
21+
import java.util.Collection;
22+
import java.util.List;
2223
import java.util.stream.Collectors;
2324

2425
import javax.swing.*;
2526
import javax.swing.event.ListSelectionListener;
2627

27-
import docking.widgets.table.DynamicTableColumn;
2828
import docking.widgets.table.RangeCursorTableHeaderRenderer.SeekListener;
2929
import ghidra.debug.api.tracemgr.DebuggerCoordinates;
3030
import ghidra.framework.plugintool.Plugin;
3131
import ghidra.trace.model.Lifespan;
32-
import ghidra.trace.model.Trace;
3332
import ghidra.trace.model.target.TraceObject;
3433
import ghidra.util.datastruct.ListenerSet;
3534
import ghidra.util.table.GhidraTable;
@@ -209,24 +208,6 @@ public List<T> getAllItems() {
209208
return List.copyOf(tableModel.getModelData());
210209
}
211210

212-
@SuppressWarnings("unchecked")
213-
public <V> Map.Entry<Integer, DynamicTableColumn<T, V, Trace>> getColumnByNameAndType(
214-
String name, Class<V> type) {
215-
int count = tableModel.getColumnCount();
216-
for (int i = 0; i < count; i++) {
217-
DynamicTableColumn<T, ?, ?> column = tableModel.getColumn(i);
218-
if (!name.equals(column.getColumnName())) {
219-
continue;
220-
}
221-
if (column.getColumnClass() != type) {
222-
continue;
223-
}
224-
return Map.entry(table.convertColumnIndexToView(i),
225-
(DynamicTableColumn<T, V, Trace>) column);
226-
}
227-
return null;
228-
}
229-
230211
public void setDiffColor(Color diffColor) {
231212
tableModel.setDiffColor(diffColor);
232213
}

Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/stack/DebuggerStackPanel.java

+6
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ public Function getValue(ValueRow rowObject, Settings settings, Trace data,
8484
ServiceProvider serviceProvider) throws IllegalArgumentException {
8585
TraceObjectValue value =
8686
rowObject.getAttributeEntry(TargetStackFrame.PC_ATTRIBUTE_NAME);
87+
if (value == null) {
88+
return null;
89+
}
8790
return DebuggerStaticMappingUtils.getFunction(value.castValue(), provider.current,
8891
serviceProvider);
8992
}
@@ -100,6 +103,9 @@ public String getValue(ValueRow rowObject, Settings settings, Trace data,
100103
ServiceProvider serviceProvider) throws IllegalArgumentException {
101104
TraceObjectValue value =
102105
rowObject.getAttributeEntry(TargetStackFrame.PC_ATTRIBUTE_NAME);
106+
if (value == null) {
107+
return null;
108+
}
103109
return DebuggerStaticMappingUtils.getModuleName(value.castValue(), provider.current);
104110
}
105111
}

Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/thread/DebuggerThreadsPanel.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ public String getColumnName() {
110110
@Override
111111
public Function getValue(ValueRow rowObject, Settings settings, Trace data,
112112
ServiceProvider serviceProvider) throws IllegalArgumentException {
113-
DebuggerCoordinates coords = provider.current.object(rowObject.currentObject());
113+
TraceObject obj = rowObject.getValue().getChild();
114+
DebuggerCoordinates coords = provider.current.object(obj);
114115
Address pc = computeProgramCounter(coords);
115116
if (pc == null) {
116117
return null;
@@ -128,7 +129,8 @@ public String getColumnName() {
128129
@Override
129130
public String getValue(ValueRow rowObject, Settings settings, Trace data,
130131
ServiceProvider serviceProvider) throws IllegalArgumentException {
131-
DebuggerCoordinates coords = provider.current.object(rowObject.currentObject());
132+
TraceObject obj = rowObject.getValue().getChild();
133+
DebuggerCoordinates coords = provider.current.object(obj);
132134
Address pc = computeProgramCounter(coords);
133135
if (pc == null) {
134136
return null;
@@ -144,7 +146,8 @@ public ThreadSpColumn() {
144146

145147
@Override
146148
public ValueProperty<Address> getProperty(ValueRow row) {
147-
DebuggerCoordinates coords = provider.current.object(row.currentObject());
149+
TraceObject obj = row.getValue().getChild();
150+
DebuggerCoordinates coords = provider.current.object(obj);
148151
return new ValueAddressProperty(row) {
149152
@Override
150153
public Address getValue() {

Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/memory/DebuggerRegionsProviderTest.java

+31-18
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@
3939
import ghidra.dbg.target.TargetMemoryRegion;
4040
import ghidra.dbg.target.schema.SchemaContext;
4141
import ghidra.dbg.target.schema.TargetObjectSchema.SchemaName;
42+
import ghidra.dbg.target.schema.XmlSchemaContext;
4243
import ghidra.debug.api.modules.RegionMapProposal.RegionMapEntry;
4344
import ghidra.debug.api.tracemgr.DebuggerCoordinates;
44-
import ghidra.dbg.target.schema.XmlSchemaContext;
4545
import ghidra.program.model.address.*;
4646
import ghidra.program.model.mem.Memory;
4747
import ghidra.program.model.mem.MemoryBlock;
@@ -151,20 +151,29 @@ protected void assertTableSize(int size) {
151151
protected void assertRow(int position, Object object, String name, Address start,
152152
Address end, long length, String flags) {
153153
ValueRow row = provider.panel.getAllItems().get(position);
154-
DynamicTableColumn<ValueRow, ?, Trace> nameCol =
155-
provider.panel.getColumnByNameAndType("Name", ValueRow.class).getValue();
156-
DynamicTableColumn<ValueRow, ?, Trace> startCol =
157-
provider.panel.getColumnByNameAndType("Start", ValueProperty.class).getValue();
158-
DynamicTableColumn<ValueRow, ?, Trace> endCol =
159-
provider.panel.getColumnByNameAndType("End", ValueProperty.class).getValue();
160-
DynamicTableColumn<ValueRow, ?, Trace> lengthCol =
161-
provider.panel.getColumnByNameAndType("Length", ValueProperty.class).getValue();
162-
DynamicTableColumn<ValueRow, ?, Trace> readCol =
163-
provider.panel.getColumnByNameAndType("Read", ValueProperty.class).getValue();
164-
DynamicTableColumn<ValueRow, ?, Trace> writeCol =
165-
provider.panel.getColumnByNameAndType("Write", ValueProperty.class).getValue();
166-
DynamicTableColumn<ValueRow, ?, Trace> executeCol =
167-
provider.panel.getColumnByNameAndType("Execute", ValueProperty.class).getValue();
154+
var tableModel = QueryPanelTestHelper.getTableModel(provider.panel);
155+
GhidraTable table = QueryPanelTestHelper.getTable(provider.panel);
156+
DynamicTableColumn<ValueRow, ?, Trace> nameCol = QueryPanelTestHelper
157+
.getColumnByNameAndType(tableModel, table, "Name", ValueRow.class)
158+
.column();
159+
DynamicTableColumn<ValueRow, ?, Trace> startCol = QueryPanelTestHelper
160+
.getColumnByNameAndType(tableModel, table, "Start", ValueProperty.class)
161+
.column();
162+
DynamicTableColumn<ValueRow, ?, Trace> endCol = QueryPanelTestHelper
163+
.getColumnByNameAndType(tableModel, table, "End", ValueProperty.class)
164+
.column();
165+
DynamicTableColumn<ValueRow, ?, Trace> lengthCol = QueryPanelTestHelper
166+
.getColumnByNameAndType(tableModel, table, "Length", ValueProperty.class)
167+
.column();
168+
DynamicTableColumn<ValueRow, ?, Trace> readCol = QueryPanelTestHelper
169+
.getColumnByNameAndType(tableModel, table, "Read", ValueProperty.class)
170+
.column();
171+
DynamicTableColumn<ValueRow, ?, Trace> writeCol = QueryPanelTestHelper
172+
.getColumnByNameAndType(tableModel, table, "Write", ValueProperty.class)
173+
.column();
174+
DynamicTableColumn<ValueRow, ?, Trace> executeCol = QueryPanelTestHelper
175+
.getColumnByNameAndType(tableModel, table, "Execute", ValueProperty.class)
176+
.column();
168177

169178
assertSame(object, row.getValue().getValue());
170179
assertEquals(name, rowColDisplay(row, nameCol));
@@ -349,10 +358,14 @@ public void testDoubleClickNavigates() throws Exception {
349358
});
350359
waitForPass(() -> assertFalse(tb.trace.getProgramView().getMemory().isEmpty()));
351360

352-
int startColIdx =
353-
provider.panel.getColumnByNameAndType("Start", ValueProperty.class).getKey();
354-
int endColIdx = provider.panel.getColumnByNameAndType("End", ValueProperty.class).getKey();
361+
var tableModel = QueryPanelTestHelper.getTableModel(provider.panel);
355362
GhidraTable table = QueryPanelTestHelper.getTable(provider.panel);
363+
int startColIdx = QueryPanelTestHelper
364+
.getColumnByNameAndType(tableModel, table, "Start", ValueProperty.class)
365+
.viewIndex();
366+
int endColIdx = QueryPanelTestHelper
367+
.getColumnByNameAndType(tableModel, table, "End", ValueProperty.class)
368+
.viewIndex();
356369

357370
clickTableCell(table, 0, startColIdx, 2);
358371
waitForPass(() -> assertEquals(tb.addr(0x00400000), listing.getLocation().getAddress()));

Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/model/QueryPanelTestHelper.java

+25-2
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,37 @@
1616
package ghidra.app.plugin.core.debug.gui.model;
1717

1818
import docking.widgets.table.*;
19-
import ghidra.app.plugin.core.debug.gui.thread.DebuggerThreadsPanel;
19+
import ghidra.trace.model.Trace;
2020
import ghidra.util.table.GhidraTable;
2121
import ghidra.util.table.GhidraTableFilterPanel;
2222
import ghidra.util.table.column.GColumnRenderer;
2323

2424
public class QueryPanelTestHelper {
2525

26-
public static ObjectTableModel getTableModel(DebuggerThreadsPanel panel) {
26+
public record ColumnAndIndex<T, V>(DynamicTableColumn<T, V, Trace> column, int modelIndex,
27+
int viewIndex) {
28+
}
29+
30+
@SuppressWarnings("unchecked")
31+
public static <T, V> ColumnAndIndex<T, V> getColumnByNameAndType(
32+
AbstractQueryTableModel<T> tableModel, GhidraTable table, String name, Class<V> type) {
33+
int count = tableModel.getColumnCount();
34+
for (int i = 0; i < count; i++) {
35+
DynamicTableColumn<T, ?, ?> column = tableModel.getColumn(i);
36+
if (!name.equals(column.getColumnName())) {
37+
continue;
38+
}
39+
if (column.getColumnClass() != type) {
40+
continue;
41+
}
42+
return new ColumnAndIndex<>((DynamicTableColumn<T, V, Trace>) column,
43+
i, table.convertColumnIndexToView(i));
44+
}
45+
return null;
46+
}
47+
48+
public static <T> AbstractQueryTableModel<T> getTableModel(
49+
AbstractQueryTablePanel<T, ?> panel) {
2750
return panel.tableModel;
2851
}
2952

Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/modules/DebuggerModulesProviderTest.java

+31-19
Original file line numberDiff line numberDiff line change
@@ -232,14 +232,20 @@ protected void assertProviderEmpty() {
232232
protected void assertModuleRow(int pos, Object object, String name, Address start, Address end,
233233
long length) {
234234
ValueRow row = provider.modulesPanel.getAllItems().get(pos);
235-
DynamicTableColumn<ValueRow, ?, Trace> nameCol =
236-
provider.modulesPanel.getColumnByNameAndType("Name", ValueProperty.class).getValue();
237-
DynamicTableColumn<ValueRow, ?, Trace> baseCol =
238-
provider.modulesPanel.getColumnByNameAndType("Base", ValueProperty.class).getValue();
239-
DynamicTableColumn<ValueRow, ?, Trace> maxCol =
240-
provider.modulesPanel.getColumnByNameAndType("Max", ValueProperty.class).getValue();
241-
DynamicTableColumn<ValueRow, ?, Trace> lengthCol =
242-
provider.modulesPanel.getColumnByNameAndType("Length", ValueProperty.class).getValue();
235+
var tableModel = QueryPanelTestHelper.getTableModel(provider.modulesPanel);
236+
GhidraTable table = QueryPanelTestHelper.getTable(provider.modulesPanel);
237+
DynamicTableColumn<ValueRow, ?, Trace> nameCol = QueryPanelTestHelper
238+
.getColumnByNameAndType(tableModel, table, "Name", ValueProperty.class)
239+
.column();
240+
DynamicTableColumn<ValueRow, ?, Trace> baseCol = QueryPanelTestHelper
241+
.getColumnByNameAndType(tableModel, table, "Base", ValueProperty.class)
242+
.column();
243+
DynamicTableColumn<ValueRow, ?, Trace> maxCol = QueryPanelTestHelper
244+
.getColumnByNameAndType(tableModel, table, "Max", ValueProperty.class)
245+
.column();
246+
DynamicTableColumn<ValueRow, ?, Trace> lengthCol = QueryPanelTestHelper
247+
.getColumnByNameAndType(tableModel, table, "Length", ValueProperty.class)
248+
.column();
243249

244250
assertSame(object, row.getValue().getValue());
245251
assertEquals(name, rowColVal(row, nameCol));
@@ -251,17 +257,23 @@ protected void assertModuleRow(int pos, Object object, String name, Address star
251257
protected void assertSectionRow(int pos, Object object, String moduleName, String name,
252258
Address start, Address end, long length) {
253259
ValueRow row = provider.sectionsPanel.getAllItems().get(pos);
254-
DynamicTableColumn<ValueRow, ?, Trace> moduleNameCol =
255-
provider.sectionsPanel.getColumnByNameAndType("Module Name", ValueProperty.class)
256-
.getValue();
257-
DynamicTableColumn<ValueRow, ?, Trace> nameCol =
258-
provider.sectionsPanel.getColumnByNameAndType("Name", String.class).getValue();
259-
DynamicTableColumn<ValueRow, ?, Trace> startCol =
260-
provider.sectionsPanel.getColumnByNameAndType("Start", ValueProperty.class).getValue();
261-
DynamicTableColumn<ValueRow, ?, Trace> endCol =
262-
provider.sectionsPanel.getColumnByNameAndType("End", ValueProperty.class).getValue();
263-
DynamicTableColumn<ValueRow, ?, Trace> lengthCol =
264-
provider.sectionsPanel.getColumnByNameAndType("Length", ValueProperty.class).getValue();
260+
var tableModel = QueryPanelTestHelper.getTableModel(provider.sectionsPanel);
261+
GhidraTable table = QueryPanelTestHelper.getTable(provider.sectionsPanel);
262+
DynamicTableColumn<ValueRow, ?, Trace> moduleNameCol = QueryPanelTestHelper
263+
.getColumnByNameAndType(tableModel, table, "Module Name", ValueProperty.class)
264+
.column();
265+
DynamicTableColumn<ValueRow, ?, Trace> nameCol = QueryPanelTestHelper
266+
.getColumnByNameAndType(tableModel, table, "Name", String.class)
267+
.column();
268+
DynamicTableColumn<ValueRow, ?, Trace> startCol = QueryPanelTestHelper
269+
.getColumnByNameAndType(tableModel, table, "Start", ValueProperty.class)
270+
.column();
271+
DynamicTableColumn<ValueRow, ?, Trace> endCol = QueryPanelTestHelper
272+
.getColumnByNameAndType(tableModel, table, "End", ValueProperty.class)
273+
.column();
274+
DynamicTableColumn<ValueRow, ?, Trace> lengthCol = QueryPanelTestHelper
275+
.getColumnByNameAndType(tableModel, table, "Length", ValueProperty.class)
276+
.column();
265277

266278
assertSame(object, row.getValue().getValue());
267279
assertEquals(moduleName, rowColVal(row, moduleNameCol));

Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/stack/DebuggerStackProviderTest.java

+15-10
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
*/
1616
package ghidra.app.plugin.core.debug.gui.stack;
1717

18-
import static org.junit.Assert.*;
18+
import static org.junit.Assert.assertEquals;
19+
import static org.junit.Assert.assertTrue;
1920

2021
import java.io.IOException;
2122
import java.util.List;
@@ -52,6 +53,7 @@
5253
import ghidra.trace.model.target.*;
5354
import ghidra.trace.model.target.TraceObject.ConflictResolution;
5455
import ghidra.trace.model.thread.TraceObjectThread;
56+
import ghidra.util.table.GhidraTable;
5557
import ghidra.util.task.TaskMonitor;
5658

5759
/**
@@ -215,13 +217,18 @@ protected void assertTableSize(int size) {
215217

216218
protected void assertRow(int level, Address pcVal, Function func) {
217219
ValueRow row = stackProvider.panel.getAllItems().get(level);
218-
219-
DynamicTableColumn<ValueRow, String, Trace> levelCol =
220-
stackProvider.panel.getColumnByNameAndType("Level", String.class).getValue();
221-
DynamicTableColumn<ValueRow, ?, Trace> pcCol =
222-
stackProvider.panel.getColumnByNameAndType("PC", ValueProperty.class).getValue();
223-
DynamicTableColumn<ValueRow, Function, Trace> funcCol =
224-
stackProvider.panel.getColumnByNameAndType("Function", Function.class).getValue();
220+
var tableModel = QueryPanelTestHelper.getTableModel(stackProvider.panel);
221+
GhidraTable table = QueryPanelTestHelper.getTable(stackProvider.panel);
222+
223+
DynamicTableColumn<ValueRow, String, Trace> levelCol = QueryPanelTestHelper
224+
.getColumnByNameAndType(tableModel, table, "Level", String.class)
225+
.column();
226+
DynamicTableColumn<ValueRow, ?, Trace> pcCol = QueryPanelTestHelper
227+
.getColumnByNameAndType(tableModel, table, "PC", ValueProperty.class)
228+
.column();
229+
DynamicTableColumn<ValueRow, Function, Trace> funcCol = QueryPanelTestHelper
230+
.getColumnByNameAndType(tableModel, table, "Function", Function.class)
231+
.column();
225232

226233
assertEquals(PathUtils.makeKey(PathUtils.makeIndex(level)), rowColVal(row, levelCol));
227234
assertEquals(pcVal, rowColVal(row, pcCol));
@@ -308,8 +315,6 @@ public void testAddStackThenActivateThreadPopulatesProvider() throws Exception {
308315

309316
/**
310317
* Because keys are strings, we need to ensure they get sorted numerically
311-
*
312-
* @throws Exception
313318
*/
314319
@Test
315320
public void testTableSortedCorrectly() throws Exception {

0 commit comments

Comments
 (0)