Sponsored Content
Top Forums Programming SIGSEGV when allocate a certain size Post 302579506 by migurus on Monday 5th of December 2011 10:52:24 PM
Old 12-05-2011
SIGSEGV when allocate a certain size

The problem: I need to work with large arrays and after one of my structures grew in size my program started getting segmentation fault.

My code where I allocate the arrays:

Code:
static  R1         *tarr;
static  R2         *rarr;
proc_init_mem()
{
  const int     t_sz = sizeof(R1) * MAX_R1;
  const int     r_sz = sizeof(R2) * MAX_R2;
        tarr = malloc(t_sz);
        rarr = malloc(r_sz);
        if(tarr == NULL || rarr == NULL)
                return(-1);
        printf("tarr sz: %i\n", trp_sz);
        printf("rarr sz: %i\n", run_sz);
        return(0);
}

When I run the program, I am getting the printouts:

Code:
tarr sz: 11280000
rarr sz: 20200000

and then program dies according to debugger somewhere in fgetc (libc) as it reads in config params. If I decrease MAX_R1 or MAX_R2 everything is fine.

I am not exactly clear which resource limitations I am breaking.
This is Ubuntu 8 with gcc 4.2.4, the program is mostly in C, with addition of C++ libraries.

The rlimit parameters are as follows:
Code:
 0 -               -1               -1 per proc. CPU limit
 1 -         16777216         16777216 largest file created
 2 -               -1               -1 max sz of data segment
 3 -         33546240         33546240 max size of stack seg
 4 -               -1               -1 largest core sz
 5 -               -1               -1 largest resident set sz (swapping related)
 6 -             8191             8191 number of processes
 7 -             1024             1024 number of open files
 8 -            32768            32768 locked-in mem addr space
 9 -               -1               -1 addr space linit
10 -               -1               -1 max file locks
11 -             8191             8191 max number of pending signals
12 -           819200           819200 max bytes per msg queue
13 -                0                0 nice priority
14 -                0                0 max realtime priority

(I just run getrlimit in loop 0 through 14 to produce this list and manually added annotations)

I tried to run ulimit -s 32760 and then execute my program, but it did not help. BTW, the size 32760 was the bigest I was able to ulimit. Also, I tried to run as root, hoping that root would not have the limitation, but the same SIGSEGV happened.

Does anyone know how to deal with this type of problem? Any insight will be appreciated.
 

10 More Discussions You Might Find Interesting

1. Programming

SIGSEGV problem

Hi. Can someone to help me in a segfault problem? I have a big C++ program that crash from time to time because it receive the SIGSEGV signal. So my question is: Can I find, without using gdb or other debugging tools, which line from source code cause that problem? Or if exist some gdb API... (1 Reply)
Discussion started by: vaidac_coder
1 Replies

2. Programming

SIGSEGV, Segmentation fault

Here is my initiating code: #define NUM 20 static struct tab { int count; int use; } tab; int curtab = 0; int tab_create(int tab_count) { curtab++; tab.use = 1; tab.count = tab_count; kprintf("here!"); return curtab; } (2 Replies)
Discussion started by: micmac700
2 Replies

3. Solaris

How to correctly allocate size while creating FileSystem

Hello - I am finding difficulty in creating and allocating correct size to File Systems on solarix x86 box. Please see below contents I followed on screen and in the end It shows that /app file system is created of size 135GB , I wanted it to be 30gb as mentioned during 'format' command in 'Enter... (7 Replies)
Discussion started by: panchpan
7 Replies

4. Programming

SigSegV during stack unwind (AIX)

Hi I am getting a strange segmentation fault during the unwind process. I am trying to throw an object of an Exception class. During the DoThrow (in libC.a) the stack starts growing until a Signal is received. The object thrown is of a class that inherits from a common class, and the signal... (0 Replies)
Discussion started by: barak
0 Replies

5. Programming

problem in SIGSEGV signal handling

i wrote handler for sigsegv such that i can allocate memory for a variable to which sigsegv generated for illlegal acces of memory. my code is #include <signal.h> #include<stdio.h> #include<stdlib.h> #include<string.h> char *j; void segv_handler(int dummy) { j=(char *)malloc(10); ... (4 Replies)
Discussion started by: pavan6754
4 Replies

6. UNIX and Linux Applications

SIGSEGV Signal handling

Hello, Can anybody tell me how can i handle segmentation fault signal, in C code? (2 Replies)
Discussion started by: mustus
2 Replies

7. AIX

Received signal #11, SIGSEGV [default] on AIX 6.1

