ghidra: Loading 'Defined Strings' (after successful analysis) hangs and slows down UI
Describe the bug Loading ‘Defined Strings’ (after successful analysis) hangs. It is a fairly large binary with around ~600000 strings. Status bar is getting stuck at 37% (in my case after waiting 15 minutes), 100% cpu is consumed on one thread/core.
The sand glass is still animated but the whole UI froze.
Memory exhaustion is not the cause (3 GB from 8GB jvm heap consumed).
Expected behavior Defined strings view should neither hang nor block ghidra
Environment (please complete the following information):
- OS: [e.g. macOS 10.14.2] Windows 10
- Java Version: [e.g. 11.0] OpenJDK 11.0.2
- Ghidra Version: [e.g. 9.1.2] 9.2.3
- Ghidra Origin: [e.g. official ghidra-sre.org distro, third party distro, locally built] official
Additional context
Stacktraces of the problematic thread. Interesstingly, it uses reflection.
Name: Threaded Table Model Update Manager: Defined String Table
State: RUNNABLE
Total blocked: 318.759 Total waited: 8.831
db.buffers.BufferMgr.getBuffer(BufferMgr.java:957)
- locked db.buffers.BufferMgr@29a3af25
db.NodeMgr.getLongKeyNode(NodeMgr.java:185)
db.LongKeyInteriorNode.getLeafNode(LongKeyInteriorNode.java:403)
db.Table.hasRecord(Table.java:640)
- locked db.DBHandle@d393b42
ghidra.program.database.map.AddressKeyRecordIterator.<init>(AddressKeyRecordIterator.java:148)
ghidra.program.database.map.AddressKeyRecordIterator.<init>(AddressKeyRecordIterator.java:63)
ghidra.program.database.code.DataDBAdapterV0.getRecordAfter(DataDBAdapterV0.java:84)
ghidra.program.database.code.CodeManager.getDefinedAddressAfter(CodeManager.java:2798)
ghidra.program.database.code.DataDB.computeLength(DataDB.java:167)
ghidra.program.database.code.DataDB.<init>(DataDB.java:75)
ghidra.program.database.code.DataComponent.<init>(DataComponent.java:80)
ghidra.program.database.code.DataDB.getComponent(DataDB.java:223)
ghidra.program.util.DefinedDataIterator$DataComponentIterator.next(DefinedDataIterator.java:235)
ghidra.program.util.DefinedDataIterator.findNext(DefinedDataIterator.java:157)
ghidra.program.util.DefinedDataIterator.hasNext(DefinedDataIterator.java:131)
ghidra.app.plugin.core.strings.ViewStringsTableModel.doLoad(ViewStringsTableModel.java:117)
docking.widgets.table.threaded.ThreadedTableModel.load(ThreadedTableModel.java:177)
docking.widgets.table.threaded.TableUpdateJob.loadData(TableUpdateJob.java:357)
docking.widgets.table.threaded.TableUpdateJob.processState(TableUpdateJob.java:330)
docking.widgets.table.threaded.TableUpdateJob.run(TableUpdateJob.java:129)
docking.widgets.table.threaded.ThreadedTableModelUpdateMgr$ThreadRunnable.run(ThreadedTableModelUpdateMgr.java:415)
java.base@11.0.2/java.lang.Thread.run(Thread.java:834)
Name: Threaded Table Model Update Manager: Defined String Table
State: RUNNABLE
Total blocked: 318.959 Total waited: 8.897
Stack trace:
db.LongKeyInteriorNode.<init>(LongKeyInteriorNode.java:53)
db.NodeMgr.getLongKeyNode(NodeMgr.java:197)
db.Table.hasRecord(Table.java:640)
- locked db.DBHandle@d393b42
ghidra.program.database.map.AddressKeyRecordIterator.<init>(AddressKeyRecordIterator.java:148)
ghidra.program.database.map.AddressKeyRecordIterator.<init>(AddressKeyRecordIterator.java:63)
ghidra.program.database.code.InstDBAdapterV1.getRecordAfter(InstDBAdapterV1.java:115)
ghidra.program.database.code.CodeManager.getDefinedAddressAfter(CodeManager.java:2799)
ghidra.program.database.code.DataDB.computeLength(DataDB.java:167)
ghidra.program.database.code.DataDB.<init>(DataDB.java:75)
ghidra.program.database.code.DataComponent.<init>(DataComponent.java:80)
ghidra.program.database.code.DataDB.getComponent(DataDB.java:223)
ghidra.program.util.DefinedDataIterator$DataComponentIterator.next(DefinedDataIterator.java:235)
ghidra.program.util.DefinedDataIterator.findNext(DefinedDataIterator.java:157)
ghidra.program.util.DefinedDataIterator.hasNext(DefinedDataIterator.java:131)
ghidra.app.plugin.core.strings.ViewStringsTableModel.doLoad(ViewStringsTableModel.java:117)
docking.widgets.table.threaded.ThreadedTableModel.load(ThreadedTableModel.java:177)
docking.widgets.table.threaded.TableUpdateJob.loadData(TableUpdateJob.java:357)
docking.widgets.table.threaded.TableUpdateJob.processState(TableUpdateJob.java:330)
docking.widgets.table.threaded.TableUpdateJob.run(TableUpdateJob.java:129)
docking.widgets.table.threaded.ThreadedTableModelUpdateMgr$ThreadRunnable.run(ThreadedTableModelUpdateMgr.java:415)
java.base@11.0.2/java.lang.Thread.run(Thread.java:834)
Stack trace:
java.base@11.0.2/jdk.internal.reflect.Reflection.getCallerClass(Native Method)
java.base@11.0.2/java.lang.Class.newInstance(Class.java:576)
db.Schema.createRecord(Schema.java:268)
db.Schema.createRecord(Schema.java:252)
db.FixedRecNode.getRecord(FixedRecNode.java:197)
db.Table$LongKeyRecordIterator.<init>(Table.java:2052)
db.Table.iterator(Table.java:1800)
- locked db.DBHandle@d393b42
ghidra.program.database.map.AddressKeyRecordIterator.<init>(AddressKeyRecordIterator.java:147)
ghidra.program.database.map.AddressKeyRecordIterator.<init>(AddressKeyRecordIterator.java:63)
ghidra.program.database.code.DataDBAdapterV0.getRecordAfter(DataDBAdapterV0.java:84)
ghidra.program.database.code.CodeManager.getDefinedAddressAfter(CodeManager.java:2798)
ghidra.program.database.code.DataDB.computeLength(DataDB.java:167)
ghidra.program.database.code.DataDB.<init>(DataDB.java:75)
ghidra.program.database.code.DataComponent.<init>(DataComponent.java:80)
ghidra.program.database.code.DataDB.getComponent(DataDB.java:223)
ghidra.program.util.DefinedDataIterator$DataComponentIterator.next(DefinedDataIterator.java:235)
ghidra.program.util.DefinedDataIterator.findNext(DefinedDataIterator.java:157)
ghidra.program.util.DefinedDataIterator.hasNext(DefinedDataIterator.java:131)
ghidra.app.plugin.core.strings.ViewStringsTableModel.doLoad(ViewStringsTableModel.java:117)
docking.widgets.table.threaded.ThreadedTableModel.load(ThreadedTableModel.java:177)
docking.widgets.table.threaded.TableUpdateJob.loadData(TableUpdateJob.java:357)
docking.widgets.table.threaded.TableUpdateJob.processState(TableUpdateJob.java:330)
docking.widgets.table.threaded.TableUpdateJob.run(TableUpdateJob.java:129)
docking.widgets.table.threaded.ThreadedTableModelUpdateMgr$ThreadRunnable.run(ThreadedTableModelUpdateMgr.java:415)
java.base@11.0.2/java.lang.Thread.run(Thread.java:834)
Name: Threaded Table Model Update Manager: Defined String Table
State: RUNNABLE
Total blocked: 362.954 Total waited: 8.897
Stack trace:
ghidra.util.datastruct.IntListIndexer.clear(IntListIndexer.java:272)
ghidra.util.datastruct.IntKeyIndexer.clear(IntKeyIndexer.java:140)
ghidra.util.datastruct.IntObjectHashtable.removeAll(IntObjectHashtable.java:108)
db.NodeMgr.releaseNodes(NodeMgr.java:126)
db.Table$LongKeyRecordIterator.<init>(Table.java:2057)
db.Table.iterator(Table.java:1800)
- locked db.DBHandle@d393b42
ghidra.program.database.map.AddressKeyRecordIterator.hasNext(AddressKeyRecordIterator.java:184)
ghidra.program.database.map.AddressKeyRecordIterator.next(AddressKeyRecordIterator.java:224)
ghidra.program.database.code.InstDBAdapterV1.getRecordAfter(InstDBAdapterV1.java:116)
ghidra.program.database.code.CodeManager.getDefinedAddressAfter(CodeManager.java:2799)
ghidra.program.database.code.DataDB.computeLength(DataDB.java:167)
ghidra.program.database.code.DataDB.<init>(DataDB.java:75)
ghidra.program.database.code.DataComponent.<init>(DataComponent.java:80)
ghidra.program.database.code.DataDB.getComponent(DataDB.java:223)
ghidra.program.util.DefinedDataIterator$DataComponentIterator.next(DefinedDataIterator.java:235)
ghidra.program.util.DefinedDataIterator.findNext(DefinedDataIterator.java:157)
ghidra.program.util.DefinedDataIterator.hasNext(DefinedDataIterator.java:131)
ghidra.app.plugin.core.strings.ViewStringsTableModel.doLoad(ViewStringsTableModel.java:117)
docking.widgets.table.threaded.ThreadedTableModel.load(ThreadedTableModel.java:177)
docking.widgets.table.threaded.TableUpdateJob.loadData(TableUpdateJob.java:357)
docking.widgets.table.threaded.TableUpdateJob.processState(TableUpdateJob.java:330)
docking.widgets.table.threaded.TableUpdateJob.run(TableUpdateJob.java:129)
docking.widgets.table.threaded.ThreadedTableModelUpdateMgr$ThreadRunnable.run(ThreadedTableModelUpdateMgr.java:415)
java.base@11.0.2/java.lang.Thread.run(Thread.java:834)
About this issue
- Original URL
- State: closed
- Created 3 years ago
- Comments: 16 (4 by maintainers)
Closed by this 3b1fdc386d26d82593 and other work. This commit fixed a large memory leak.