aboutsummaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2014-10-09 14:01:47 -0700
committerElliott Hughes <enh@google.com>2014-10-10 10:57:48 -0700
commit2f25cf373ca7c875956a7c06483b30d381296817 (patch)
tree0299f2f5c5aaac06b9b942cc9139d638df6fcbdf /libc
parent7f4618cbc8bda2bd98f1361c55db63b16f2b9b50 (diff)
downloadbionic-2f25cf373ca7c875956a7c06483b30d381296817.tar.gz
Fix pthread_attr_getstack under valgrind.
valgrind seems to mess with the stack enough that the kernel will report "[stack:pid]" rather than "[stack]" in /proc/self/maps, so switch to the task-specific file instead to force "[stack]". (There are two conditions in the kernel code that decides which form to output.) Bug: 17897476 (cherry picked from commit 9afb2f2106a5d659854c175c574c1c31e0e205a2) Change-Id: I92c331ef6fb5868af49e75bc595710d290a95f5b
Diffstat (limited to 'libc')
-rw-r--r--libc/bionic/pthread_attr.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/libc/bionic/pthread_attr.cpp b/libc/bionic/pthread_attr.cpp
index c93970a19..c65ccc132 100644
--- a/libc/bionic/pthread_attr.cpp
+++ b/libc/bionic/pthread_attr.cpp
@@ -31,6 +31,7 @@
#include <inttypes.h>
#include <stdio.h>
#include <sys/resource.h>
+#include <unistd.h>
#include "private/bionic_string_utils.h"
#include "private/ErrnoRestorer.h"
@@ -126,8 +127,12 @@ static int __pthread_attr_getstack_main_thread(void** stack_base, size_t* stack_
stack_limit.rlim_cur = 8 * 1024 * 1024;
}
- // It doesn't matter which thread we are; we're just looking for "[stack]".
- FILE* fp = fopen("/proc/self/maps", "re");
+ // It shouldn't matter which thread we are because we're just looking for "[stack]", but
+ // valgrind seems to mess with the stack enough that the kernel will report "[stack:pid]"
+ // instead if you look in /proc/self/maps, so we need to look in /proc/pid/task/pid/maps.
+ char path[64];
+ snprintf(path, sizeof(path), "/proc/self/task/%d/maps", getpid());
+ FILE* fp = fopen(path, "re");
if (fp == NULL) {
return errno;
}
@@ -143,7 +148,7 @@ static int __pthread_attr_getstack_main_thread(void** stack_base, size_t* stack_
}
}
}
- __libc_fatal("No [stack] line found in /proc/self/maps!");
+ __libc_fatal("No [stack] line found in \"%s\"!", path);
}
int pthread_attr_getstack(const pthread_attr_t* attr, void** stack_base, size_t* stack_size) {