24小时热门版块排行榜    

查看: 1692  |  回复: 12

relonfbq

金虫 (正式写手)


[交流] 【求助】fortran程序问题

我用的VS2008下的fortran,我的调试程序时,每次进入某函数时,其总会跳到一个名为chkstk.asm文件中,几步之后又调回来,我不知道这那里有问题,这个文件内容是: page    ,132
        title   chkstk - C stack checking routine
;***
;chkstk.asm - C stack checking routine
;
;       Copyright (c) Microsoft Corporation. All rights reserved.
;
;Purpose:
;       Provides support for automatic stack checking in C procedures
;       when stack checking is enabled.
;
;*******************************************************************************

.xlist
        include cruntime.inc
.list

; size of a page of memory

_PAGESIZE_      equ     1000h


        CODESEG

page
;***
;_chkstk - check stack upon procedure entry
;
;Purpose:
;       Provide stack checking on procedure entry. Method is to simply probe
;       each page of memory required for the stack in descending order. This
;       causes the necessary pages of memory to be allocated via the guard
;       page scheme, if possible. In the event of failure, the OS raises the
;       _XCPT_UNABLE_TO_GROW_STACK exception.
;
;       NOTE:  Currently, the (EAX < _PAGESIZE_) code path falls through
;       to the "lastpage" label of the (EAX >= _PAGESIZE_) code path.  This
;       is small; a minor speed optimization would be to special case
;       this up top.  This would avoid the painful save/restore of
;       ecx and would shorten the code path by 4-6 instructions.
;
;Entry:
;       EAX = size of local frame
;
;Exit:
;       ESP = new stackframe, if successful
;
;Uses:
;       EAX
;
;Exceptions:
;       _XCPT_GUARD_PAGE_VIOLATION - May be raised on a page probe. NEVER TRAP
;                                    THIS!!!! It is used by the OS to grow the
;                                    stack on demand.
;       _XCPT_UNABLE_TO_GROW_STACK - The stack cannot be grown. More precisely,
;                                    the attempt by the OS memory manager to
;                                    allocate another guard page in response
;                                    to a _XCPT_GUARD_PAGE_VIOLATION has
;                                    failed.
;
;*******************************************************************************

public  _alloca_probe

_chkstk proc

_alloca_probe    =  _chkstk

        push    ecx

; Calculate new TOS.

        lea     ecx, [esp] + 8 - 4      ; TOS before entering function + size for ret value
        sub     ecx, eax                ; new TOS

; Handle allocation size that results in wraparound.
; Wraparound will result in StackOverflow exception.

        sbb     eax, eax                ; 0 if CF==0, ~0 if CF==1
        not     eax                     ; ~0 if TOS did not wrapped around, 0 otherwise
        and     ecx, eax                ; set to 0 if wraparound

        mov     eax, esp                ; current TOS
        and     eax, not ( _PAGESIZE_ - 1) ; Round down to current page boundary

cs10:
        cmp     ecx, eax                ; Is new TOS
        jb      short cs20              ; in probed page?
        mov     eax, ecx                ; yes.
        pop     ecx
        xchg    esp, eax                ; update esp
        mov     eax, dword ptr [eax]    ; get return address
        mov     dword ptr [esp], eax    ; and put it at new TOS
        ret

; Find next lower page and probe
cs20:
        sub     eax, _PAGESIZE_         ; decrease by PAGESIZE
        test    dword ptr [eax],eax     ; probe page.
        jmp     short cs10

_chkstk endp

        end
大家帮我看看那里出来问题???????????
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

» 抢金币啦!回帖就可以得到:

查看全部散金贴

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dingxb

金虫 (正式写手)



微尘、梦想(金币+1): 谢谢回复…… 2011-04-14 21:13:49
貌似是检查堆栈大小的C汇编程序。

建议,设置堆栈大小为较大的值,同时,这个问题如果是运行时错误,建议你缩小程序的规模。

比如,你原来用到100000维数组,你可以先做小规模测试,用100维。

Good luck.
2楼2011-04-14 07:49:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

relonfbq

金虫 (正式写手)


引用回帖:
Originally posted by dingxb at 2011-04-14 07:49:54:
貌似是检查堆栈大小的C汇编程序。

建议,设置堆栈大小为较大的值,同时,这个问题如果是运行时错误,建议你缩小程序的规模。

比如,你原来用到100000维数组,你可以先做小规模测试,用100维。

Good luck.

怎么设置堆栈????
我进入的函数调用一个数组,数组维数为1,数组元素的个数只有128个,也不算多啊????
4楼2011-04-14 09:28:23
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dingxb

金虫 (正式写手)


呃,sorry,win下没怎么写过程序,具体的东西不是很清楚。

这一调用是否影响计算结果??
5楼2011-04-14 09:30:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

relonfbq

金虫 (正式写手)


引用回帖:
Originally posted by dingxb at 2011-04-14 09:30:39:
呃,sorry,win下没怎么写过程序,具体的东西不是很清楚。

这一调用是否影响计算结果??

由于程序很大,程序倒是可以一直运行下去,但最后运行过程中输出的数据不是很满意,可能程序中存在错误(更可能是逻辑错误),所以我不知道这里这个问题对最后结果有没有影响?

这一调用的子程序中没有用到堆栈,当然整个程序中也没有用到这一技巧,当我调用子程序时(包括这一调用),传递了数组?
6楼2011-04-14 10:02:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dingxb

金虫 (正式写手)


如果可能的话,建议你换一套平台(例如在Linux下)进行测试。

win下的莫名错误实在是太多了。
7楼2011-04-14 10:07:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

relonfbq

金虫 (正式写手)


引用回帖:
Originally posted by dingxb at 2011-04-14 10:07:28:
如果可能的话,建议你换一套平台(例如在Linux下)进行测试。

win下的莫名错误实在是太多了。

可是在linux下我不会测试啊,
刚刚方向进入其他调用过数组的子程序或者函数时,并没有出现上述现象,这可能问题出在哪儿呢?
8楼2011-04-14 10:13:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dingxb

金虫 (正式写手)


我没有遇到过类似问题。

似乎有许多的C/C++程序员遇到过类似问题,大多都是堆栈溢出(或者堆栈使用)造成的。

有人建议,可能与动态数组有关。可以将动态数组先换为静态数组,再行调整。

希望一下帖子对你有用,

http://hi.baidu.com/ganke/blog/item/1ca48e3de7b7a400baa167aa.html
9楼2011-04-14 10:39:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

relonfbq

金虫 (正式写手)


引用回帖:
Originally posted by dingxb at 2011-04-14 10:39:56:
我没有遇到过类似问题。

似乎有许多的C/C++程序员遇到过类似问题,大多都是堆栈溢出(或者堆栈使用)造成的。

有人建议,可能与动态数组有关。可以将动态数组先换为静态数组,再行调整。

希望一下帖子对 ...

谢谢!
我刚刚调试发现,传递的数组,在进入该子程序之前是正常的,但一进入该子程序,数组就元素的个数就变小了,怎么会突然变少呢?这其中原因在哪儿呢?
10楼2011-04-14 10:50:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dingxb

金虫 (正式写手)


http://software.intel.com/en-us/ ... =(Intel+Demo+Video)

还有这个也可以参考

按照这些描述,很可能这个原本是一个透明过程而已,不需要关注他自身。

你可以通过比较在此前后的数组内容来确定是否真的有问题。

------我是分割线-----

利用中午吃饭时间查了一下,这个玩意chkstk  的目的是在局部变量大小超过4K时防止发生访问违例。

换句话说,这里还是有大数组传递了。

[ Last edited by dingxb on 2011-4-14 at 12:08 ]
11楼2011-04-14 10:53:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

relonfbq

金虫 (正式写手)


引用回帖:
Originally posted by dingxb at 2011-04-14 10:53:51:
http://software.intel.com/en-us/ ... =(Intel+Demo+Video)

