y****e 发帖数: 23939 | 1 I have a program which calls memset and memmove. My system is Fedora 14 x86_
64 and g++ 4.5.1. I realize now when the float data set over 8GB limit,
these two functions create segfault. The
backtrace of call stack shows it crash at:
# in __memmove_ssse3 () from /lib64/libc.so.6
The program runs OK when data set size is under 8GB.
Anybody knows why? I googled online but can't find any place talking about
the size limit of memset and memmove. |
t****t 发帖数: 6806 | 2 grab the glibc source and read the function then...
x86_
【在 y****e 的大作中提到】 : I have a program which calls memset and memmove. My system is Fedora 14 x86_ : 64 and g++ 4.5.1. I realize now when the float data set over 8GB limit, : these two functions create segfault. The : backtrace of call stack shows it crash at: : # in __memmove_ssse3 () from /lib64/libc.so.6 : The program runs OK when data set size is under 8GB. : Anybody knows why? I googled online but can't find any place talking about : the size limit of memset and memmove.
|
y****e 发帖数: 23939 | 3 多谢回复。看来的确得深挖glibc的源代码了,可能需要file一个bug report给Fedora
了。
因为我发现同样的程序在Fedora10(gcc 4.3.2)上没有问题,到了Fedora14(gcc 4.5.
1)上就有这个8GB的限制。
再多问一句啊,这个glibc的源代码在那个目录下啊?(也许应该到Linux版上问一下)
【在 t****t 的大作中提到】 : grab the glibc source and read the function then... : : x86_
|
t****t 发帖数: 6806 | 4 yumdownloader --source glibc
rpm -i ....
是装在/root下面的
Fedora
5.
【在 y****e 的大作中提到】 : 多谢回复。看来的确得深挖glibc的源代码了,可能需要file一个bug report给Fedora : 了。 : 因为我发现同样的程序在Fedora10(gcc 4.3.2)上没有问题,到了Fedora14(gcc 4.5. : 1)上就有这个8GB的限制。 : 再多问一句啊,这个glibc的源代码在那个目录下啊?(也许应该到Linux版上问一下)
|
y****e 发帖数: 23939 | 5 问题解决了,是跟memmove没有关系,问题出在上游。跟int的limit有关,int最大到2G
,8GB的float的index已经超过了2G,我把int改成size_t就解决了。以前程序一直是在
32位下编写的,没有处理过这么大的内存块,所以问题一直没有暴露。
如果是memset和memmove有问题的话,应该影响面很大的,网上应该能搜出很多来的。 |
t****t 发帖数: 6806 | 6 ft, 用int当然是不行的. 该用什么类型就是什么类型, 马虎不得. 马马虎虎的写, 现
在是爽了, 回头升级起来头痛死.
2G
【在 y****e 的大作中提到】 : 问题解决了,是跟memmove没有关系,问题出在上游。跟int的limit有关,int最大到2G : ,8GB的float的index已经超过了2G,我把int改成size_t就解决了。以前程序一直是在 : 32位下编写的,没有处理过这么大的内存块,所以问题一直没有暴露。 : 如果是memset和memmove有问题的话,应该影响面很大的,网上应该能搜出很多来的。
|
y****e 发帖数: 23939 | 7 的确是这样,很多合作者是学数学和物理的,不是写程序科班出身,现实很让人无奈啊
,呵呵
【在 t****t 的大作中提到】 : ft, 用int当然是不行的. 该用什么类型就是什么类型, 马虎不得. 马马虎虎的写, 现 : 在是爽了, 回头升级起来头痛死. : : 2G
|
t****t 发帖数: 6806 | |
P********e 发帖数: 2610 | 9 还不是怕你把我忘记了
【在 t****t 的大作中提到】 : 你歇歇吧, 不说话没人当你哑巴的
|
P********e 发帖数: 2610 | 10 我原意是,在程序里面不可能一贯使用size_t。 所以我觉得,最好少使用,除非调用
系统程序。
理由很简单,程序如果32-》64的时候,或者回来的时候。问题少一点。primitive的长
度反而都是一样长的。
【在 P********e 的大作中提到】 : 还不是怕你把我忘记了
|
|
|
t****t 发帖数: 6806 | 11 当然是指计算size的时候用, 没人说让你把size_t当int用; 而且primitive的长度也不
是一样长的; 并且正是因为32<->64的时候要问题少, 才要在该用size_t的时候用size_
t.
所以我还是那句话, 你不说话没人当你哑巴. 你看你一个贴就三个毛病. 知道的人知道
你一贯这样, 不知道的还以为你来捣乱的呢.
【在 P********e 的大作中提到】 : 我原意是,在程序里面不可能一贯使用size_t。 所以我觉得,最好少使用,除非调用 : 系统程序。 : 理由很简单,程序如果32-》64的时候,或者回来的时候。问题少一点。primitive的长 : 度反而都是一样长的。
|
P********e 发帖数: 2610 | 12 你这个不 make sense
算size
sizeof(size_t)在32,64下是变量,所以有问题啊。
sizeof(int/double/long)都一样,所以没问题啊。
size_
调用
的长
【在 t****t 的大作中提到】 : 当然是指计算size的时候用, 没人说让你把size_t当int用; 而且primitive的长度也不 : 是一样长的; 并且正是因为32<->64的时候要问题少, 才要在该用size_t的时候用size_ : t. : 所以我还是那句话, 你不说话没人当你哑巴. 你看你一个贴就三个毛病. 知道的人知道 : 你一贯这样, 不知道的还以为你来捣乱的呢.
|
t****t 发帖数: 6806 | 13 hahaha...
【在 P********e 的大作中提到】 : 你这个不 make sense : 算size : sizeof(size_t)在32,64下是变量,所以有问题啊。 : sizeof(int/double/long)都一样,所以没问题啊。 : : size_ : 调用 : 的长
|
X****r 发帖数: 3557 | 14 what are you talking about.
sizeof(int/double/long) can be different.
【在 P********e 的大作中提到】 : 你这个不 make sense : 算size : sizeof(size_t)在32,64下是变量,所以有问题啊。 : sizeof(int/double/long)都一样,所以没问题啊。 : : size_ : 调用 : 的长
|
P********e 发帖数: 2610 | 15 ....你也不看帖就回
同OS下,32位和64位转换的时候,是一样的。
当然不同os,可能会不一样。
【在 X****r 的大作中提到】 : what are you talking about. : sizeof(int/double/long) can be different.
|
t****t 发帖数: 6806 | 16 hahahahahahahaha
【在 P********e 的大作中提到】 : ....你也不看帖就回 : 同OS下,32位和64位转换的时候,是一样的。 : 当然不同os,可能会不一样。
|
X****r 发帖数: 3557 | 17 Try this yourself:
sizeof_long.c:
#include
int main() {
printf("sizeof(long) = %d\n", (int)sizeof(long));
}
gcc -m32 sizeof_long.c
./a.out
gcc -m64 sizeof_long.c
./a.out
【在 P********e 的大作中提到】 : ....你也不看帖就回 : 同OS下,32位和64位转换的时候,是一样的。 : 当然不同os,可能会不一样。
|
S*********g 发帖数: 5298 | 18 还笑的这么开心。
看看这个帖子
http://mitbbs.com/article1/Military/35211905_3_0.html
【在 t****t 的大作中提到】 : hahahahahahahaha
|
t****t 发帖数: 6806 | 19 谁知道是哪个loser, 理他做甚
【在 S*********g 的大作中提到】 : 还笑的这么开心。 : 看看这个帖子 : http://mitbbs.com/article1/Military/35211905_3_0.html
|
P********e 发帖数: 2610 | 20 en, windows下是一样的。。。
【在 X****r 的大作中提到】 : Try this yourself: : sizeof_long.c: : #include : int main() { : printf("sizeof(long) = %d\n", (int)sizeof(long)); : } : gcc -m32 sizeof_long.c : ./a.out : gcc -m64 sizeof_long.c : ./a.out
|