aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.rocm/mi-attach.cpp
diff options
context:
space:
mode:
authorLancelot Six <lancelot.six@amd.com>2025-02-11 22:47:50 +0000
committerLancelot Six <lancelot.six@amd.com>2025-02-19 16:52:25 +0000
commit6ded2b869291c2925316dbd215d38502021fb67b (patch)
treeec33d8e724c6cd27ee5820402590d93dd120b05a /gdb/testsuite/gdb.rocm/mi-attach.cpp
parentb0c676f45635b6e6986eb60908b514f84c933057 (diff)
downloadbinutils-6ded2b869291c2925316dbd215d38502021fb67b.zip
binutils-6ded2b869291c2925316dbd215d38502021fb67b.tar.gz
binutils-6ded2b869291c2925316dbd215d38502021fb67b.tar.bz2
gdb/mi: Fix segfault when attaching a rocm process with MI
When using the MI interpreter, if someone was to attach to a ROCm process which has active GPU waves, GDB would issue a segfault as follows: attach 1994813 &"attach 1994813\n" ~"Attaching to process 1994813\n" =thread-group-started,id="i1",pid="1994813" =thread-created,id="1",group-id="i1" =thread-created,id="2",group-id="i1" ~"[New LWP 1994828]\n" *running,thread-id="2" =thread-created,id="3",group-id="i1" ~"[New LWP 1994825]\n" *running,thread-id="3" =thread-created,id="4",group-id="i1" ~"[New LWP 1994823]\n" *running,thread-id="4" ^done =library-loaded,... [...] ~"[Thread debugging using libthread_db enabled]\n" ~"Using host libthread_db library \"/lib/x86_64-linux-gnu/libthread_db.so.1\".\n" =thread-created,id="5",group-id="i1" &"\n\n" &"Fatal signal: " &"Segmentation fault" &"\n" &"----- Backtrace -----\n" &"Backtrace unavailable\n" &"---------------------\n" &"A fatal error internal to GDB has been detected, further\ndebugging is not possible. GDB will now terminate.\n\n" &"This is a bug, please report it." &" For instructions, see:\n" &"<https://github.com/ROCm-Developer-Tools/ROCgdb/issues>" &"." &"\n\n" Segmentation fault The issue comes from using a non-initialized pointer in mi_on_resume_1: if (!mi->running_result_record_printed && mi->mi_proceeded) { gdb_printf (mi->raw_stdout, "%s^running\n", mi->current_token ? mi->current_token : ""); } In this instance, "mi->current_token" has an uninitialized value. This is a regression introduced by: commit def2803789208a617c429b5dcf2026decb25ce0c Date: Wed Sep 6 11:02:00 2023 -0400 gdb/mi: make current_token a field of mi_interp Before this patch, current_token was a global implicitly 0-initialized. Since it is now a class field, it is not 0-initialized by default anymore. This patch changes this. Change-Id: I3f00b080318a70405d881ff0abe02b2c5cb1f9d8 Approved-By: Simon Marchi <simon.marchi@efficios.com> Approved-By: Tom Tromey <tom@tromey.com>
Diffstat (limited to 'gdb/testsuite/gdb.rocm/mi-attach.cpp')
-rw-r--r--gdb/testsuite/gdb.rocm/mi-attach.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.rocm/mi-attach.cpp b/gdb/testsuite/gdb.rocm/mi-attach.cpp
new file mode 100644
index 0000000..da7659d
--- /dev/null
+++ b/gdb/testsuite/gdb.rocm/mi-attach.cpp
@@ -0,0 +1,38 @@
+/* Copyright 2025 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <unistd.h>
+#include <hip/hip_runtime.h>
+
+__global__ void
+kern ()
+{
+ while (true)
+ __builtin_amdgcn_s_sleep (8);
+}
+
+int
+main ()
+{
+ /* This program will run outside of GDB, make sure that if anything goes
+ wrong it eventually gets killed. */
+ alarm (30);
+
+ kern<<<1, 1>>> ();
+ return hipDeviceSynchronize () != hipSuccess;
+}
+