This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[RFA 0/5] Improve DWARF Type Unit performance
- From: dje at google dot com (Doug Evans)
- To: gdb-patches at sourceware dot org
- Date: Tue, 10 Jul 2012 00:54:56 -0700 (PDT)
- Subject: [RFA 0/5] Improve DWARF Type Unit performance
Hi.
This patch series is a step to improve gdb's performance with
DWARF4 type units. In large programs there can be an order of magnitude
or greater more type units than comp units, and gdb's current handling
of them measurably slows down.
My canonical testcase has ~200K TUs and ~8K CUs.
Another example is http://sourceware.org/bugzilla/show_bug.cgi?id=13498.
There's more I want to do in this area, but this is a good step.
It groups TUs by the DW_AT_stmt_list value they use, which is a natural
way to organize the symbol tables since gdb organizes symbol tables by
file name.
One possible future step is to use the same symtabs that a CU uses for
TUs with the same DW_AT_stmt_list value. I didn't do this here because
that would be more invasive and I want to approach this incrementally.
Another possible future step is to lazily expand types.
But that's for another day too.
I've regression tested this with/without .debug_types, as well as
with dwz, .gdb_index, and fission.
Here are some timings I've collected.
---
gdb $program # no .gdb_index
start
b foo.h:897 #1
d 2
b foo.h:897 #2
Before:
#1: 44 seconds (cpu & wall), 2G (additional) memory
#2: 3.3 seconds (cpu & wall), 0 (additional) memory
After:
#1: 9.5 seconds (cpu & wall), 950M (add'l) memory
#2: 0.05 seconds (cpu & wall). 0 (add'l) memory
---
gdb $program # with .gdb_index v7
rbreak foo.h:Init
[measuring just time taken by search_symbols]
Before: 492sec wall, 11G (add'l) memory, at which point I killed it
After: 187sec wall, ~6G (add'l) memory
---
gdb $program # with .gdb_index v7
complete break logg
Before: 5.7sec wall, 0 (add'l) memory
After: 0.8sec wall, 0 (add'l) memory
---
gdb $program # with .gdb_index v7
info fun Task
info sources
Before:
info fun Task: 19sec cpu&wall, 300M (add'l) memory
info sources: 66sec cpu, 130 sec wall, 314M (add'l) memory
After:
info fun Task: 7sec cpu&wall, 56M (add'l) memory
info sources: 16sec cpu, 20sec wall, 250M (add'l) memory