对搞笑小程序的一点小小补充
<<一个耗尽内存的搞笑小程序>> 在轻松之中说了操作系统对每个进程和线程栈大小的限制.
实际可以在程序耗尽内存(实际是自己的栈用光了)时显示一下当前栈大概的限制.
平台:windows2000+VC
- #define WORD_SIZE sizeof(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_SIZE sizeof(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 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
当说到OS相关的时候,要用C语言,并且不要用C语言的扩展功能,否则说明不了问题。
这里用了printf()来跟踪栈的大小变化, 通用一些了,不过运行速度变慢了些.
redhat linux+gcc 的结果: 8382016
windows2000+vc 的结果: 1034544
不同的编译器使同样的c代码栈限制不一样
当然还有其它的办法动态检查出栈的限制值,希望大家给出更好的建议.
复制代码
简单明了,学习了,顶
导致栈大下的限制默认不一样,但应该可以可以在编译器选项里指定吧?