Hello, One of our customer is getting segmentation fault when he runs his shell script which invokes our executable on AIX 6.1. On AIX 5.3, there were no issues. Here is the truss output. 811242: __loadx(0x0A040000, 0xF0D3A26C, 0x00000000, 0x00000009, 0x00000000) = 0xF026E884... (0 Replies)
Discussion started by: erra_krishna
0 Replies

8. Solaris

sigsegv Fault

I receive a sigsegv failure. I was under the impression that a core file is created everytime a sigsegv occurrs and the process is terminated. I have had two recent occurrances of a core file not being created. Does anyone know why a core file would not be created. (2 Replies)
Discussion started by: amp4cats
2 Replies

9. Shell Programming and Scripting

Error PHP Fatal error: Allowed memory size of 67108864 bytes exhausted(tried to allocate 401 bytes)

While running script I am getting an error like Few lines in data are not being processed. After googling it I came to know that adding such line would give some memory to it ini_set("memory_limit","64M"); my input file size is 1 GB. Is that memory limit is based on RAM we have on... (1 Reply)
Discussion started by: elamurugu
1 Replies

10. UNIX for Advanced & Expert Users

How to create SIGSEGV at particular memory?

Hi I want to create a SIGSEGV when program tries to access one particular area in memory. Is this possible. If so whats the command. (4 Replies)
Discussion started by: jionnet
4 Replies
GETRLIMIT(2)							System Calls Manual						      GETRLIMIT(2)

NAME
getrlimit, setrlimit - control maximum system resource consumption SYNOPSIS
#include <sys/time.h> #include <sys/resource.h> getrlimit(resource, rlp) int resource; struct rlimit *rlp; setrlimit(resource, rlp) int resource; struct rlimit *rlp; DESCRIPTION
Limits on the consumption of system resources by the current process and each process it creates may be obtained with the getrlimit call, and set with the setrlimit call. The resource parameter is one of the following: RLIMIT_CPU the maximum amount of cpu time (in seconds) to be used by each process. RLIMIT_FSIZE the largest size, in bytes, of any single file that may be created. RLIMIT_DATA the maximum size, in bytes, of the data segment for a process; this defines how far a program may extend its break with the sbrk(2) system call. RLIMIT_STACK the maximum size, in bytes, of the stack segment for a process; this defines how far a program's stack segment may be extended. Stack extension is performed automatically by the system. RLIMIT_CORE the largest size, in bytes, of a core file that may be created. RLIMIT_RSS the maximum size, in bytes, to which a process's resident set size may grow. This imposes a limit on the amount of physi- cal memory to be given to a process; if memory is tight, the system will prefer to take memory from processes that are exceeding their declared resident set size. A resource limit is specified as a soft limit and a hard limit. When a soft limit is exceeded a process may receive a signal (for example, if the cpu time is exceeded), but it will be allowed to continue execution until it reaches the hard limit (or modifies its resource limit). The rlimit structure is used to specify the hard and soft limits on a resource, struct rlimit { int rlim_cur; /* current (soft) limit */ int rlim_max; /* hard limit */ }; Only the super-user may raise the maximum limits. Other users may only alter rlim_cur within the range from 0 to rlim_max or (irre- versibly) lower rlim_max. An "infinite" value for a limit is defined as RLIM_INFINITY (0x7fffffff). Because this information is stored in the per-process information, this system call must be executed directly by the shell if it is to affect all future processes created by the shell; limit is thus a built-in command to csh(1). The system refuses to extend the data or stack space when the limits would be exceeded in the normal way: a break call fails if the data space limit is reached. When the stack limit is reached, the process receives a segmentation fault (SIGSEGV); if this signal is not caught by a handler using the signal stack, this signal will kill the process. A file I/O operation that would create a file that is too large will cause a signal SIGXFSZ to be generated; this normally terminates the process, but may be caught. When the soft cpu time limit is exceeded, a signal SIGXCPU is sent to the offending process. RETURN VALUE
A 0 return value indicates that the call succeeded, changing or returning the resource limit. A return value of -1 indicates that an error occurred, and an error code is stored in the global location errno. ERRORS
The possible errors are: [EFAULT] The address specified for rlp is invalid. [EPERM] The limit specified to setrlimit would have raised the maximum limit value, and the caller is not the super-user. SEE ALSO
csh(1), quota(2), sigvec(2), sigstack(2) BUGS
There should be limit and unlimit commands in sh(1) as well as in csh. 4th Berkeley Distribution May 13, 1986 GETRLIMIT(2)
All times are GMT -4. The time now is 06:30 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy