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)

Most upvoted comments

Closed by this 3b1fdc386d26d82593 and other work. This commit fixed a large memory leak.