forked from Imagelibrary/binutils-gdb
It is possible to run GDB's testsuite against installed binaries rather
than the one from the build tree. For example, one could do:
$ make check-gdb RUNTESTFLAGS=GDB=/usr/bin/gdb
Running the testsuite this way causes error for gdb.base/gcorebg.exp:
Running [...]/gdb/testsuite/gdb.base/gcorebg.exp ...
FAIL: gdb.base/gcorebg.exp: detached=detached: Spawned gcore finished
FAIL: gdb.base/gcorebg.exp: detached=detached: Core file generated by gcore
FAIL: gdb.base/gcorebg.exp: detached=standard: Spawned gcore finished
FAIL: gdb.base/gcorebg.exp: detached=standard: Core file generated by gcore
This is due to 2 problems.
First, when running this way, the $GDB_DATA_DIRECTORY is not set (on
purpose) as the installed GDB does not need to be specified where to
find it. See this section in gdb/testsuite/lib/gdb.exp:
if ![info exists GDB] {
[....]
} else {
# If the user specifies GDB on the command line, and doesn't
# specify GDB_DATA_DIRECTORY, then assume we're testing an
# installed GDB, and let it use its own configured data directory.
if ![info exists GDB_DATA_DIRECTORY] {
set GDB_DATA_DIRECTORY ""
}
}
The testbg.exp file always assumes a non-empty GDB_DATA_DIRECTORY. As a
consequence, when calling the gcorebg binary with an empty argument
(i.e. missing argument), the program fails:
gcorebg: [...]/gdb/testsuite/gdb.base/gcorebg.c:42: main: Assertion `argc == 5' failed.
FAIL: gdb.base/gcorebg.exp: detached=standard: Spawned gcore finished
This patch does adjust the gcorebg.c and gcorebg.exp files to allow not
specifying the data-directory.
The other issue is that the testsuite assumes that the `gcore` to test
is always the one from the build tree. However, if someone is testing
an installed binary by setting GDB, I think that person would expect to
test the `gcore` script next to the binary that was specified (unless
GCORE is specified to explicitly specified). This patch does that
adjustment as well. To that end, it needs to move the block setting
GCORE after the block setting GDB.
Change-Id: I070e039903c0b5afeac357d8fac7d710ff6697b9
Approved-By: Tom Tromey <tom@tromey.com>
77 lines
1.9 KiB
C
77 lines
1.9 KiB
C
/* Copyright 2007-2024 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/>. */
|
|
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <assert.h>
|
|
#include <sys/wait.h>
|
|
#include <errno.h>
|
|
|
|
/* Expects 3 arguments:
|
|
|
|
1. Either 'standard' or 'detached', where 'standard' tests
|
|
a general gcore script spawn with its controlling terminal available
|
|
and 'detached' tests gcore script spawn without its controlling
|
|
terminal available.
|
|
2. The command to invoke gcore (path to the gcore script and any necessary
|
|
flags).
|
|
3. The core file output name. */
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
pid_t pid = 0;
|
|
pid_t ppid;
|
|
char buf[1024*2 + 500];
|
|
int gotint, res;
|
|
|
|
assert (argc == 4);
|
|
|
|
pid = fork ();
|
|
|
|
switch (pid)
|
|
{
|
|
case 0:
|
|
if (strcmp (argv[1], "detached") == 0)
|
|
setpgrp ();
|
|
ppid = getppid ();
|
|
gotint = snprintf (buf, sizeof (buf), "%s -o %s %d",
|
|
argv[2], argv[3], (int) ppid);
|
|
assert (gotint < sizeof (buf));
|
|
res = system (buf);
|
|
assert (res != -1);
|
|
break;
|
|
|
|
case -1:
|
|
perror ("fork err\n");
|
|
exit (1);
|
|
break;
|
|
|
|
default:
|
|
do
|
|
{
|
|
res = waitpid (pid, NULL, 0);
|
|
}
|
|
while (res == -1 && errno == EINTR);
|
|
|
|
assert (res == pid);
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
}
|