Skip to content

Commit

Permalink
Stop stack unwinding at non-kernel address
Browse files Browse the repository at this point in the history
The stack unwinding is for kernel addresses only. If non-kernel address
encountered, it is usually a user space address, or non-address value
like a function call parameter. So stopping stack unwinding at non-kernel
address will decrease the invalid unwind results.

Before:
crash> gdb bt
 #0  0xffffffff816a8f65 in context_switch ...
 crash-utility#1  __schedule () ...
 crash-utility#2  0xffffffff816a94e9 in schedule ...
 crash-utility#3  0xffffffff816a86fd in schedule_hrtimeout_range_clock ...
 crash-utility#4  0xffffffff816a8733 in schedule_hrtimeout_range ...
 crash-utility#5  0xffffffff8124bb7e in ep_poll ...
 crash-utility#6  0xffffffff8124d00d in SYSC_epoll_wait ...
 crash-utility#7  SyS_epoll_wait ...
 crash-utility#8  <signal handler called>
 crash-utility#9  0x00007f0449407923 in ?? ()
 crash-utility#10 0xffff880100000001 in ?? ()
 crash-utility#11 0xffff880169b3c010 in ?? ()
 crash-utility#12 0x0000000000000040 in irq_stack_union ()
 crash-utility#13 0xffff880169b3c058 in ?? ()
 crash-utility#14 0xffff880169b3c048 in ?? ()
 crash-utility#15 0xffff880169b3c050 in ?? ()
 crash-utility#16 0x0000000000000000 in ?? ()

After:
crash> gdb bt
 #0  0xffffffff816a8f65 in context_switch ...
 crash-utility#1  __schedule () ...
 crash-utility#2  0xffffffff816a94e9 in schedule () ...
 crash-utility#3  0xffffffff816a86fd in schedule_hrtimeout_range_clock ...
 crash-utility#4  0xffffffff816a8733 in schedule_hrtimeout_range ...
 crash-utility#5  0xffffffff8124bb7e in ep_poll ...
 crash-utility#6  0xffffffff8124d00d in SYSC_epoll_wait ...
 crash-utility#7  SyS_epoll_wait ...
 crash-utility#8  <signal handler called>
 crash-utility#9  0x00007f0449407923 in ?? ()

Signed-off-by: Tao Liu <[email protected]>
  • Loading branch information
liutgnu authored and adi-g15-ibm committed Mar 27, 2024
1 parent 08c6130 commit 5bfc259
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 0 deletions.
1 change: 1 addition & 0 deletions defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -7920,6 +7920,7 @@ extern unsigned char *gdb_prettyprint_arrays;
extern unsigned int *gdb_repeat_count_threshold;
extern unsigned char *gdb_stop_print_at_null;
extern unsigned int *gdb_output_radix;
int is_kvaddr(ulong);

/*
* gdb/top.c
Expand Down
26 changes: 26 additions & 0 deletions gdb-10.2.patch
Original file line number Diff line number Diff line change
Expand Up @@ -16111,3 +16111,29 @@ exit 0
}

/*
--- gdb-10.2/gdb/frame.c.orig
+++ gdb-10.2/gdb/frame.c
@@ -2331,6 +2331,10 @@ inside_entry_func (frame_info *this_frame)
This function should not contain target-dependent tests, such as
checking whether the program-counter is zero. */

+#ifdef CRASH_MERGE
+extern "C" int is_kvaddr(ulong);
+#endif
+
struct frame_info *
get_prev_frame (struct frame_info *this_frame)
{
@@ -2353,7 +2357,11 @@ get_prev_frame (struct frame_info *this_frame)
get_frame_id (this_frame);

frame_pc_p = get_frame_pc_if_available (this_frame, &frame_pc);
-
+#ifdef CRASH_MERGE
+ if (!is_kvaddr(frame_pc)) {
+ return NULL;
+ }
+#endif
/* tausq/2004-12-07: Dummy frames are skipped because it doesn't make much
sense to stop unwinding at a dummy frame. One place where a dummy
frame may have an address "inside_main_func" is on HPUX. On HPUX, the
6 changes: 6 additions & 0 deletions gdb_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -947,6 +947,12 @@ gdb_lookup_module_symbol(ulong addr, ulong *offset)
}
}

int
is_kvaddr(ulong addr)
{
return IS_KVADDR(addr);
}

/*
* Used by gdb_interface() to catch gdb-related errors, if desired.
*/
Expand Down

0 comments on commit 5bfc259

Please sign in to comment.