免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2607 | 回复: 4
打印 上一主题 下一主题

对搞笑小程序的一点小小补充 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-17 23:19 |只看该作者 |倒序浏览
<<一个耗尽内存的搞笑小程序>>  在轻松之中说了操作系统对每个进程和线程栈大小的限制.

实际可以在程序耗尽内存(实际是自己的栈用光了)时显示一下当前栈大概的限制.

平台:windows2000+VC

  1. #define WORD_SIZE  sizeof(unsigned int)

  2. void test_my_stack()
  3. {
  4.     unsigned int stack_count;

  5.     try {
  6.         for(stack_count=0; stack_count<0xffffffff; stack_count++)
  7.         {
  8.             __asm push eax   //windows+ VC
  9.         }
  10.     }
  11.     catch(...) {
  12.         printf("stack size is: %u\n", stack_count*sizeof(WORD_SIZE));
  13.     }
  14. }
复制代码

注意: 有与windows 下 vc捕获异常是用操作系统的SEH配合处理的,因此可以获取崩溃时栈的情况.



在linux + gcc 下由于是有编译器实现异常捕获,因此如下同样的代码在linux+gcc 下除了提示段错误外根本不会执行catch 后的代码,
若要达到目的可能只能靠信号处理来配合了.

  1. #define WORD_SIZE  sizeof(unsigned int)

  2. void test_my_stack()
  3. {
  4.     unsigned int stack_count;

  5.     try {
  6.         for(stack_count=0; stack_count<0xffffffff; stack_count++)
  7.         {
  8.            __asm("push %eax");
  9.         }
  10.     }
  11.     catch(...) {
  12.         printf("stack size is: %u\n", stack_count*sizeof(WORD_SIZE));
  13.     }
  14. }
复制代码

[ 本帖最后由 system888net 于 2008-5-17 23:28 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2008-05-17 23:50 |只看该作者
当说到OS相关的时候,要用C语言,并且不要用C语言的扩展功能,否则说明不了问题。

论坛徽章:
0
3 [报告]
发表于 2008-05-18 10:45 |只看该作者
这里用了printf()来跟踪栈的大小变化, 通用一些了,不过运行速度变慢了些.
redhat linux+gcc 的结果: 8382016
windows2000+vc 的结果: 1034544
不同的编译器使同样的c代码栈限制不一样
当然还有其它的办法动态检查出栈的限制值,希望大家给出更好的建议.



  1. #define WORD_SIZE  sizeof(unsigned int)

  2. void test_my_stack()
  3. {
  4.     unsigned int stack_count;

  5.     try {
  6.         for(stack_count=0; stack_count<0xffffffff; stack_count++)
  7.         {
  8.            __asm("push %eax");
  9.           // windows VC 改为 __asm push eax"
  10.           printf("%u,",stack_count*sizeof(WORD_SIZE));
  11.         }
  12.     }
  13.     catch(...) {
  14.         printf("stack size is: %u\n", stack_count*sizeof(WORD_SIZE));
  15.     }
  16. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2008-05-18 17:02 |只看该作者
简单明了,学习了,顶

论坛徽章:
0
5 [报告]
发表于 2008-05-19 13:59 |只看该作者
导致栈大下的限制默认不一样,但应该可以可以在编译器选项里指定吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP