Fix internal warning when "gdb -p xxx"

ps -e | grep a.out
28886 pts/12   00:00:00 a.out
gdb -p 28886
Loaded symbols for /lib64/ld-linux-x86-64.so.2
0x0000003b0ccbc970 in __nanosleep_nocancel () from /lib64/libc.so.6
../../binutils-gdb/gdb/cleanups.c:265: internal-warning: restore_my_cleanups has found a stale cleanup
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n)

The backtrace of this issue:
(gdb) bt
    file=0x8b0c10 "s' failed.", line=265, fmt=0x8b0c38 "nutils-gdb/gdb/cleanups.c",
    ap=0x7fff803e3ed8) at ../../binutils-gdb/gdb/utils.c:748
    fmt=0x8b0c38 "nutils-gdb/gdb/cleanups.c", ap=0x7fff803e3ed8)
    at ../../binutils-gdb/gdb/utils.c:799
    string=0x8b0c38 "nutils-gdb/gdb/cleanups.c") at ../../binutils-gdb/gdb/utils.c:809
    at ../../binutils-gdb/gdb/cleanups.c:265
    at ../../binutils-gdb/gdb/cleanups.c:276
    at ../../binutils-gdb/gdb/exceptions.c:142
    at ../../binutils-gdb/gdb/exceptions.c:203
    command=0x5d5fb8 <attach_command_continuation_free_args+18>, arg=0x7fff803e525b "2914",
    from_tty=1, mask=RETURN_MASK_ALL) at ../../binutils-gdb/gdb/exceptions.c:549
---Type <return> to continue, or q <return> to quit---
    func_args=0x7fff803e4280, errstring=0x8cf2e4 "/local/bin", mask=RETURN_MASK_ALL)
    at ../../binutils-gdb/gdb/exceptions.c:522

This is a new issue.  It is introduced by commit https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=8bc2fe488957946d2cdccda3ce8d4f39e4003ea0
It removed the discard_cleanups (back_to) inside attach_command.
Then restore_my_cleanups will throw a internal_warning.

https://sourceware.org/ml/gdb-patches/2014-03/msg00374.html

2014-03-21  Hui Zhu  <hui@codesourcery.com>
	    Pedro Alves  <palves@redhat.com>

	* darwin-nat.c (darwin_pid_to_exec_file): Change xmalloc to
	static buffer.
	* fbsd-nat.c (fbsd_pid_to_exec_file): Ditto.
	* linux-nat.c (linux_child_pid_to_exec_file): Ditto.
	* nbsd-nat.c (nbsd_pid_to_exec_file): Ditto.
This commit is contained in:
Hui Zhu 2014-03-21 10:25:41 +08:00
parent a2db7c0751
commit b4ab256ded
5 changed files with 35 additions and 33 deletions

View File

@ -1,3 +1,12 @@
2014-03-21 Hui Zhu <hui@codesourcery.com>
Pedro Alves <palves@redhat.com>
* darwin-nat.c (darwin_pid_to_exec_file): Change xmalloc to
static buffer.
* fbsd-nat.c (fbsd_pid_to_exec_file): Ditto.
* linux-nat.c (linux_child_pid_to_exec_file): Ditto.
* nbsd-nat.c (nbsd_pid_to_exec_file): Ditto.
2014-03-20 Maciej W. Rozycki <macro@codesourcery.com> 2014-03-20 Maciej W. Rozycki <macro@codesourcery.com>
* mi/mi-interp.c (mi_memory_changed): Avoid using the ISO C99 * mi/mi-interp.c (mi_memory_changed): Avoid using the ISO C99

View File

@ -1991,12 +1991,9 @@ set_enable_mach_exceptions (char *args, int from_tty,
static char * static char *
darwin_pid_to_exec_file (struct target_ops *self, int pid) darwin_pid_to_exec_file (struct target_ops *self, int pid)
{ {
char *path; static char path[PATH_MAX];
int res; int res;
path = xmalloc (PATH_MAX);
make_cleanup (xfree, path);
res = proc_pidinfo (pid, PROC_PIDPATHINFO, 0, path, PATH_MAX); res = proc_pidinfo (pid, PROC_PIDPATHINFO, 0, path, PATH_MAX);
if (res >= 0) if (res >= 0)
return path; return path;

View File

@ -39,9 +39,9 @@
char * char *
fbsd_pid_to_exec_file (struct target_ops *self, int pid) fbsd_pid_to_exec_file (struct target_ops *self, int pid)
{ {
size_t len = PATH_MAX; ssize_t len = PATH_MAX;
char *buf = xcalloc (len, sizeof (char)); static char buf[PATH_MAX];
char *path; char name[PATH_MAX];
#ifdef KERN_PROC_PATHNAME #ifdef KERN_PROC_PATHNAME
int mib[4]; int mib[4];
@ -54,15 +54,15 @@ fbsd_pid_to_exec_file (struct target_ops *self, int pid)
return buf; return buf;
#endif #endif
path = xstrprintf ("/proc/%d/file", pid); xsnprintf (name, PATH_MAX, "/proc/%d/exe", pid);
if (readlink (path, buf, PATH_MAX - 1) == -1) len = readlink (name, buf, PATH_MAX - 1);
if (len != -1)
{ {
xfree (buf); buf[len] = '\0';
buf = NULL; return buf;
} }
xfree (path); return NULL;
return buf;
} }
static int static int

View File

@ -4011,19 +4011,15 @@ linux_nat_thread_name (struct target_ops *self, struct thread_info *thr)
static char * static char *
linux_child_pid_to_exec_file (struct target_ops *self, int pid) linux_child_pid_to_exec_file (struct target_ops *self, int pid)
{ {
char *name1, *name2; static char buf[PATH_MAX];
char name[PATH_MAX];
name1 = xmalloc (PATH_MAX); xsnprintf (name, PATH_MAX, "/proc/%d/exe", pid);
name2 = xmalloc (PATH_MAX); memset (buf, 0, PATH_MAX);
make_cleanup (xfree, name1); if (readlink (name, buf, PATH_MAX - 1) <= 0)
make_cleanup (xfree, name2); strcpy (buf, name);
memset (name2, 0, PATH_MAX);
xsnprintf (name1, PATH_MAX, "/proc/%d/exe", pid); return buf;
if (readlink (name1, name2, PATH_MAX - 1) > 0)
return name2;
else
return name1;
} }
/* Records the thread's register state for the corefile note /* Records the thread's register state for the corefile note

View File

@ -27,17 +27,17 @@
char * char *
nbsd_pid_to_exec_file (struct target_ops *self, int pid) nbsd_pid_to_exec_file (struct target_ops *self, int pid)
{ {
size_t len = PATH_MAX; ssize_t len;
char *buf = xcalloc (len, sizeof (char)); static char buf[PATH_MAX];
char *path; char name[PATH_MAX];
path = xstrprintf ("/proc/%d/exe", pid); xsnprintf (name, PATH_MAX, "/proc/%d/exe", pid);
if (readlink (path, buf, PATH_MAX - 1) == -1) len = readlink (name, buf, PATH_MAX - 1);
if (len != -1)
{ {
xfree (buf); buf[len] = '\0';
buf = NULL; return buf;
} }
xfree (path); return NULL;
return buf;
} }