eb33a57b1e
Resolves: RHEL-13915 Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
172 lines
7.3 KiB
Diff
172 lines
7.3 KiB
Diff
From f2ee6fa6c841ddc37ba665909dafbc7294c34d64 Mon Sep 17 00:00:00 2001
|
|
From: Tao Liu <ltao@redhat.com>
|
|
Date: Fri, 17 Nov 2023 15:52:19 +0800
|
|
Subject: [PATCH 04/14] symbols: expand all kernel module symtable if not all
|
|
expanded previously
|
|
|
|
There is an issue that, for kernel modules, "dis -rl" fails to display
|
|
modules code line number data after execute "bt" command in crash.
|
|
|
|
Without the patch:
|
|
crsah> mod -S
|
|
crash> bt
|
|
PID: 1500 TASK: ff2bd8b093524000 CPU: 16 COMMAND: "lpfc_worker_0"
|
|
#0 [ff2c9f725c39f9e0] machine_kexec at ffffffff8e0686d3
|
|
...snip...
|
|
#8 [ff2c9f725c39fcc0] __lpfc_sli_release_iocbq_s4 at ffffffffc0f2f425 [lpfc]
|
|
...snip...
|
|
crash> dis -rl ffffffffc0f60f82
|
|
0xffffffffc0f60eb0 <lpfc_nlp_get>: nopl 0x0(%rax,%rax,1) [FTRACE NOP]
|
|
0xffffffffc0f60eb5 <lpfc_nlp_get+5>: push %rbp
|
|
0xffffffffc0f60eb6 <lpfc_nlp_get+6>: push %rbx
|
|
0xffffffffc0f60eb7 <lpfc_nlp_get+7>: test %rdi,%rdi
|
|
|
|
With the patch:
|
|
crash> mod -S
|
|
crash> bt
|
|
PID: 1500 TASK: ff2bd8b093524000 CPU: 16 COMMAND: "lpfc_worker_0"
|
|
#0 [ff2c9f725c39f9e0] machine_kexec at ffffffff8e0686d3
|
|
...snip...
|
|
#8 [ff2c9f725c39fcc0] __lpfc_sli_release_iocbq_s4 at ffffffffc0f2f425 [lpfc]
|
|
...snip...
|
|
crash> dis -rl ffffffffc0f60f82
|
|
/usr/src/debug/kernel-4.18.0-425.13.1.el8_7/linux-4.18.0-425.13.1.el8_7.x86_64/drivers/scsi/lpfc/lpfc_hbadisc.c: 6756
|
|
0xffffffffc0f60eb0 <lpfc_nlp_get>: nopl 0x0(%rax,%rax,1) [FTRACE NOP]
|
|
/usr/src/debug/kernel-4.18.0-425.13.1.el8_7/linux-4.18.0-425.13.1.el8_7.x86_64/drivers/scsi/lpfc/lpfc_hbadisc.c: 6759
|
|
0xffffffffc0f60eb5 <lpfc_nlp_get+5>: push %rbp
|
|
|
|
The root cause is, after kernel module been loaded by mod command, the symtable
|
|
is not expanded in gdb side. crash bt or dis command will trigger such an
|
|
expansion. However the symtable expansion is different for the 2 commands:
|
|
|
|
The stack trace of "dis -rl" for symtable expanding:
|
|
|
|
#0 0x00000000008d8d9f in add_compunit_symtab_to_objfile ...
|
|
#1 0x00000000006d3293 in buildsym_compunit::end_symtab_with_blockvector ...
|
|
#2 0x00000000006d336a in buildsym_compunit::end_symtab_from_static_block ...
|
|
#3 0x000000000077e8e9 in process_full_comp_unit ...
|
|
#4 process_queue ...
|
|
#5 dw2_do_instantiate_symtab ...
|
|
#6 0x000000000077ed67 in dw2_instantiate_symtab ...
|
|
#7 0x000000000077f75e in dw2_expand_all_symtabs ...
|
|
#8 0x00000000008f254d in gdb_get_line_number ...
|
|
#9 0x00000000008f22af in gdb_command_funnel_1 ...
|
|
#10 0x00000000008f2003 in gdb_command_funnel ...
|
|
#11 0x00000000005b7f02 in gdb_interface ...
|
|
#12 0x00000000005f5bd8 in get_line_number ...
|
|
#13 0x000000000059e574 in cmd_dis ...
|
|
|
|
The stack trace of "bt" for symtable expanding:
|
|
|
|
#0 0x00000000008d8d9f in add_compunit_symtab_to_objfile ...
|
|
#1 0x00000000006d3293 in buildsym_compunit::end_symtab_with_blockvector ...
|
|
#2 0x00000000006d336a in buildsym_compunit::end_symtab_from_static_block ...
|
|
#3 0x000000000077e8e9 in process_full_comp_unit ...
|
|
#4 process_queue ...
|
|
#5 dw2_do_instantiate_symtab ...
|
|
#6 0x000000000077ed67 in dw2_instantiate_symtab ...
|
|
#7 0x000000000077f8ed in dw2_lookup_symbol ...
|
|
#8 0x00000000008e6d03 in lookup_symbol_via_quick_fns ...
|
|
#9 0x00000000008e7153 in lookup_symbol_in_objfile ...
|
|
#10 0x00000000008e73c6 in lookup_symbol_global_or_static_iterator_cb ...
|
|
#11 0x00000000008b99c4 in svr4_iterate_over_objfiles_in_search_order ...
|
|
#12 0x00000000008e754e in lookup_global_or_static_symbol ...
|
|
#13 0x00000000008e75da in lookup_static_symbol ...
|
|
#14 0x00000000008e632c in lookup_symbol_aux ...
|
|
#15 0x00000000008e5a7a in lookup_symbol_in_language ...
|
|
#16 0x00000000008e5b30 in lookup_symbol ...
|
|
#17 0x00000000008f2a4a in gdb_get_datatype ...
|
|
#18 0x00000000008f22c0 in gdb_command_funnel_1 ...
|
|
#19 0x00000000008f2003 in gdb_command_funnel ...
|
|
#20 0x00000000005b7f02 in gdb_interface ...
|
|
#21 0x00000000005f8a9f in datatype_info ...
|
|
#22 0x0000000000599947 in cpu_map_size ...
|
|
#23 0x00000000005a975d in get_cpus_online ...
|
|
#24 0x0000000000637a8b in diskdump_get_prstatus_percpu ...
|
|
#25 0x000000000062f0e4 in get_netdump_regs_x86_64 ...
|
|
#26 0x000000000059fe68 in back_trace ...
|
|
#27 0x00000000005ab1cb in cmd_bt ...
|
|
|
|
For the stacktrace of "dis -rl", it calls dw2_expand_all_symtabs() to expand
|
|
all symtable of the objfile, or "*.ko.debug" in our case. However for
|
|
the stacktrace of "bt", it doesn't expand all, but only a subset of symtable
|
|
which is enough to find a symbol by dw2_lookup_symbol(). As a result, the
|
|
objfile->compunit_symtabs, which is the head of a single linked list of
|
|
struct compunit_symtab, is not NULL but didn't contain all symtables. It
|
|
will not be reinitialized in gdb_get_line_number() by "dis -rl" because
|
|
!objfile_has_full_symbols(objfile) check will fail, so it cannot display
|
|
the proper code line number data.
|
|
|
|
Since objfile_has_full_symbols(objfile) check cannot ensure all symbols
|
|
been expanded, this patch add a new member as a flag for struct objfile
|
|
to record if all symbols have been expanded. The flag will be set only ofter
|
|
expand_all_symtabs been called.
|
|
|
|
Signed-off-by: Tao Liu <ltao@redhat.com>
|
|
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
|
|
---
|
|
gdb-10.2.patch | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 50 insertions(+)
|
|
|
|
diff --git a/gdb-10.2.patch b/gdb-10.2.patch
|
|
index d81030d946e8..2f7d585105aa 100644
|
|
--- a/gdb-10.2.patch
|
|
+++ b/gdb-10.2.patch
|
|
@@ -3187,3 +3187,53 @@ exit 0
|
|
result = stringtab + symbol_entry->_n._n_n._n_offset;
|
|
}
|
|
else
|
|
+--- gdb-10.2/gdb/objfiles.h.orig
|
|
++++ gdb-10.2/gdb/objfiles.h
|
|
+@@ -712,6 +712,8 @@ struct objfile
|
|
+ next time. If an objfile does not have the symbols, it will
|
|
+ never have them. */
|
|
+ bool skip_jit_symbol_lookup = false;
|
|
++
|
|
++ bool all_symtabs_expanded = false;
|
|
+ };
|
|
+
|
|
+ /* A deleter for objfile. */
|
|
+--- gdb-10.2/gdb/symfile.c.orig
|
|
++++ gdb-10.2/gdb/symfile.c
|
|
+@@ -1133,8 +1133,10 @@ symbol_file_add_with_addrs (bfd *abfd, const char *name,
|
|
+ printf_filtered (_("Expanding full symbols from %ps...\n"),
|
|
+ styled_string (file_name_style.style (), name));
|
|
+
|
|
+- if (objfile->sf)
|
|
++ if (objfile->sf) {
|
|
+ objfile->sf->qf->expand_all_symtabs (objfile);
|
|
++ objfile->all_symtabs_expanded = true;
|
|
++ }
|
|
+ }
|
|
+
|
|
+ /* Note that we only print a message if we have no symbols and have
|
|
+--- gdb-10.2/gdb/symtab.c.orig
|
|
++++ gdb-10.2/gdb/symtab.c
|
|
+@@ -7097,8 +7097,9 @@ gdb_get_line_number(struct gnu_request *req)
|
|
+ */
|
|
+ if (req->lm) {
|
|
+ objfile = req->lm->loaded_objfile;
|
|
+- if (!objfile_has_full_symbols(objfile) && objfile->sf) {
|
|
++ if (!objfile->all_symtabs_expanded && objfile->sf) {
|
|
+ objfile->sf->qf->expand_all_symtabs(objfile);
|
|
++ objfile->all_symtabs_expanded = true;
|
|
+ sal = find_pc_line(pc, 0);
|
|
+ }
|
|
+ }
|
|
+@@ -7761,8 +7765,10 @@ iterate_datatypes (struct gnu_request *req)
|
|
+ {
|
|
+ for (objfile *objfile : current_program_space->objfiles ())
|
|
+ {
|
|
+- if (objfile->sf)
|
|
++ if (objfile->sf) {
|
|
+ objfile->sf->qf->expand_all_symtabs(objfile);
|
|
++ objfile->all_symtabs_expanded = true;
|
|
++ }
|
|
+
|
|
+ for (compunit_symtab *cust : objfile->compunits ())
|
|
+ {
|
|
--
|
|
2.41.0
|
|
|