LINUX.ORG.RU

сегфолтитс


0

0

столкнулся с проблемой, есть не больша прога, запускаю на CentOs все работает (нету сегфолта) 2.6.18.* запускаю на этом(дебиан): Linux servertc 2.6.24-24-generic #1 SMP Wed Apr 15 15:54:25 UTC 2009 i686 GNU/Linux

g++ -v Используются внутренние спецификации. Целевая архитектура: i486-linux-gnu Параметры конфигурации: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu

имею сегфол

#include <iostream>
#include <vector>

using namespace std;

const int COUNT_PROGR = 12;
const int buffer_size = 1024*1024;

void HEAT_TEST(int val)
{		
	double bd[1024 * 1024];
	
	if(!fork())
	{
		cout << "parent" << endl;
		sleep(1);
	}
	else
	{
		sleep(12);
	}
}

int main()
{

	int val = 0;
	for(int i = 0; i < COUNT_PROGR; ++i)
		HEAT_TEST(val);

	sleep(1024);		
	return 0;
}

hello_world
() автор топика
Ответ на: комментарий от hello_world

i@servertc:~/Рабочий стол/BSB-TEST$ g++-4.1 -ggdb seg_folt.cpp -o start
i@servertc:~/Рабочий стол/BSB-TEST$ ./start 
Segmentation fault
akid@servertc:~/Рабочий стол/BSB-TEST$ gdb ./start 
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
(gdb) run
Starting program: /home/akid/Рабочий стол/BSB-TEST/start 

Program received signal SIGSEGV, Segmentation fault.
HEAT_TEST (val=0) at seg_folt.cpp:14
14		if(!fork())
(gdb) bt
#0  HEAT_TEST (val=0) at seg_folt.cpp:14
#1  0x080487ba in main () at seg_folt.cpp:31

hello_world
() автор топика
Ответ на: комментарий от mv

[izx32@localhost ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 30715
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 30715
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
(это на CentOS,дебиана нет под рукой)

hello_world
() автор топика
Ответ на: комментарий от hello_world

Товарищи с Дебианом говорят:

-t: cpu time (seconds)         unlimited
-f: file size (blocks)         unlimited
-d: data seg size (kbytes)     unlimited
-s: stack size (kbytes)        8192
-c: core file size (blocks)    0
-m: resident set size (kbytes) unlimited
-u: processes                  26612
-n: file descriptors           1024
-l: locked-in-memory size (kb) 64
-v: address space (kb)         unlimited
-x: file locks                 unlimited
-i: pending signals            26612
-q: bytes in POSIX msg queues  819200
-e: max nice                   0
-r: max rt priority            0

В центоси стек 10мб, в Дебиане - 8. 1024 * 1024 * 8 (8 - это sizeof(double), получается как раз 8 мб. Малейших чих, кладущий хоть байт на стек (например, вызов функции) - и твоя программа получает segfault.

mv ★★★★★
()
Ответ на: комментарий от hello_world

У тебя bd на стеке выделяется. Размер bd == макс. размер стека для процесса, установленный в Дебиане.

mv ★★★★★
()
Ответ на: комментарий от hello_world

> Дебиан всегда не нравился

Это вы ему не нравитесь :)

Кстати, если очень хочется заводить большие объекты на стеке, можно явно делать setrlimit с нужным ограничением. Если обломилось - сразу сказать, что памяти нет, извиняйте. А то вот так получается: до середины прога добежала и сдохла...

const86 ★★★★★
()
Ответ на: комментарий от hello_world

>Дебиан всегда не нравился

Причём здесь дебиан, когда это разработчик такой, что:

а. размещает массивы гигантского размера в стэке

б. не осилил RLIMIT_STACK

?

Demon37 ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.