ptrace's interface allows you to read only one word at a time, and I'm trying to scan a larger portions of the stack
Well, just use a loop, then. I honestly don't see how that constitutes a problem with ptrace, I use it all the time to remotely access processes.
I use something like this:
static int memcpy_from_target(pid_t pid, char *dest, long src, size_t n) { static int const align = sizeof(long) - 1; while (n) { size_t todo = MIN(n, sizeof(long) - (src & align)); long data = ptrace(PTRACE_PEEKTEXT, pid, src - (src & align), 0); if (errno) { perror("ptrace_peektext (memcpy_from_target)"); return -1; } memcpy(dest, (char *)&data + (src & align), todo); dest += todo; src += todo; n -= todo; } return 0; } static int memcpy_from_target(pid_t pid, char *dest, long src, size_t n) { static int const align = sizeof(long) - 1; while (n) { size_t todo = MIN(n, sizeof(long) - (src & align)); long data = ptrace(PTRACE_PEEKTEXT, pid, src - (src & align), 0); if (errno) { perror("ptrace_peektext (memcpy_from_target)"); return -1; } memcpy(dest, (char *)&data + (src & align), todo); dest += todo; src += todo; n -= todo; } return 0; }