The kernel modules symbol translation may change after a c expression
evaluation.
without patch:
crash> mod -S
crash> struct blk_mq_ops 0xffffffffc00a7160
struct blk_mq_ops {
queue_rq = 0xffffffffc00a45b0 <virtio_queue_rq>, <--symbol translated from
kernel
map_queue = 0xffffffff813015c0 <blk_mq_map_queue>,
...snip...
complete = 0xffffffffc00a4370 <virtblk_request_done>,
init_request = 0xffffffffc00a4260 <virtblk_init_request>,
...snip...
}
crash> px ((struct request *)0xffff880fdb246000)->q->mq_ops
$1 = (struct blk_mq_ops *) 0xffffffffc00a7160 <virtio_mq_ops>
crash> struct blk_mq_ops 0xffffffffc00a7160
struct blk_mq_ops {
queue_rq = 0xffffffffc00a45b0 <floppy_module_init+1151>, <--symbol translated
from module
map_queue = 0xffffffff813015c0 <blk_mq_map_queue>,
...snip...
complete = 0xffffffffc00a4370 <floppy_module_init+575>,
init_request = 0xffffffffc00a4260 <floppy_module_init+303>,
...snip...
}
with patch:
crash> mod -S
crash> struct blk_mq_ops 0xffffffffc00a7160
struct blk_mq_ops {
queue_rq = 0xffffffffc00a45b0 <floppy_module_init+1151>, <--symbol translated
from module
map_queue = 0xffffffff813015c0 <blk_mq_map_queue>,
...snip...
complete = 0xffffffffc00a4370 <floppy_module_init+575>,
init_request = 0xffffffffc00a4260 <floppy_module_init+303>,
..snip...
}
crash> px ((struct request *)0xffff880fdb246000)->q->mq_ops
$1 = (struct blk_mq_ops *) 0xffffffffc00a7160 <virtio_mq_ops>
crash> struct blk_mq_ops 0xffffffffc00a7160
struct blk_mq_ops {
queue_rq = 0xffffffffc00a45b0 <floppy_module_init+1151>, <--symbol translated
from module
map_queue = 0xffffffff813015c0 <blk_mq_map_queue>,
...snip...
complete = 0xffffffffc00a4370 <floppy_module_init+575>,
init_request = 0xffffffffc00a4260 <floppy_module_init+303>,
...snip...
}
The root cause for the changing of symbol translation is, after "mod -S", the
kernel modules files "*.ko.debug" will be loaded. However the compile unit
symtable of the kernel modules may not get expanded. As a result, the symtable
of kernel modules, or obj_file->compunit_symtabs is nullptr, which don't take
any effect for gdb symbol translation, it is unexpected. A c expression
evaluation will trigger such an expansion.
This patch will make sure symtable always get expanded before gdb symbol
translation.
Signed-off-by: Tao Liu <ltao(a)redhat.com>
---
gdb-10.2.patch | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/gdb-10.2.patch b/gdb-10.2.patch
index d81030d..31135ca 100644
--- a/gdb-10.2.patch
+++ b/gdb-10.2.patch
@@ -3187,3 +3187,20 @@ exit 0
result = stringtab + symbol_entry->_n._n_n._n_offset;
}
else
+--- gdb-10.2/gdb/symtab.c.orig
++++ gdb-10.2/gdb/symtab.c
+@@ -2931,6 +2931,14 @@ find_pc_sect_compunit_symtab (CORE_ADDR pc, struct obj_section
*section)
+
+ for (objfile *obj_file : current_program_space->objfiles ())
+ {
++#ifdef CRASH_MERGE
++ std::string objfile_name = objfile_filename(obj_file);
++
++ if (objfile_name.find(".ko") != std::string::npos) {
++ if (obj_file->sf && obj_file->compunit_symtabs == nullptr)
++ obj_file->sf->qf->expand_all_symtabs(obj_file);
++ }
++#endif
+ for (compunit_symtab *cust : obj_file->compunits ())
+ {
+ const struct block *b;
\ No newline at end of file
--
2.40.1