mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
178d6a6386
On Windows, using the "-list-thread-groups --available" GDB/MI command before an inferior is being debugged: % gdb -q -i=mi =thread-group-added,id="i1" =cmd-param-changed,param="auto-load safe-path",value="/" (gdb) -list-thread-groups --available Segmentation fault Ooops! The SEGV happens because the -list-thread-groups --available command triggers a windows_nat_target::xfer_partial call for a TARGET_OBJECT_OSDATA object. Until a program is being debugged, the target_ops layer that gets the call is the Windows "native" layer. Except for a couple of specific objects (TARGET_OBJECT_MEMORY and TARGET_OBJECT_LIBRARIES), this layer's xfer_partial method delegates the xfer of other objects to the target beneath: default: return beneath->xfer_partial (object, annex, readbuf, writebuf, offset, len, xfered_len); Unfortunately, there is no "beneath layer" in this case, so beneath is NULL and dereferencing it leads to the SEGV. This patch fixes the issue by checking beneath before trying to delegate the request. gdb/ChangeLog: * windows-nat.c (windows_nat_target::xfer_partial): Return TARGET_XFER_E_IO if we need to delegate to the target beneath but BENEATH is NULL. gdb/testsuite/ChangeLog: * gdb.mi/list-thread-groups-no-inferior.exp: New testcase.
48 lines
1.5 KiB
Plaintext
48 lines
1.5 KiB
Plaintext
# Copyright 2018 Free Software Foundation, Inc.
|
|
|
|
# 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/>.
|
|
|
|
# The purpose of this test is to verify that GDB is able to handle
|
|
# the "-list-thread-groups --available" command, even when there is
|
|
# no inferior. In particular, we want to verify that GDB does not
|
|
# crash.
|
|
|
|
load_lib mi-support.exp
|
|
set MIFLAGS "-i=mi"
|
|
|
|
gdb_exit
|
|
if [mi_gdb_start] {
|
|
continue
|
|
}
|
|
|
|
# Try the "-list-thread-groups --available". This command can generate
|
|
# a very large amount of output, potentially exceeding expect's buffer
|
|
# size. So we consume the output in chunks.
|
|
|
|
set test "-list-thread-groups --available"
|
|
gdb_test_multiple $test $test {
|
|
-re "\}" {
|
|
exp_continue
|
|
}
|
|
-re "\r\n$gdb_prompt " {
|
|
pass $test
|
|
}
|
|
}
|
|
|
|
# Verify that GDB is still alive.
|
|
|
|
mi_gdb_test "-data-evaluate-expression 1" \
|
|
".*\\^done,value=\"1\"" \
|
|
"GDB is still alive"
|