VC6调用堆栈溢出如何调试?高手请进!

skyclear81 2007-09-22 11:14:09
VC6调用堆栈溢出如何调试?
当程序异常时调试进入查看堆栈仅看到A调用B,B又调用A,如此无穷递归...,最终调用ntdll.dll里的函数,且A,B函数地址都是非法的,不在当前进程加载模块内。
望高手相助!
...全文
1605 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
zlxiao001 2012-01-06
  • 打赏
  • 举报
回复
mark
skyclear81 2007-10-27
  • 打赏
  • 举报
回复
不小心点了无满意结贴,不知道怎么纠正?? 管理员请进!~~
skyclear81 2007-10-27
  • 打赏
  • 举报
回复
楼上各位大师都提出了自己独到的见解,一并感谢,最近比较忙,忘记结贴了,请各位谅解,并在以后一如既往地支持我哦.... 散分!~
yuxinxxgc 2007-10-02
  • 打赏
  • 举报
回复
编译了么,用OD反汇编看看
linuxpgy 2007-09-26
  • 打赏
  • 举报
回复
用好VC6调试工具,做编程高手!

http://blog.sina.com.cn/s/blog_4e5dcb9701000cfz.html
skyclear81 2007-09-25
  • 打赏
  • 举报
回复
VS2005里有防止缓冲区溢出,通过编译时候插入_checkesp,但是用VC6编译的工程转到VS2005下编译有n多error,郁闷中...
loops 2007-09-25
  • 打赏
  • 举报
回复
release下的情况如何?
我记得vc6的debug下每次调用函数,开的栈空间都相当得大,距离父函数的栈顶大约填充了0x40h的0xccccccc,所以你的数组或者指针越界应当不是越出1个,2个的问题,可能是比较夸张的一大片。
Torch009 2007-09-24
  • 打赏
  • 举报
回复
跟踪再跟踪
masterz 2007-09-24
  • 打赏
  • 举报
回复
比如Intel VTune,他能告诉你每个函数的调用次数--包括库函数和你自己的函数,你把重点放在自己的函数上面,可以找到的。
另外,如果是你的代码破坏了堆栈,还是用调试工具好一些--Boundschecker或者Purify.它能找到你数组越界之类的错误。
ouyh12345 2007-09-24
  • 打赏
  • 举报
回复
排错是很费劲的,通常没有什么快捷的方法。
scq2099yt 2007-09-24
  • 打赏
  • 举报
回复
我也建议用屏蔽代码的手段找到出问题的代码。先大块屏蔽,然后逐渐缩小范围。
skyclear81 2007-09-23
  • 打赏
  • 举报
回复
大家都午睡了吗? 自己再顶一下!
skyclear81 2007-09-23
  • 打赏
  • 举报
回复
这样也许可以,但不是最有效的方法。也不是发贴的初衷...
dyw 2007-09-23
  • 打赏
  • 举报
回复
哈,lz不要急。可以通过屏蔽代码的手段找到出问题的代码。先大块屏蔽,然后逐渐缩小范围。
skyclear81 2007-09-23
  • 打赏
  • 举报
回复
To楼上: 我知道自己的程序有问题,难道还是微软的程序有问题吗?如果一眼能看出的问题,我也不用在发帖子了。
To masterz:非常感谢告诉我用profile工具,但是A,B函数地址不在当前进程内也有用吗?通过统计能知道是从我代码里哪个函数掉进去的?望详细告知,万分感谢!
dyw 2007-09-23
  • 打赏
  • 举报
回复
这说明自己的程序有问题,应首先解决自身问题
shanhqk 2007-09-23
  • 打赏
  • 举报
回复
其实TRACE中的内容也可以输出出来,不管是在代环境的条件下,还是在执行的环境下,但前提是:必须要是在debug下。
shanhqk 2007-09-23
  • 打赏
  • 举报
回复
1.输出错误日志。
2。 环缓冲区:就是定义一个很大的链表,然后往链表中增加程序运行记录(主要一些函数),然后当到一定数量时,删除前100条,然后继续使用,这样可以知道程序是哪里出现了错误。这种方式可以结合vc中debug环境下的一些方法,然后输出出来,当出现错误时,写入文件,然后分析。可以判断出在哪个函数中出现了错误。
dyw 2007-09-23
  • 打赏
  • 举报
回复
记得以前去面试,问的就是堆栈溢出问题,如果是你,你就这么回答?
-----------
难道这不是办法吗?难道回答说你会用什么什么工具,又怎么样发现了问题代码,诸如此类???!!!
难道这个问题不是考察你解决问题的能力吗?写TRACE不是调试程序的方法吗?否则要TRACE何用?

难道不是先找到出错行,然后再分析其堆栈使用问题吗?难道是通过看汇编代码,然后逆向导出错误所在???即使有这样的办法,偶不认为这个办法有什么优点!本来是写代码时就应该注意的问题。

呵呵,说句实话,偶很少碰到堆栈溢出问题,一般在写程序时就已经避免了。一旦发生问题,也有对付办法。写TRACE代码是一个程序员的基本习惯,对于日后代码维护非常有益。偶认为,规范的公司都应要求程序员写TRACE。

堆栈溢出一般有两个可能:
1、函数递归调用;
2、在堆栈上创建大数组。

这两个问题,TRACE一下很快就能找到出错行,也很容易解决。有问问题的时间早解决了。

劝lz一句,培养自己解决问题的能力,而不是执著于自己期望的答案。

另外,看看这个是否有帮助:
http://support.microsoft.com/kb/315937
jsphuang 2007-09-23
  • 打赏
  • 举报
回复
IBM RATIONAL Purify专门用于检查堆栈OVERFLOW或者MEMORY LEAK的,
还有VALGRIND(LINUX 版?)吧,能够检查程序是哪儿出问题。
加载更多回复(12)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