diff options
author | Simon Marchi <simon.marchi@polymtl.ca> | 2025-07-03 13:37:41 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2025-07-03 15:37:08 -0400 |
commit | b7ff16c68a2c0bacc0416c4b36a44e65888ce72b (patch) | |
tree | ae0d76bb3faf4b2756c40f9430866b8bd891bb99 /gdb | |
parent | 27e5f9c97599fa335f61340a726337cb4ce62804 (diff) | |
download | binutils-b7ff16c68a2c0bacc0416c4b36a44e65888ce72b.zip binutils-b7ff16c68a2c0bacc0416c4b36a44e65888ce72b.tar.gz binutils-b7ff16c68a2c0bacc0416c4b36a44e65888ce72b.tar.bz2 |
gdb/linux-nat: initialize lwp_info::syscall_state
When running gdb.base/foll-fork-syscall.exp with a GDB built with UBSan,
I get:
/home/simark/src/binutils-gdb/gdb/linux-nat.c:1906:28: runtime error: load of value 3200171710, which is not a valid value for type 'target_waitkind'
ERROR: GDB process no longer exists
GDB process exited with wait status 3026417 exp9 0 1
UNRESOLVED: gdb.base/foll-fork-syscall.exp: follow-fork-mode=child: detach-on-fork=on: test_catch_syscall: continue to breakpoint after fork
The error happens here:
#0 __sanitizer::Die () at /usr/src/debug/gcc/gcc/libsanitizer/sanitizer_common/sanitizer_termination.cpp:50
#1 0x00007ffff600d8dd in __ubsan::__ubsan_handle_load_invalid_value_abort (Data=<optimized out>, Val=<optimized out>) at /usr/src/debug/gcc/gcc/libsanitizer/ubsan/ubsan_handlers.cpp:551
#2 0x00005555636d37b6 in linux_handle_syscall_trap (lp=0x7cdff1eb1b00, stopping=0) at /home/simark/src/binutils-gdb/gdb/linux-nat.c:1906
#3 0x00005555636e0991 in linux_nat_filter_event (lwpid=3030627, status=1407) at /home/simark/src/binutils-gdb/gdb/linux-nat.c:3044
#4 0x00005555636e407f in linux_nat_wait_1 (ptid=..., ourstatus=0x7bfff0d6cf18, target_options=...) at /home/simark/src/binutils-gdb/gdb/linux-nat.c:3381
#5 0x00005555636e7795 in linux_nat_target::wait (this=0x5555704d35e0 <the_amd64_linux_nat_target>, ptid=..., ourstatus=0x7bfff0d6cf18, target_options=...) at /home/simark/src/binutils-gdb/gdb/linux-nat.c:3607
#6 0x000055556378fad2 in thread_db_target::wait (this=0x55556af42980 <the_thread_db_target>, ptid=..., ourstatus=0x7bfff0d6cf18, options=...) at /home/simark/src/binutils-gdb/gdb/linux-thread-db.c:1398
#7 0x0000555564811327 in target_wait (ptid=..., status=0x7bfff0d6cf18, options=...) at /home/simark/src/binutils-gdb/gdb/target.c:2593
I believe the problem is that lwp_info::syscall_state is never
initialized. Fix that by initializing it with TARGET_WAITKIND_IGNORE.
This is the value we use elsewhere when resetting this field to mean
"not stopped at a syscall".
Change-Id: I5b76c63d1466d6e63448fced03305fd5ca8294eb
Approved-By: Tom Tromey <tom@tromey.com>
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/linux-nat.h | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/gdb/linux-nat.h b/gdb/linux-nat.h index 21ec309..7cbe9a9 100644 --- a/gdb/linux-nat.h +++ b/gdb/linux-nat.h @@ -279,12 +279,12 @@ struct lwp_info : intrusive_list_node<lwp_info> will be recorded here, while 'status == 0' is ambiguous. */ struct target_waitstatus waitstatus; - /* Signal whether we are in a SYSCALL_ENTRY or - in a SYSCALL_RETURN event. - Values: - - TARGET_WAITKIND_SYSCALL_ENTRY - - TARGET_WAITKIND_SYSCALL_RETURN */ - enum target_waitkind syscall_state; + /* Signal whether we are in a SYSCALL_ENTRY or SYSCALL_RETURN event. + + Valid values are TARGET_WAITKIND_SYSCALL_ENTRY, + TARGET_WAITKIND_SYSCALL_RETURN, or TARGET_WAITKIND_SYSCALL_IGNORE, when + not stopped at a syscall. */ + target_waitkind syscall_state = TARGET_WAITKIND_IGNORE; /* The processor core this LWP was last seen on. */ int core = -1; |