对搞笑小程序的一点小小补充
<<一个耗尽内存的搞笑小程序>>在轻松之中说了操作系统对每个进程和线程栈大小的限制.:)
实际可以在程序耗尽内存(实际是自己的栈用光了)时显示一下当前栈大概的限制.
平台:windows2000+VC
#define WORD_SIZEsizeof(unsigned int)
void test_my_stack()
{
unsigned int stack_count;
try {
for(stack_count=0; stack_count<0xffffffff; stack_count++)
{
__asm push eax //windows+ VC
}
}
catch(...) {
printf("stack size is: %u\n", stack_count*sizeof(WORD_SIZE));
}
}
注意: 有与windows 下 vc捕获异常是用操作系统的SEH配合处理的,因此可以获取崩溃时栈的情况.
:(
在linux + gcc 下由于是有编译器实现异常捕获,因此如下同样的代码在linux+gcc 下除了提示段错误外根本不会执行catch 后的代码,
若要达到目的可能只能靠信号处理来配合了.
#define WORD_SIZEsizeof(unsigned int)
void test_my_stack()
{
unsigned int stack_count;
try {
for(stack_count=0; stack_count<0xffffffff; stack_count++)
{
__asm("push %eax");
}
}
catch(...) {
printf("stack size is: %u\n", stack_count*sizeof(WORD_SIZE));
}
}
[ 本帖最后由 system888net 于 2008-5-17 23:28 编辑 ] 当说到OS相关的时候,要用C语言,并且不要用C语言的扩展功能,否则说明不了问题。 这里用了printf()来跟踪栈的大小变化, 通用一些了,不过运行速度变慢了些.
redhat linux+gcc 的结果: 8382016
windows2000+vc 的结果: 1034544
不同的编译器使同样的c代码栈限制不一样
当然还有其它的办法动态检查出栈的限制值,希望大家给出更好的建议.
#define WORD_SIZEsizeof(unsigned int)
void test_my_stack()
{
unsigned int stack_count;
try {
for(stack_count=0; stack_count<0xffffffff; stack_count++)
{
__asm("push %eax");
// windows VC 改为 __asm push eax"
printf("%u,",stack_count*sizeof(WORD_SIZE));
}
}
catch(...) {
printf("stack size is: %u\n", stack_count*sizeof(WORD_SIZE));
}
}
简单明了,学习了,顶 导致栈大下的限制默认不一样,但应该可以可以在编译器选项里指定吧?
页:
[1]