From: Peter Stephenson <p.w.stephenson@ntlworld.com>
To: Zsh Hackers' List <zsh-workers@zsh.org>
Subject: Re: Segmentation Fault on Stack Overflow
Date: Sun, 5 Jan 2014 21:33:41 +0000 [thread overview]
Message-ID: <20140105213341.71d16903@pws-pc.ntlworld.com> (raw)
In-Reply-To: <20140105175831.4640d8a5@pws-pc.ntlworld.com>
On Sun, 5 Jan 2014 17:58:31 +0000
Peter Stephenson <p.w.stephenson@ntlworld.com> wrote:
> It might be possible to do a little better by querying some of the
> memory-related limits (I would guess available stack space is the key
> one, but some investigation will be necessary) to see if one of the
> limits is getting short and aborting function calls in a handlable
> fashion at that level. Unhelpfully, limits (from getrlimit()) and
> current usage (from getrusage()) don't seem to map cleanly onto one
> another, and this is all rather system-specific, so this doesn't look
> like a trivial project.
What's more, on Linux the resources useful here aren't actually reported by
getrusage() at the moment. The best I've found with a bit of poking
around locally (I might do better online, but I might as well ask here
first) is /proc/$$/status. This is obviously completely system specific
and quite possible specific to certain kernel versions. The code below
does seem to do roughly what I want (at the moment it reports the limits
and usage rather than checking the values) but I can't help thinking I'm
missing something. It's going to be hard to get something of general
use out of this sort of thing.
{
struct rlimit rlimit;
int found = 0;
long usage, limit;
char buffer[256];
FILE *sfile;
sprintf(buffer, "/proc/%d/status", getpid());
sfile = fopen(buffer, "r");
if (sfile) {
while (fgets(buffer, 256, sfile)) {
if (!strncmp(buffer, "VmStk:", 6) &&
getrlimit(RLIMIT_STACK, &rlimit) == 0) {
const char *ptr = buffer + 6;
while (!isdigit(*ptr))
ptr++;
usage = atol(ptr);
limit = rlimit.rlim_cur == (rlim_t)-1 ?
rlimit.rlim_max : rlimit.rlim_cur;
fprintf(stderr, "stack: limit = %ld, usage = %ld\n",
limit, usage * 1024);
found++;
} else if (!strncmp(buffer, "VmData:", 7) &&
getrlimit(RLIMIT_DATA, &rlimit) == 0) {
const char *ptr = buffer + 7;
while (!isdigit(*ptr))
ptr++;
usage = atol(ptr);
limit = rlimit.rlim_cur == (rlim_t)-1 ?
rlimit.rlim_max : rlimit.rlim_cur;
fprintf(stderr, "stack: limit = %ld, usage = %ld\n",
limit, usage * 1024);
found++;
}
if (found == 2)
break;
}
fflush(stderr);
fclose(sfile);
}
}
pws
next parent reply other threads:[~2014-01-05 21:33 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <3540501074823477909@gmail297201516>
[not found] ` <87d2k8y6wn.fsf@ft.bewatermyfriend.org>
[not found] ` <AF114D5A-7797-4E3F-A34A-A03A0B7E9167@macports.org>
[not found] ` <878uuwy0vk.fsf@ft.bewatermyfriend.org>
[not found] ` <20140105175831.4640d8a5@pws-pc.ntlworld.com>
2014-01-05 21:33 ` Peter Stephenson [this message]
2014-01-05 22:12 ` Bart Schaefer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140105213341.71d16903@pws-pc.ntlworld.com \
--to=p.w.stephenson@ntlworld.com \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).