还有这个也可以参考

按照这些描述,很可能这个原本是一个透明过程而已,不需要 ...

那这个最后对结果会不会有影响呢?
12楼2011-04-14 13:00:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dingxb

金虫 (正式写手)


relonfbq(金币+20): 感谢! 2011-04-14 13:20:57
按照我查到的描述,这个应该不会有影响。

只是在debug模式的时候会出现,在运行阶段应该不会出现。
13楼2011-04-14 13:08:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
简单回复
tzb12033楼
2011-04-14 08:10   回复  
微尘、梦想: 专业版块不鼓励灌水行为,希望能多多参与进来讨论…… 2011-04-14 21:14:29
相关版块跳转 我要订阅楼主 relonfbq 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考博] 34岁读博士晚吗 +31 emitdne 2024-06-13 31/1550 2024-06-17 23:11 by 龙游天下2014202
[考博] 2025考博 +7 自强不息a?a 2024-06-15 12/600 2024-06-17 22:51 by 自强不息a?a
[找工作] 杭电、天津科技、青农和宁波工程学院如何选? +12 味道很好啊 2024-06-13 23/1150 2024-06-17 22:16 by 半简体
[硕博家园] 关于硕博连读的一些疑问? +4 Lwenter 2024-06-14 5/250 2024-06-17 20:42 by Lwenter
[论文投稿] 审稿问题:为什么荧光激发波长和紫外吸收波长差的大? 10+5 sdawege 2024-06-14 10/500 2024-06-17 18:54 by HH-探针
[基金申请] 我标书代码变了 +44 学员NHuqdk 2024-06-16 58/2900 2024-06-17 17:39 by wenfengw83
[基金申请] 面青地会评时间 +8 tanjydd 2024-06-15 8/400 2024-06-17 17:08 by 小龙虾2008
[有机交流] 车间生产,真空度很高,温度很高,但减压蒸馏速度很慢。 10+12 召唤鬼泣lL 2024-06-13 38/1900 2024-06-17 16:46 by 科研虫子小助手
[硕博家园] 硕博巨婴,也许才刚刚开始 +32 SNaiL1995 2024-06-12 84/4200 2024-06-17 16:04 by 20171214
[有机交流] 苯酚和炔醇反应,mitsunobu反应 5+3 TONGMEIMEI 2024-06-12 9/450 2024-06-17 15:00 by dschong
[论文投稿] 审稿人含糊拒稿,还需要回复吗?如何回复? 20+3 BruceChum 2024-06-15 19/950 2024-06-17 12:03 by 投必得科研顾问
[催化] 镍负载氧化铝的保存问题 8+3 lwn0130 2024-06-15 4/200 2024-06-17 10:48 by adaihao
[找工作] 江西双非一本和四川双一流高校如何选择? 5+8 寒山敲钟 2024-06-12 25/1250 2024-06-16 22:05 by zhaojiang427
[基金申请] 博士后创新人才支持计划公示 +9 aishida144 2024-06-14 15/750 2024-06-16 09:52 by msjy
[基金申请] BO4的YQ答辩通知发布了吗? +6 博学笃行 2024-06-11 6/300 2024-06-15 16:04 by 悲催科研狗
[食品] 食品博士导师 +6 小李醒yy 2024-06-11 9/450 2024-06-14 23:37 by 小李醒yy
[基金申请] 面上基金有一个(两个)C是不是就没戏了.... 5+3 zzzm116 2024-06-13 17/850 2024-06-14 22:26 by lzt8076
[考研] 物理化学一对一辅导 +3 林大diao 2024-06-12 5/250 2024-06-14 20:57 by 林大diao
[基金申请] 75批博后基金 +10 kyukitu 2024-06-13 13/650 2024-06-14 10:31 by kyukitu
[硕博家园] 机械研究生如何拿到年薪40+w +13 阿巴阿巴哦哦 2024-06-11 15/750 2024-06-13 15:40 by 113745685
信息提示
请填处理意见