system888net 发表于 2008-05-17 23:19

对搞笑小程序的一点小小补充

<<一个耗尽内存的搞笑小程序>>在轻松之中说了操作系统对每个进程和线程栈大小的限制.
:)
实际可以在程序耗尽内存(实际是自己的栈用光了)时显示一下当前栈大概的限制.

平台: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 编辑 ]

cjaizss 发表于 2008-05-17 23:50

当说到OS相关的时候,要用C语言,并且不要用C语言的扩展功能,否则说明不了问题。

system888net 发表于 2008-05-18 10:45

这里用了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));
    }
}

chuhongze 发表于 2008-05-18 17:02

简单明了,学习了,顶

hzcgz 发表于 2008-05-19 13:59

导致栈大下的限制默认不一样,但应该可以可以在编译器选项里指定吧?
页: [1]
查看完整版本: 对搞笑小程序的一点小小补充