程序访问内存非法退出,调试core时,却发现#0 0x00000000 in ?? () ,奶奶的,已经加了调试信息了

wxbfly 2005-06-26 10:08:03
打where时出现
#0 0x00000000 in ?? ()

一看eip为0,堆栈也就只有这么一个,这让我怎么搞。
...全文
2134 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxbfly 2005-06-28
  • 打赏
  • 举报
回复
我也想过有这种可能,但没道理堆栈就只有一个啊
wxbfly 2005-06-28
  • 打赏
  • 举报
回复
OK,多谢,结贴给分。
chanteur 2005-06-28
  • 打赏
  • 举报
回复
客气了,大家互相探讨吧。

我的email:lichentao@datangmobile.cn。

nm是GNU命令,不是GDB命令,具体用法看man吧
wxbfly 2005-06-28
  • 打赏
  • 举报
回复
先说我的msn,wxbfly@hotmail.com或qq:37737098
wxbfly 2005-06-28
  • 打赏
  • 举报
回复
呵呵,多谢老兄指点。

我对汇编还算比较熟悉,对c语言的压栈、退栈操作也都比较清楚。确实,在堆栈被破坏时,esp的值应该还是正确的,估计也只有你所说的这个办法。不过我对gdb的操作不是很熟,符号表的获取在我的gdb版本中不知用什么命令,nm不被支持。我的linux版本是slackware 2.4.20,gdb版本是5.2。

另外,请问老兄的联系方式是什么?以后多交流,QQ或msn、email都可以
chanteur 2005-06-28
  • 打赏
  • 举报
回复
一般来说因为局部变量导致堆栈越界的问题比较难查,因为gdb保存的也不是第一现场。

以我的经验来说,首先应该初步估计出问题的流程,然后在该流程中大量加入打印,通过
打印信息缩小排查范围,然后结合代码走读查找BUG。

阅读代码时重点注意,局部变量中的数组大小,以及memset,memcpy类的系统调用,还有就是循环赋值语句。

如果问题无法复现的话,就要碰运气了。
假设局部变量写越界不严重的话,可以手动推导一部分堆栈中的函数调用关系,要求对C语言的压栈过程比较熟悉。

大致上的做法是:
出现SEGV时,查看寄存器esp的值,在根据esp的值打印出堆栈的信息,如果这部分数据不是全零的话,说明堆栈被写越界的太多;否则的话,还是放弃吧。

另一方面要用nm命令把调试目标的符号表取出,最好按地址排序。

接下来,就是手动对比堆栈中的现场和符号表了
wxbfly 2005-06-28
  • 打赏
  • 举报
回复
嗯,有道理。我试了一下,确实是这样。

那么此时该怎么办呢?如何跟踪调试?还有,出现此类情况时,gdb是否能够将没有破坏的部分堆栈显示出来?

还望 chanteur(晓涛) 老兄解答,我再加分。
chanteur 2005-06-28
  • 打赏
  • 举报
回复
不知道楼主说的堆栈只有一个是什么意思。
是多线程的堆栈都看不到了,只能看到一个线程的堆栈;还是指堆栈中只能看到一个函数调用。

如果是后者的话,应该是局部变量写越界吧,GDB显示堆栈调用关系也是从堆栈中读取保存的现场;
如果堆栈已被破坏了,GDB无法得到正确的解析,就只能显示一级函数调用了。
刚才做了一个试验,

#include <stdio.h>
void func()
{
int i[2];
memset(i,0,100);
}
void main()
{
func();
}

用gdb调试,当出现SegV时,堆栈显示为
#0 0x00000000 in ??()
chanteur 2005-06-27
  • 打赏
  • 举报
回复
有没有可能是局部变量写越界,导致堆栈中调用现场被覆盖成0;
退出当前函数调用时跳转到0,同时导致backtrace解析失败。
wxbfly 2005-06-27
  • 打赏
  • 举报
回复
to kaoziji(靠自己):

能不能详细讲解一下?
kaoziji 2005-06-27
  • 打赏
  • 举报
回复
感觉是在程序中 throw exception 后,在main中没有catch。
wxbfly 2005-06-26
  • 打赏
  • 举报
回复
鸡巴晕,发现这里没几人解答我的问题。
wxbfly 2005-06-26
  • 打赏
  • 举报
回复
就是用gdb调试的core文件,但由于程序是在一定情况下才死机的,无法再让程序从头再现一遍,因此只有分析core文件。单步跟踪等操作是实施不了的

那么,只分析core文件没法解决问题吗?
mprogrammer 2005-06-26
  • 打赏
  • 举报
回复
学习用 gdb吧,断点调一下,要不有时候 printf不能打出来程序就 down了
sharkhuang 2005-06-26
  • 打赏
  • 举报
回复
很难回答这个问题!用GDB单步吧

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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